From c151b26da236f353c89113477c4de1424d0067ac Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 12 Jul 2021 10:41:03 -0400 Subject: [PATCH 001/108] Fixes list field decalaration type: allows undefined #134 --- .../src/core/code/SceneCodeDOMBuilder.ts | 2 + tests/workspace/test-typescript/game.js | 56 ++++++++++++++++++- .../scenes/DoubleDinoPrefab.scene | 10 ++++ .../scenes/DoubleDinoPrefab.ts | 5 ++ .../scenes/TestListFieldScene.scene | 38 +++++++++++++ .../scenes/TestListFieldScene.ts | 43 ++++++++++++++ 6 files changed, 151 insertions(+), 3 deletions(-) create mode 100755 tests/workspace/test-typescript/scenes/TestListFieldScene.scene create mode 100755 tests/workspace/test-typescript/scenes/TestListFieldScene.ts diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index 231c079e5..cb498c57a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -188,6 +188,8 @@ namespace phasereditor2d.scene.core.code { listType, list.getScope() === ui.sceneobjects.ObjectScope.PUBLIC); + dom.setAllowUndefined(!this._scene.isPrefabSceneType()); + fields.push(dom); } } diff --git a/tests/workspace/test-typescript/game.js b/tests/workspace/test-typescript/game.js index 34ea8bc87..ac7ac5194 100644 --- a/tests/workspace/test-typescript/game.js +++ b/tests/workspace/test-typescript/game.js @@ -173,14 +173,17 @@ class DoubleDinoPrefab extends Phaser.GameObjects.Container { // dinoRight const dinoRight = new DinoPrefab(scene, 90, 166); this.add(dinoRight); + // lists + const testListInPrefab = [dinoRight, dinoLeft]; // dinoLeft (prefab fields) dinoLeft.emit("prefab-awake"); // dinoRight (prefab fields) dinoRight.emit("prefab-awake"); - // custom definition props - this.ghost = true; this.dinoLeft = dinoLeft; this.dinoRight = dinoRight; + this.testListInPrefab = testListInPrefab; + // custom definition props + this.ghost = true; /* START-USER-CTR-CODE */ // Write your code here. /* END-USER-CTR-CODE */ @@ -209,7 +212,6 @@ class Level extends Phaser.Scene { text_1.setOrigin(0.5, 0); text_1.text = "Phaser 3 + Phaser Editor 2D + TypeScript"; text_1.setStyle({ "fontFamily": "arial", "fontSize": "3em" }); - text_1.setWordWrapWidth(0, false); // dino_1 const dino_1 = new DinoPrefab(this, 186, 160); this.add.existing(dino_1); @@ -247,6 +249,30 @@ class Level extends Phaser.Scene { // You can write more code here // You can write more code here /* START OF COMPILED CODE */ +class TestListFieldScene extends Phaser.Scene { + constructor() { + super("TestListFieldScene"); + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + editorCreate() { + // dino + const dino = this.add.image(337, 193, "dino"); + // lists + const list = [dino]; + this.list = list; + } + /* START-USER-CODE */ + // Write your code here + create() { + this.editorCreate(); + } +} +/* END OF COMPILED CODE */ +// You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ class TestOneObjectScene extends Phaser.Scene { constructor() { super("TestOneObjectScene"); @@ -267,3 +293,27 @@ class TestOneObjectScene extends Phaser.Scene { } /* END OF COMPILED CODE */ // You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ +class TextWordWrapScene extends Phaser.Scene { + constructor() { + super("TextWordWrapScene"); + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + editorCreate() { + // text + const text = this.add.text(114, 110, "", {}); + text.text = "New long text !"; + text.setStyle({ "fontFamily": "arial", "fontSize": "40px" }); + text.setWordWrapWidth(100, true); + } + /* START-USER-CODE */ + // Write your code here + create() { + this.editorCreate(); + } +} +/* END OF COMPILED CODE */ +// You can write more code here diff --git a/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.scene b/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.scene index fc0633ff1..46871b743 100755 --- a/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.scene +++ b/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.scene @@ -39,6 +39,16 @@ "url": "https://phasereditor2d.com", "contentType": "phasereditor2d.core.scene.SceneContentType" }, + "lists": [ + { + "id": "56539516-52f3-45c1-ad1f-2a1a4a013728", + "label": "testListInPrefab", + "objectIds": [ + "b682a48e-e4f2-4cb5-979c-3a1394199491", + "91b97011-4230-4e8b-a7ca-087cd4e834bc" + ] + } + ], "prefabProperties": [ { "name": "ghost", diff --git a/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts b/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts index 6bd902196..47d372259 100755 --- a/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts +++ b/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts @@ -16,6 +16,9 @@ class DoubleDinoPrefab extends Phaser.GameObjects.Container { const dinoRight = new DinoPrefab(scene, 90, 166); this.add(dinoRight); + // lists + const testListInPrefab = [dinoRight, dinoLeft] + // dinoLeft (prefab fields) dinoLeft.emit("prefab-awake"); @@ -24,6 +27,7 @@ class DoubleDinoPrefab extends Phaser.GameObjects.Container { this.dinoLeft = dinoLeft; this.dinoRight = dinoRight; + this.testListInPrefab = testListInPrefab; // custom definition props this.ghost = true; @@ -35,6 +39,7 @@ class DoubleDinoPrefab extends Phaser.GameObjects.Container { private dinoLeft: DinoPrefab; private dinoRight: DinoPrefab; + private testListInPrefab: DinoPrefab[]; /* START-USER-CODE */ diff --git a/tests/workspace/test-typescript/scenes/TestListFieldScene.scene b/tests/workspace/test-typescript/scenes/TestListFieldScene.scene new file mode 100755 index 000000000..9d82d36ef --- /dev/null +++ b/tests/workspace/test-typescript/scenes/TestListFieldScene.scene @@ -0,0 +1,38 @@ +{ + "id": "ace62e16-b3a5-4b59-a23f-6b83152f7164", + "sceneType": "SCENE", + "settings": { + "preloadPackFiles": [], + "createMethodName": "editorCreate", + "sceneKey": "TestListFieldScene", + "compilerOutputLanguage": "TYPE_SCRIPT" + }, + "displayList": [ + { + "type": "Image", + "id": "265d24ae-28ca-444f-bc02-4dd480fbc0a5", + "label": "dino", + "components": [], + "texture": { + "key": "dino" + }, + "x": 337, + "y": 193 + } + ], + "plainObjects": [], + "meta": { + "app": "Phaser Editor 2D - Scene Editor", + "url": "https://phasereditor2d.com", + "contentType": "phasereditor2d.core.scene.SceneContentType" + }, + "lists": [ + { + "id": "9cf3a8c7-01d2-4618-b9af-c3575fa7f8df", + "label": "list", + "objectIds": [ + "265d24ae-28ca-444f-bc02-4dd480fbc0a5" + ] + } + ] +} \ No newline at end of file diff --git a/tests/workspace/test-typescript/scenes/TestListFieldScene.ts b/tests/workspace/test-typescript/scenes/TestListFieldScene.ts new file mode 100755 index 000000000..48b332014 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/TestListFieldScene.ts @@ -0,0 +1,43 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +class TestListFieldScene extends Phaser.Scene { + + constructor() { + super("TestListFieldScene"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + editorCreate() { + + // dino + const dino = this.add.image(337, 193, "dino"); + + // lists + const list = [dino] + + this.list = list; + } + + private list: Phaser.GameObjects.Image[]|undefined; + + /* START-USER-CODE */ + + // Write your code here + + create() { + + this.editorCreate(); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here From 81389e96f1599e84504d68f116c6b221070ed471 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 12 Jul 2021 11:06:26 -0400 Subject: [PATCH 002/108] Fixes local var declaration of an empty list #134 --- .../src/core/code/SceneCodeDOMBuilder.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index cb498c57a..fbea1f995 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -404,7 +404,17 @@ namespace phasereditor2d.scene.core.code { const varname = formatToValidVarName(list.getLabel()); - const dom = new RawCodeDOM(`const ${varname} = [${objectVarnames.join(", ")}]`); + let dom: RawCodeDOM; + const isTsOutput = this._scene.getSettings().compilerOutputLanguage === "TYPE_SCRIPT"; + + if (isTsOutput && objectVarnames.length === 0) { + + dom = new RawCodeDOM(`const ${varname}: Array = [${objectVarnames.join(", ")}]`); + + } else { + + dom = new RawCodeDOM(`const ${varname} = [${objectVarnames.join(", ")}]`); + } body.push(dom); } From 8ab11c30d5be00d654eaa4b7a343e3081287f470 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 12 Jul 2021 11:07:17 -0400 Subject: [PATCH 003/108] #134 Adds test for an empty list. --- tests/workspace/test-typescript/game.js | 2 ++ .../workspace/test-typescript/scenes/TestListFieldScene.scene | 4 ++++ tests/workspace/test-typescript/scenes/TestListFieldScene.ts | 3 +++ 3 files changed, 9 insertions(+) diff --git a/tests/workspace/test-typescript/game.js b/tests/workspace/test-typescript/game.js index ac7ac5194..57a8bf4d3 100644 --- a/tests/workspace/test-typescript/game.js +++ b/tests/workspace/test-typescript/game.js @@ -261,7 +261,9 @@ class TestListFieldScene extends Phaser.Scene { const dino = this.add.image(337, 193, "dino"); // lists const list = [dino]; + const emptyList = []; this.list = list; + this.emptyList = emptyList; } /* START-USER-CODE */ // Write your code here diff --git a/tests/workspace/test-typescript/scenes/TestListFieldScene.scene b/tests/workspace/test-typescript/scenes/TestListFieldScene.scene index 9d82d36ef..09945b876 100755 --- a/tests/workspace/test-typescript/scenes/TestListFieldScene.scene +++ b/tests/workspace/test-typescript/scenes/TestListFieldScene.scene @@ -33,6 +33,10 @@ "objectIds": [ "265d24ae-28ca-444f-bc02-4dd480fbc0a5" ] + }, + { + "id": "c8e01bf2-0cdb-4a22-8c2a-ac7f9e561cf1", + "label": "emptyList" } ] } \ No newline at end of file diff --git a/tests/workspace/test-typescript/scenes/TestListFieldScene.ts b/tests/workspace/test-typescript/scenes/TestListFieldScene.ts index 48b332014..4b7ffaf30 100755 --- a/tests/workspace/test-typescript/scenes/TestListFieldScene.ts +++ b/tests/workspace/test-typescript/scenes/TestListFieldScene.ts @@ -20,11 +20,14 @@ class TestListFieldScene extends Phaser.Scene { // lists const list = [dino] + const emptyList: Array = [] this.list = list; + this.emptyList = emptyList; } private list: Phaser.GameObjects.Image[]|undefined; + private emptyList: Array|undefined; /* START-USER-CODE */ From d2f78c3f7a72865defb538cace88ea051d18731f Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 12 Jul 2021 11:07:25 -0400 Subject: [PATCH 004/108] Update changelog. --- CHANGELOG.MD | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 23533ae86..b5a9032dc 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,5 +1,10 @@ # Change Log +## dev + +* [#134](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/134) Creating a list in the editor results in an initialized array in the generated code. + + ## v3.15.0 - Jul 11, 2021 ### Fixed From 3295d2fda0b91445a0e93b1e1923dc831b0b3ed1 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 12 Jul 2021 11:43:35 -0400 Subject: [PATCH 005/108] #135 Catches Phaser error when a wordWrapWidth value is lower than allowed. --- .../src/ui/sceneobjects/text/TextComponent.ts | 12 +++++++++++- tests/workspace/test-typescript/game.js | 5 +++++ .../test-typescript/scenes/TextWordWrapScene.scene | 14 ++++++++++++++ .../test-typescript/scenes/TextWordWrapScene.ts | 6 ++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/text/TextComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/text/TextComponent.ts index 293d1128f..2f6c2a425 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/text/TextComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/text/TextComponent.ts @@ -258,7 +258,17 @@ namespace phasereditor2d.scene.ui.sceneobjects { tooltip: "phaser:Phaser.GameObjects.Text.setWordWrapWidth(width)", defValue: 0, getValue: obj => obj.style.wordWrapWidth || 0, - setValue: (obj, value) => obj.setWordWrapWidth(value, obj.style.wordWrapUseAdvanced === true) + setValue: (obj, value) => { + + try { + + obj.setWordWrapWidth(value, obj.style.wordWrapUseAdvanced === true) + + } catch (e) { + + alert(e.message); + } + } } static useAdvancedWrap: IProperty = { diff --git a/tests/workspace/test-typescript/game.js b/tests/workspace/test-typescript/game.js index 57a8bf4d3..e8e03a160 100644 --- a/tests/workspace/test-typescript/game.js +++ b/tests/workspace/test-typescript/game.js @@ -310,6 +310,11 @@ class TextWordWrapScene extends Phaser.Scene { text.text = "New long text !"; text.setStyle({ "fontFamily": "arial", "fontSize": "40px" }); text.setWordWrapWidth(100, true); + // text_1 + const text_1 = this.add.text(413, 166, "", {}); + text_1.text = "New text"; + text_1.setStyle({ "fontSize": "80px" }); + text_1.setWordWrapWidth(1, true); } /* START-USER-CODE */ // Write your code here diff --git a/tests/workspace/test-typescript/scenes/TextWordWrapScene.scene b/tests/workspace/test-typescript/scenes/TextWordWrapScene.scene index d5726c02f..c093e4d88 100755 --- a/tests/workspace/test-typescript/scenes/TextWordWrapScene.scene +++ b/tests/workspace/test-typescript/scenes/TextWordWrapScene.scene @@ -22,6 +22,20 @@ "fontSize": "40px", "wordWrapWidth": 100, "wordWrapUseAdvanced": true + }, + { + "type": "Text", + "id": "503dbe20-47c9-4e14-ba7c-ce12e1a6faa2", + "label": "text_1", + "components": [], + "x": 413, + "y": 166, + "originX": 0, + "originY": 0, + "text": "New text", + "fontSize": "80px", + "wordWrapWidth": 1, + "wordWrapUseAdvanced": true } ], "plainObjects": [], diff --git a/tests/workspace/test-typescript/scenes/TextWordWrapScene.ts b/tests/workspace/test-typescript/scenes/TextWordWrapScene.ts index 275c48590..fd8490d33 100755 --- a/tests/workspace/test-typescript/scenes/TextWordWrapScene.ts +++ b/tests/workspace/test-typescript/scenes/TextWordWrapScene.ts @@ -20,6 +20,12 @@ class TextWordWrapScene extends Phaser.Scene { text.text = "New long text !"; text.setStyle({"fontFamily":"arial","fontSize":"40px"}); text.setWordWrapWidth(100, true); + + // text_1 + const text_1 = this.add.text(413, 166, "", {}); + text_1.text = "New text"; + text_1.setStyle({"fontSize":"80px"}); + text_1.setWordWrapWidth(1, true); } /* START-USER-CODE */ From 811a8fe3598e4c74626a1fc7679fd9211ae2642a Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 12 Jul 2021 11:46:26 -0400 Subject: [PATCH 006/108] Update changelog. --- CHANGELOG.MD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index b5a9032dc..f71432281 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -3,7 +3,8 @@ ## dev * [#134](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/134) Creating a list in the editor results in an initialized array in the generated code. - +* [#135](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/135) +Word wrap width does not behave correctly ## v3.15.0 - Jul 11, 2021 From 01db10b7a729dd0ff1d83d6a36359da1475efd8a Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 14 Jul 2021 22:41:59 -0400 Subject: [PATCH 007/108] Blocks view: fixes getting file of `scripts` asset pack items. --- .../plugins/phasereditor2d.pack/src/core/AssetPackItem.ts | 5 +++++ .../src/ui/viewers/AssetPackGrouping.ts | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.pack/src/core/AssetPackItem.ts b/source/editor/plugins/phasereditor2d.pack/src/core/AssetPackItem.ts index 1800cb082..7004762f0 100644 --- a/source/editor/plugins/phasereditor2d.pack/src/core/AssetPackItem.ts +++ b/source/editor/plugins/phasereditor2d.pack/src/core/AssetPackItem.ts @@ -16,6 +16,11 @@ namespace phasereditor2d.pack.core { getFileFromAssetUrl(url: string) { + if (!url) { + + return undefined; + } + return AssetPackUtils.getFileFromPackUrl(this.getPack(), url); } diff --git a/source/editor/plugins/phasereditor2d.pack/src/ui/viewers/AssetPackGrouping.ts b/source/editor/plugins/phasereditor2d.pack/src/ui/viewers/AssetPackGrouping.ts index bfa9f37d9..ba2b9774c 100644 --- a/source/editor/plugins/phasereditor2d.pack/src/ui/viewers/AssetPackGrouping.ts +++ b/source/editor/plugins/phasereditor2d.pack/src/ui/viewers/AssetPackGrouping.ts @@ -35,7 +35,12 @@ namespace phasereditor2d.pack.ui.viewers { const data = item.getData(); - let file = item.getFileFromAssetUrl(data.url); + let file: colibri.core.io.FilePath; + + if (typeof data.url === "string") { + + file = item.getFileFromAssetUrl(data.url); + } if (!file) { From 8059d6a1e9f62fb28499b9c3943c4332b4c95026 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 16 Jul 2021 15:11:33 -0400 Subject: [PATCH 008/108] Generates custom definition props after user-ctr-code #136 --- .../src/core/code/ClassDeclCodeDOM.ts | 7 +++++- .../core/code/JavaScriptUnitCodeGenerator.ts | 15 ++++++++--- .../code/{RawCodeCode.ts => RawCodeDOM.ts} | 0 .../src/core/code/SceneCodeDOMBuilder.ts | 12 +++++++-- .../src/core/code/UserSectionCodeDOM.ts | 4 +-- .../UserComponentCodeDOMBuilder.ts | 5 +++- .../test-typescript/components/Tint.ts | 6 ++--- tests/workspace/test-typescript/game.js | 25 +++++++------------ .../test-typescript/scenes/DinoPrefab.ts | 19 +++----------- .../scenes/DoubleDinoPrefab.ts | 6 ++--- .../scenes/TextWordWrapScene.scene | 10 +++----- .../scenes/TextWordWrapScene.ts | 5 ++-- 12 files changed, 59 insertions(+), 55 deletions(-) rename source/editor/plugins/phasereditor2d.scene/src/core/code/{RawCodeCode.ts => RawCodeDOM.ts} (100%) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/ClassDeclCodeDOM.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/ClassDeclCodeDOM.ts index af6701dd1..a87011bd2 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/ClassDeclCodeDOM.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/ClassDeclCodeDOM.ts @@ -5,7 +5,7 @@ namespace phasereditor2d.scene.core.code { export class ClassDeclCodeDOM extends MemberDeclCodeDOM { private _exportClass: boolean; - private _body: MemberDeclCodeDOM[]; + private _body: Array; private _constructor: MethodDeclCodeDOM; private _superClass: string; @@ -28,22 +28,27 @@ namespace phasereditor2d.scene.core.code { } getConstructor() { + return this._constructor; } setConstructor(constructor: MethodDeclCodeDOM) { + this._constructor = constructor; } getSuperClass() { + return this._superClass; } setSuperClass(superClass: string) { + this._superClass = superClass; } getBody() { + return this._body; } } diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/JavaScriptUnitCodeGenerator.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/JavaScriptUnitCodeGenerator.ts index e0c3597ab..039578471 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/JavaScriptUnitCodeGenerator.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/JavaScriptUnitCodeGenerator.ts @@ -113,7 +113,7 @@ namespace phasereditor2d.scene.core.code { if (memberDecl instanceof UserSectionCodeDOM) { - this.section(memberDecl.getOpenTag(), memberDecl.getCloseTag(), memberDecl.getDefaultContent()); + this.generateSection(memberDecl); } } @@ -193,8 +193,8 @@ namespace phasereditor2d.scene.core.code { // I comment this because fields are init as class fields // this.generateFieldInitInConstructor(classDecl, methodDecl); - this.line(); - this.section("/* START-USER-CTR-CODE */", "/* END-USER-CTR-CODE */", "\n\t\t// Write your code here.\n\t\t"); + // this.line(); + // this.section("/* START-USER-CTR-CODE */", "/* END-USER-CTR-CODE */", "\n\t\t// Write your code here.\n\t\t"); } this.closeIndent("}"); @@ -275,9 +275,18 @@ namespace phasereditor2d.scene.core.code { } else if (instr instanceof AssignPropertyCodeDOM) { this.generateAssignProperty(instr); + + } else if (instr instanceof UserSectionCodeDOM) { + + this.generateSection(instr); } } + private generateSection(section: UserSectionCodeDOM) { + + this.section(section.getOpenTag(), section.getCloseTag(), section.getDefaultContent()); + } + private generateAssignProperty(assign: AssignPropertyCodeDOM) { this.generateTypeAnnotation(assign); diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/RawCodeCode.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/RawCodeDOM.ts similarity index 100% rename from source/editor/plugins/phasereditor2d.scene/src/core/code/RawCodeCode.ts rename to source/editor/plugins/phasereditor2d.scene/src/core/code/RawCodeDOM.ts diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index fbea1f995..14b71c047 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -297,6 +297,9 @@ namespace phasereditor2d.scene.core.code { this.addFieldInitCode(body); + body.push(new RawCodeDOM("")); + body.push(new UserSectionCodeDOM("/* START-USER-CTR-CODE */", "/* END-USER-CTR-CODE */", "\n\t\t// Write your code here.\n\t\t")) + this.buildCustomPropertiesInit(body); return ctrDecl; @@ -322,7 +325,7 @@ namespace phasereditor2d.scene.core.code { if (assignDomList.length > 0) { - body.push(new code.RawCodeDOM("")); + body.push(new code.RawCodeDOM("\n")); body.push(new code.RawCodeDOM("// custom definition props")); } @@ -697,7 +700,12 @@ namespace phasereditor2d.scene.core.code { superCall.argLiteral(sceneKey); - methodDecl.getBody().push(superCall); + const body = methodDecl.getBody(); + + body.push(superCall); + + body.push(new RawCodeDOM("")); + body.push(new UserSectionCodeDOM("/* START-USER-CTR-CODE */", "/* END-USER-CTR-CODE */", "\n\t\t// Write your code here.\n\t\t")) return methodDecl; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/UserSectionCodeDOM.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/UserSectionCodeDOM.ts index 745b93b4d..4fea375ea 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/UserSectionCodeDOM.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/UserSectionCodeDOM.ts @@ -1,13 +1,13 @@ namespace phasereditor2d.scene.core.code { - export class UserSectionCodeDOM extends MemberDeclCodeDOM { + export class UserSectionCodeDOM extends CodeDOM { private _openTag: string; private _closeTag: string; private _defaultContent: string; constructor(openTag: string, closeTag: string, userContent: string) { - super(""); + super(); this._openTag = openTag; this._closeTag = closeTag; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentCodeDOMBuilder.ts index 82ed85e74..88fe74cd3 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentCodeDOMBuilder.ts @@ -96,6 +96,9 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { : `gameObject["__${clsDom.getName()}"] = this;`); body.push(setCompDom); + body.push(new code.RawCodeDOM("")); + body.push(new code.UserSectionCodeDOM("/* START-USER-CTR-CODE */", "/* END-USER-CTR-CODE */", "\n\t\t// Write your code here.\n\t\t")) + this.buildCustomPropertiesInit(body); clsDom.getBody().push(new code.UserSectionCodeDOM( @@ -124,7 +127,7 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { if (assignDomList.length > 0) { - body.push(new code.RawCodeDOM("")); + body.push(new code.RawCodeDOM("\n")); body.push(new code.RawCodeDOM("// custom definition props")); } diff --git a/tests/workspace/test-typescript/components/Tint.ts b/tests/workspace/test-typescript/components/Tint.ts index c5af2c759..677d2cf12 100755 --- a/tests/workspace/test-typescript/components/Tint.ts +++ b/tests/workspace/test-typescript/components/Tint.ts @@ -11,12 +11,12 @@ class Tint extends UserComponent { this.gameObject = gameObject; (gameObject as any)["__Tint"] = this; - // custom definition props - this.tint = "red"; - /* START-USER-CTR-CODE */ // Write your code here. /* END-USER-CTR-CODE */ + + // custom definition props + this.tint = "red"; } static getComponent(gameObject: Phaser.GameObjects.Image): Tint { diff --git a/tests/workspace/test-typescript/game.js b/tests/workspace/test-typescript/game.js index e8e03a160..42aed11e4 100644 --- a/tests/workspace/test-typescript/game.js +++ b/tests/workspace/test-typescript/game.js @@ -101,11 +101,11 @@ class Tint extends UserComponent { super(gameObject); this.gameObject = gameObject; gameObject["__Tint"] = this; - // custom definition props - this.tint = "red"; /* START-USER-CTR-CODE */ // Write your code here. /* END-USER-CTR-CODE */ + // custom definition props + this.tint = "red"; } static getComponent(gameObject) { return gameObject["__Tint"]; @@ -133,17 +133,11 @@ class DinoPrefab extends Phaser.GameObjects.Image { constructor(scene, x, y, texture, frame) { super(scene, x, y, texture || "dino", frame); this.rotating = false; - // custom definition props - this.origin = "top"; /* START-USER-CTR-CODE */ - this.once("prefab-awake", () => { - if (this.rotating) { - this.scene.events.on("update", () => { - this.angle += 1; - }); - } - }); + // Write your code here. /* END-USER-CTR-CODE */ + // custom definition props + this.origin = "top"; } /* START-USER-CODE */ set origin(origin) { @@ -182,11 +176,11 @@ class DoubleDinoPrefab extends Phaser.GameObjects.Container { this.dinoLeft = dinoLeft; this.dinoRight = dinoRight; this.testListInPrefab = testListInPrefab; - // custom definition props - this.ghost = true; /* START-USER-CTR-CODE */ // Write your code here. /* END-USER-CTR-CODE */ + // custom definition props + this.ghost = true; } /* START-USER-CODE */ set ghost(ghost) { @@ -309,12 +303,11 @@ class TextWordWrapScene extends Phaser.Scene { const text = this.add.text(114, 110, "", {}); text.text = "New long text !"; text.setStyle({ "fontFamily": "arial", "fontSize": "40px" }); - text.setWordWrapWidth(100, true); + text.setWordWrapWidth(60, true); // text_1 - const text_1 = this.add.text(413, 166, "", {}); + const text_1 = this.add.text(274, 142, "", {}); text_1.text = "New text"; text_1.setStyle({ "fontSize": "80px" }); - text_1.setWordWrapWidth(1, true); } /* START-USER-CODE */ // Write your code here diff --git a/tests/workspace/test-typescript/scenes/DinoPrefab.ts b/tests/workspace/test-typescript/scenes/DinoPrefab.ts index 8fbb8d3cb..ee6ed3067 100755 --- a/tests/workspace/test-typescript/scenes/DinoPrefab.ts +++ b/tests/workspace/test-typescript/scenes/DinoPrefab.ts @@ -8,23 +8,12 @@ class DinoPrefab extends Phaser.GameObjects.Image { constructor(scene: Phaser.Scene, x: number, y: number, texture?: string, frame?: number | string) { super(scene, x, y, texture || "dino", frame); - // custom definition props - this.origin = "top"; - /* START-USER-CTR-CODE */ - - this.once("prefab-awake", () => { - - if (this.rotating) { - - this.scene.events.on("update", () => { - - this.angle += 1; - }); - } - }); - + // Write your code here. /* END-USER-CTR-CODE */ + + // custom definition props + this.origin = "top"; } public rotating: boolean = false; diff --git a/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts b/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts index 47d372259..d98eebc30 100755 --- a/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts +++ b/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts @@ -29,12 +29,12 @@ class DoubleDinoPrefab extends Phaser.GameObjects.Container { this.dinoRight = dinoRight; this.testListInPrefab = testListInPrefab; - // custom definition props - this.ghost = true; - /* START-USER-CTR-CODE */ // Write your code here. /* END-USER-CTR-CODE */ + + // custom definition props + this.ghost = true; } private dinoLeft: DinoPrefab; diff --git a/tests/workspace/test-typescript/scenes/TextWordWrapScene.scene b/tests/workspace/test-typescript/scenes/TextWordWrapScene.scene index c093e4d88..8839a7744 100755 --- a/tests/workspace/test-typescript/scenes/TextWordWrapScene.scene +++ b/tests/workspace/test-typescript/scenes/TextWordWrapScene.scene @@ -20,7 +20,7 @@ "text": "New long text !", "fontFamily": "arial", "fontSize": "40px", - "wordWrapWidth": 100, + "wordWrapWidth": 60, "wordWrapUseAdvanced": true }, { @@ -28,14 +28,12 @@ "id": "503dbe20-47c9-4e14-ba7c-ce12e1a6faa2", "label": "text_1", "components": [], - "x": 413, - "y": 166, + "x": 274, + "y": 142, "originX": 0, "originY": 0, "text": "New text", - "fontSize": "80px", - "wordWrapWidth": 1, - "wordWrapUseAdvanced": true + "fontSize": "80px" } ], "plainObjects": [], diff --git a/tests/workspace/test-typescript/scenes/TextWordWrapScene.ts b/tests/workspace/test-typescript/scenes/TextWordWrapScene.ts index fd8490d33..d37ea2150 100755 --- a/tests/workspace/test-typescript/scenes/TextWordWrapScene.ts +++ b/tests/workspace/test-typescript/scenes/TextWordWrapScene.ts @@ -19,13 +19,12 @@ class TextWordWrapScene extends Phaser.Scene { const text = this.add.text(114, 110, "", {}); text.text = "New long text !"; text.setStyle({"fontFamily":"arial","fontSize":"40px"}); - text.setWordWrapWidth(100, true); + text.setWordWrapWidth(60, true); // text_1 - const text_1 = this.add.text(413, 166, "", {}); + const text_1 = this.add.text(274, 142, "", {}); text_1.text = "New text"; text_1.setStyle({"fontSize":"80px"}); - text_1.setWordWrapWidth(1, true); } /* START-USER-CODE */ From 17707405e99bc2e73907762ecfd703ba5e0d1fd3 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 16 Jul 2021 15:12:46 -0400 Subject: [PATCH 009/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index f71432281..7af6a8332 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -5,6 +5,7 @@ * [#134](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/134) Creating a list in the editor results in an initialized array in the generated code. * [#135](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/135) Word wrap width does not behave correctly +* [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: constructor ordering of custom definition props and START-USER-CTR-CODE. ## v3.15.0 - Jul 11, 2021 From d9380a3f493937657969e9c292e99f4f5e26d361 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 16 Jul 2021 16:51:09 -0400 Subject: [PATCH 010/108] Prefabs: `generateAwakeEvent` and `generateAwakeHandler` #136 --- CHANGELOG.MD | 1 + .../src/core/code/SceneCodeDOMBuilder.ts | 12 +++ .../src/core/json/SceneFinder.ts | 18 ++++- .../src/core/json/SceneSettings.ts | 6 ++ .../dialogs/NewPrefabFileDialogExtension.ts | 2 + .../properties/PrefabCompilerSection.ts | 42 ++++++++++ .../properties/SceneEditorPopertyProvider.ts | 1 + .../sceneobjects/GameObjectEditorSupport.ts | 17 ++++ .../object/PrefabUserPropertyComponent.ts | 11 ++- tests/workspace/test-typescript/game.js | 80 +++++++++++++++++-- .../test-typescript/scenes/Level.scene | 10 ++- .../workspace/test-typescript/scenes/Level.ts | 18 +++-- .../scenes/prefabAwake/PrefabAwakeTest.scene | 34 ++++++++ .../scenes/prefabAwake/PrefabAwakeTest.ts | 45 +++++++++++ .../prefabAwake/WithAwakeEventPrefab.scene | 30 +++++++ .../prefabAwake/WithAwakeEventPrefab.ts | 35 ++++++++ .../prefabAwake/WithoutAwakeEventPrefab.scene | 34 ++++++++ .../prefabAwake/WithoutAwakeEventPrefab.ts | 29 +++++++ 18 files changed, 409 insertions(+), 16 deletions(-) create mode 100644 source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/PrefabCompilerSection.ts create mode 100755 tests/workspace/test-typescript/scenes/prefabAwake/PrefabAwakeTest.scene create mode 100755 tests/workspace/test-typescript/scenes/prefabAwake/PrefabAwakeTest.ts create mode 100755 tests/workspace/test-typescript/scenes/prefabAwake/WithAwakeEventPrefab.scene create mode 100755 tests/workspace/test-typescript/scenes/prefabAwake/WithAwakeEventPrefab.ts create mode 100755 tests/workspace/test-typescript/scenes/prefabAwake/WithoutAwakeEventPrefab.scene create mode 100755 tests/workspace/test-typescript/scenes/prefabAwake/WithoutAwakeEventPrefab.ts diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 7af6a8332..f2f4d636c 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -6,6 +6,7 @@ * [#135](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/135) Word wrap width does not behave correctly * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: constructor ordering of custom definition props and START-USER-CTR-CODE. +* [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: `generateAwakeEvent` and `generateAwakeHandler`. ## v3.15.0 - Jul 11, 2021 diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index 14b71c047..d92bef87f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -269,6 +269,18 @@ namespace phasereditor2d.scene.core.code { body.push(new RawCodeDOM("")); } + { + // prefab awake handler + const settings = this._scene.getSettings(); + + if (settings.generateAwakeEvent && settings.generateAwakeHandler) { + + body.push(new RawCodeDOM("// awake handler")); + body.push(new RawCodeDOM("this.once(\"prefab-awake\", () => this.awake());")); + body.push(new RawCodeDOM("")); + } + } + const lazyStatements: CodeDOM[] = []; const result = this.buildSetObjectProperties({ diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts index b9400b64e..2d88f1ced 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts @@ -43,6 +43,7 @@ namespace phasereditor2d.scene.core.json { private _prefabObjectId_ObjectData_Map: Map; private _sceneFilename_Data_Map: Map; + private _sceneFilename_Settings_Map: Map; private _prefabId_File_Map: Map; private _sceneFiles: io.FilePath[]; private _prefabFiles: io.FilePath[]; @@ -55,6 +56,7 @@ namespace phasereditor2d.scene.core.json { this._prefabObjectId_ObjectData_Map = new Map(); this._sceneFilename_Data_Map = new Map(); + this._sceneFilename_Settings_Map = new Map(); this._prefabId_File_Map = new Map(); this._sceneFiles = []; this._prefabFiles = []; @@ -178,6 +180,7 @@ namespace phasereditor2d.scene.core.json { const sceneIdSet = new Set(); const prefabObjectId_ObjectData_Map = new Map(); const sceneFilename_Data_Map = new Map(); + const sceneFilename_Settings_Map = new Map(); const prefabId_File_Map = new Map(); const sceneFiles = []; const prefabFiles = []; @@ -195,6 +198,11 @@ namespace phasereditor2d.scene.core.json { const data = JSON.parse(content) as ISceneData; sceneFilename_Data_Map.set(file.getFullName(), data); + { + const settings = new SceneSettings(); + settings.readJSON(data.settings); + sceneFilename_Settings_Map.set(file.getFullName(), settings); + } if (data.id) { @@ -235,6 +243,7 @@ namespace phasereditor2d.scene.core.json { this._prefabObjectId_ObjectData_Map = prefabObjectId_ObjectData_Map; this._sceneFilename_Data_Map = sceneFilename_Data_Map; + this._sceneFilename_Settings_Map = sceneFilename_Settings_Map; this._prefabId_File_Map = prefabId_File_Map; this._sceneFiles = sceneFiles; this._prefabFiles = prefabFiles; @@ -337,6 +346,11 @@ namespace phasereditor2d.scene.core.json { return this._sceneFilename_Data_Map.get(file.getFullName()); } + getSceneSettings(file: io.FilePath) { + + return this._sceneFilename_Settings_Map.get(file.getFullName()); + } + getScenePhaserType(file: io.FilePath) { const data = this.getSceneData(file); @@ -374,12 +388,12 @@ namespace phasereditor2d.scene.core.json { console.log("Scene Finder debug:") - for(const prefab of this._prefabFiles) { + for (const prefab of this._prefabFiles) { console.log("Prefab file '" + prefab.getFullName() + "'"); } - for(const id of this._prefabObjectId_ObjectData_Map.keys()) { + for (const id of this._prefabObjectId_ObjectData_Map.keys()) { console.log("Prefab data " + id + ":"); console.log(this._prefabObjectId_ObjectData_Map.get(id)); diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneSettings.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneSettings.ts index 3f3269786..49287b312 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneSettings.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneSettings.ts @@ -20,6 +20,8 @@ namespace phasereditor2d.scene.core.json { public sceneKey = "", public exportClass = false, public autoImport = false, + public generateAwakeEvent = true, + public generateAwakeHandler = false, public compilerOutputLanguage = SourceLang.JAVA_SCRIPT, public scopeBlocksToFolder: boolean = false, public borderX = 0, @@ -43,6 +45,8 @@ namespace phasereditor2d.scene.core.json { write(data, "onlyGenerateMethods", this.onlyGenerateMethods, false); write(data, "exportClass", this.exportClass, false); write(data, "autoImport", this.autoImport, false); + write(data, "generateAwakeEvent", this.generateAwakeEvent, true); + write(data, "generateAwakeHandler", this.generateAwakeHandler, false); write(data, "superClassName", this.superClassName, ""); write(data, "preloadMethodName", this.preloadMethodName, "preload"); write(data, "preloadPackFiles", this.preloadPackFiles, []); @@ -69,6 +73,8 @@ namespace phasereditor2d.scene.core.json { this.onlyGenerateMethods = read(data, "onlyGenerateMethods", false); this.exportClass = read(data, "exportClass", false); this.autoImport = read(data, "autoImport", false); + this.generateAwakeEvent = read(data, "generateAwakeEvent", true); + this.generateAwakeHandler = read(data, "generateAwakeHandler", false); this.superClassName = read(data, "superClassName", ""); this.preloadMethodName = read(data, "preloadMethodName", "preload"); this.preloadPackFiles = read(data, "preloadPackFiles", []); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/dialogs/NewPrefabFileDialogExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/dialogs/NewPrefabFileDialogExtension.ts index cc1c15002..ae0cdfe8e 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/dialogs/NewPrefabFileDialogExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/dialogs/NewPrefabFileDialogExtension.ts @@ -16,6 +16,8 @@ namespace phasereditor2d.scene.ui.dialogs { compilerOutputLanguage: settings.compilerOutputLanguage, exportClass: settings.exportClass, autoImport: settings.autoImport, + generateAwakeEvent: false, + generateAwakeHandler: false, compilerInsertSpaces: settings.compilerInsertSpaces, compilerTabSize: settings.compilerTabSize, borderWidth: settings.borderWidth, diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/PrefabCompilerSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/PrefabCompilerSection.ts new file mode 100644 index 000000000..04e662c24 --- /dev/null +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/PrefabCompilerSection.ts @@ -0,0 +1,42 @@ +namespace phasereditor2d.scene.ui.editor.properties { + + import io = colibri.core.io; + import controls = colibri.ui.controls; + + export class PrefabCompilerSection extends SceneSection { + + constructor(page: controls.properties.PropertyPage) { + super( + page, "phasereditor2d.scene.ui.editor.properties.PrefabCompilerSection", + "Compiler Prefab Settings", false, true); + } + + getSectionHelpPath() { + // TODO + return "scene-editor/scene-compiler-scene-settings.html"; + } + + createForm(parent: HTMLDivElement) { + + const comp = this.createGridElement(parent, 3); + + comp.style.gridTemplateColumns = "auto 1fr"; + + this.createBooleanField(comp, "generateAwakeEvent", + + this.createLabel(comp, "Generate Awake Event", + "Generate the firing of the 'prefab-awake' event." + + "\nChanging this value requires a build of all scenes referencing this prefab. (Ctrl+Alt+B).")); + + this.createBooleanField(comp, "generateAwakeHandler", + + this.createLabel(comp, "Generate Awake Handler", + "Generate a handler for the 'prefab-awake' event.")); + } + + canEdit(obj: any, n: number): boolean { + + return obj instanceof Scene && obj.getSceneType() === core.json.SceneType.PREFAB; + } + } +} \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/SceneEditorPopertyProvider.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/SceneEditorPopertyProvider.ts index 07228c820..b56f806ea 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/SceneEditorPopertyProvider.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/SceneEditorPopertyProvider.ts @@ -32,6 +32,7 @@ namespace phasereditor2d.scene.ui.editor.properties { new BorderSection(page), new CompilerSection(page), new SceneCompilerSection(page), + new PrefabCompilerSection(page), new PrefabPropertiesSection(page), ); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 4156f5c84..c281f046c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -477,6 +477,23 @@ namespace phasereditor2d.scene.ui.sceneobjects { return null; } + getPrefabSettings() { + + if (this._prefabId) { + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + const file = finder.getPrefabFile(this._prefabId); + + if (file) { + + return finder.getSceneSettings(file); + } + } + + return null; + } + getPrefabSerializer() { const data = this.getPrefabData(); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts index a26796c2d..a99e61674 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts @@ -115,10 +115,15 @@ namespace phasereditor2d.scene.ui.sceneobjects { if (this.getObject().getEditorSupport().isPrefabInstance()) { - const stmt = new core.code.MethodCallCodeDOM("emit", args.objectVarName); - stmt.argLiteral("prefab-awake"); + const settings = this.getObject().getEditorSupport().getPrefabSettings(); - args.lazyStatements.push(stmt); + if (settings && settings.generateAwakeEvent) { + + const stmt = new core.code.MethodCallCodeDOM("emit", args.objectVarName); + stmt.argLiteral("prefab-awake"); + + args.lazyStatements.push(stmt); + } } args.statements = temp; diff --git a/tests/workspace/test-typescript/game.js b/tests/workspace/test-typescript/game.js index 42aed11e4..8f7f5a1ee 100644 --- a/tests/workspace/test-typescript/game.js +++ b/tests/workspace/test-typescript/game.js @@ -209,9 +209,13 @@ class Level extends Phaser.Scene { // dino_1 const dino_1 = new DinoPrefab(this, 186, 160); this.add.existing(dino_1); - // container_1 - const container_1 = new DoubleDinoPrefab(this, 666, 35); - this.add.existing(container_1); + // doubleDinoPrefab + const doubleDinoPrefab = new DoubleDinoPrefab(this, 666, 35); + this.add.existing(doubleDinoPrefab); + // withAwakeEventPrefab + const withAwakeEventPrefab = new WithAwakeEventPrefab(this, 415, 505); + this.add.existing(withAwakeEventPrefab); + withAwakeEventPrefab.setOrigin(0.5, 0.5); // dino (components) const dinoPushOnClick = new PushOnClick(dino); dinoPushOnClick.pushScale = 0.8; @@ -224,8 +228,10 @@ class Level extends Phaser.Scene { const dino_1Tint = new Tint(dino_1); dino_1Tint.tint = "blue"; dino_1.emit("components-awake"); - // container_1 (prefab fields) - container_1.emit("prefab-awake"); + // doubleDinoPrefab (prefab fields) + doubleDinoPrefab.emit("prefab-awake"); + // withAwakeEventPrefab (prefab fields) + withAwakeEventPrefab.emit("prefab-awake"); this.dino = dino; } /* START-USER-CODE */ @@ -317,3 +323,67 @@ class TextWordWrapScene extends Phaser.Scene { } /* END OF COMPILED CODE */ // You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ +class PrefabAwakeTest extends Phaser.Scene { + constructor() { + super("PrefabAwakeTest"); + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + editorCreate() { + // withoutAwakeEventPrefab + const withoutAwakeEventPrefab = new WithoutAwakeEventPrefab(this, 59, 79); + this.add.existing(withoutAwakeEventPrefab); + // withAwakeEventPrefab + const withAwakeEventPrefab = new WithAwakeEventPrefab(this, 99, 197); + this.add.existing(withAwakeEventPrefab); + withAwakeEventPrefab.setOrigin(0.5, 0.5); + // withAwakeEventPrefab (prefab fields) + withAwakeEventPrefab.emit("prefab-awake"); + } + /* START-USER-CODE */ + // Write your code here + create() { + this.editorCreate(); + } +} +/* END OF COMPILED CODE */ +// You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ +class WithAwakeEventPrefab extends Phaser.GameObjects.Text { + constructor(scene, x, y) { + super(scene, x, y, "", {}); + // awake handler + this.once("prefab-awake", () => this.awake()); + this.setOrigin(0.5, 0.5); + this.text = "Prefab with awake event"; + this.setStyle({ "backgroundColor": "#db68f7ff", "fontSize": "40px" }); + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + /* START-USER-CODE */ + awake() { + this.angle = -10; + } +} +/* END OF COMPILED CODE */ +// You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ +class WithoutAwakeEventPrefab extends Phaser.GameObjects.Text { + constructor(scene, x, y) { + super(scene, x, y, "", {}); + this.text = "Prefab Without Awake Event"; + this.setStyle({ "backgroundColor": "#1e87a1ff", "fontSize": "40px" }); + this.setPadding({ "left": 10, "top": 10, "right": 10, "bottom": 10 }); + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } +} +/* END OF COMPILED CODE */ +// You can write more code here diff --git a/tests/workspace/test-typescript/scenes/Level.scene b/tests/workspace/test-typescript/scenes/Level.scene index 5f1e91e35..415c4cff8 100755 --- a/tests/workspace/test-typescript/scenes/Level.scene +++ b/tests/workspace/test-typescript/scenes/Level.scene @@ -54,10 +54,18 @@ { "prefabId": "f09cbbd7-3019-4f77-b666-386ed906ee51", "id": "66e3a017-d561-4cb8-a3fb-e8e50765ccc8", - "label": "container_1", + "label": "doubleDinoPrefab", "components": [], "x": 666, "y": 35 + }, + { + "prefabId": "67273ad8-1b79-4edb-ac29-ca5abefe6603", + "id": "2dbdc536-0cee-4d90-b0b2-f474c7015fe6", + "label": "withAwakeEventPrefab", + "components": [], + "x": 415, + "y": 505 } ], "plainObjects": [], diff --git a/tests/workspace/test-typescript/scenes/Level.ts b/tests/workspace/test-typescript/scenes/Level.ts index c896526f8..f5e792d99 100755 --- a/tests/workspace/test-typescript/scenes/Level.ts +++ b/tests/workspace/test-typescript/scenes/Level.ts @@ -28,9 +28,14 @@ class Level extends Phaser.Scene { const dino_1 = new DinoPrefab(this, 186, 160); this.add.existing(dino_1); - // container_1 - const container_1 = new DoubleDinoPrefab(this, 666, 35); - this.add.existing(container_1); + // doubleDinoPrefab + const doubleDinoPrefab = new DoubleDinoPrefab(this, 666, 35); + this.add.existing(doubleDinoPrefab); + + // withAwakeEventPrefab + const withAwakeEventPrefab = new WithAwakeEventPrefab(this, 415, 505); + this.add.existing(withAwakeEventPrefab); + withAwakeEventPrefab.setOrigin(0.5, 0.5); // dino (components) const dinoPushOnClick = new PushOnClick(dino); @@ -47,8 +52,11 @@ class Level extends Phaser.Scene { dino_1Tint.tint = "blue"; dino_1.emit("components-awake"); - // container_1 (prefab fields) - container_1.emit("prefab-awake"); + // doubleDinoPrefab (prefab fields) + doubleDinoPrefab.emit("prefab-awake"); + + // withAwakeEventPrefab (prefab fields) + withAwakeEventPrefab.emit("prefab-awake"); this.dino = dino; } diff --git a/tests/workspace/test-typescript/scenes/prefabAwake/PrefabAwakeTest.scene b/tests/workspace/test-typescript/scenes/prefabAwake/PrefabAwakeTest.scene new file mode 100755 index 000000000..bc4eae8f6 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/prefabAwake/PrefabAwakeTest.scene @@ -0,0 +1,34 @@ +{ + "id": "1aa55bca-2112-4889-a67d-feb47b5d89e7", + "sceneType": "SCENE", + "settings": { + "preloadPackFiles": [], + "createMethodName": "editorCreate", + "sceneKey": "PrefabAwakeTest", + "compilerOutputLanguage": "TYPE_SCRIPT" + }, + "displayList": [ + { + "prefabId": "2b173e75-6baa-445d-9ac4-91c85eef7dda", + "id": "fed884bd-0d94-4601-ac02-0acdfa5947cc", + "label": "withoutAwakeEventPrefab", + "components": [], + "x": 59, + "y": 79 + }, + { + "prefabId": "67273ad8-1b79-4edb-ac29-ca5abefe6603", + "id": "488a1ae4-6a26-4fca-9839-1ca299761ba3", + "label": "withAwakeEventPrefab", + "components": [], + "x": 99, + "y": 197 + } + ], + "plainObjects": [], + "meta": { + "app": "Phaser Editor 2D - Scene Editor", + "url": "https://phasereditor2d.com", + "contentType": "phasereditor2d.core.scene.SceneContentType" + } +} \ No newline at end of file diff --git a/tests/workspace/test-typescript/scenes/prefabAwake/PrefabAwakeTest.ts b/tests/workspace/test-typescript/scenes/prefabAwake/PrefabAwakeTest.ts new file mode 100755 index 000000000..d07464241 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/prefabAwake/PrefabAwakeTest.ts @@ -0,0 +1,45 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +class PrefabAwakeTest extends Phaser.Scene { + + constructor() { + super("PrefabAwakeTest"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + editorCreate() { + + // withoutAwakeEventPrefab + const withoutAwakeEventPrefab = new WithoutAwakeEventPrefab(this, 59, 79); + this.add.existing(withoutAwakeEventPrefab); + + // withAwakeEventPrefab + const withAwakeEventPrefab = new WithAwakeEventPrefab(this, 99, 197); + this.add.existing(withAwakeEventPrefab); + withAwakeEventPrefab.setOrigin(0.5, 0.5); + + // withAwakeEventPrefab (prefab fields) + withAwakeEventPrefab.emit("prefab-awake"); + } + + /* START-USER-CODE */ + + // Write your code here + + create() { + + this.editorCreate(); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/tests/workspace/test-typescript/scenes/prefabAwake/WithAwakeEventPrefab.scene b/tests/workspace/test-typescript/scenes/prefabAwake/WithAwakeEventPrefab.scene new file mode 100755 index 000000000..c4cf72b05 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/prefabAwake/WithAwakeEventPrefab.scene @@ -0,0 +1,30 @@ +{ + "id": "67273ad8-1b79-4edb-ac29-ca5abefe6603", + "sceneType": "PREFAB", + "settings": { + "generateAwakeHandler": true, + "preloadMethodName": "", + "preloadPackFiles": [], + "createMethodName": "", + "compilerOutputLanguage": "TYPE_SCRIPT" + }, + "displayList": [ + { + "type": "Text", + "id": "3f5cf790-f9d4-44f1-a5c9-d114fe9d7945", + "label": "text", + "components": [], + "x": 276.5, + "y": 19, + "text": "Prefab with awake event", + "fontSize": "40px", + "backgroundColor": "#db68f7ff" + } + ], + "plainObjects": [], + "meta": { + "app": "Phaser Editor 2D - Scene Editor", + "url": "https://phasereditor2d.com", + "contentType": "phasereditor2d.core.scene.SceneContentType" + } +} \ No newline at end of file diff --git a/tests/workspace/test-typescript/scenes/prefabAwake/WithAwakeEventPrefab.ts b/tests/workspace/test-typescript/scenes/prefabAwake/WithAwakeEventPrefab.ts new file mode 100755 index 000000000..6aa2ea174 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/prefabAwake/WithAwakeEventPrefab.ts @@ -0,0 +1,35 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +class WithAwakeEventPrefab extends Phaser.GameObjects.Text { + + constructor(scene: Phaser.Scene, x: number, y: number) { + super(scene, x, y, "", {}); + + // awake handler + this.once("prefab-awake", () => this.awake()); + + this.setOrigin(0.5, 0.5); + this.text = "Prefab with awake event"; + this.setStyle({"backgroundColor":"#db68f7ff","fontSize":"40px"}); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /* START-USER-CODE */ + + awake() { + + this.angle = -10; + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/tests/workspace/test-typescript/scenes/prefabAwake/WithoutAwakeEventPrefab.scene b/tests/workspace/test-typescript/scenes/prefabAwake/WithoutAwakeEventPrefab.scene new file mode 100755 index 000000000..dfa1e527b --- /dev/null +++ b/tests/workspace/test-typescript/scenes/prefabAwake/WithoutAwakeEventPrefab.scene @@ -0,0 +1,34 @@ +{ + "id": "2b173e75-6baa-445d-9ac4-91c85eef7dda", + "sceneType": "PREFAB", + "settings": { + "generateAwakeEvent": false, + "preloadMethodName": "", + "preloadPackFiles": [], + "createMethodName": "", + "compilerOutputLanguage": "TYPE_SCRIPT" + }, + "displayList": [ + { + "type": "Text", + "id": "2e4084ed-06b1-4f8b-a5fd-ceb688af2468", + "label": "withoutAwakeEventPrefab", + "components": [], + "originX": 0, + "originY": 0, + "text": "Prefab Without Awake Event", + "paddingLeft": 10, + "paddingTop": 10, + "paddingRight": 10, + "paddingBottom": 10, + "fontSize": "40px", + "backgroundColor": "#1e87a1ff" + } + ], + "plainObjects": [], + "meta": { + "app": "Phaser Editor 2D - Scene Editor", + "url": "https://phasereditor2d.com", + "contentType": "phasereditor2d.core.scene.SceneContentType" + } +} \ No newline at end of file diff --git a/tests/workspace/test-typescript/scenes/prefabAwake/WithoutAwakeEventPrefab.ts b/tests/workspace/test-typescript/scenes/prefabAwake/WithoutAwakeEventPrefab.ts new file mode 100755 index 000000000..6b8029474 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/prefabAwake/WithoutAwakeEventPrefab.ts @@ -0,0 +1,29 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +class WithoutAwakeEventPrefab extends Phaser.GameObjects.Text { + + constructor(scene: Phaser.Scene, x: number, y: number) { + super(scene, x, y, "", {}); + + this.text = "Prefab Without Awake Event"; + this.setStyle({"backgroundColor":"#1e87a1ff","fontSize":"40px"}); + this.setPadding({"left":10,"top":10,"right":10,"bottom":10}); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /* START-USER-CODE */ + + // Write your code here. + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here From ca0d8cc740046dbcebd83283d373291a7d6157ab Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 16 Jul 2021 23:09:02 -0400 Subject: [PATCH 011/108] User component Generate Awake Event #136 --- .../ui/editor/usercomponent/UserComponent.ts | 17 +++- .../usercomponent/UserComponentSection.ts | 3 + .../UserComponentsEditorComponent.ts | 30 +++++- .../components/Behaviors.components | 6 +- tests/workspace/test-typescript/game.js | 96 +++++++++++++++++-- .../test-typescript/scenes/DinoPrefab.scene | 5 +- .../test-typescript/scenes/DinoPrefab.ts | 4 + .../scenes/DoubleDinoPrefab.ts | 6 ++ .../test-typescript/scenes/Level.scene | 7 +- .../workspace/test-typescript/scenes/Level.ts | 18 ++-- .../componentsAwake/AwakeTest.components | 24 +++++ .../componentsAwake/ComponentWithAwake.ts | 32 +++++++ .../componentsAwake/ComponentWithoutAwake.ts | 32 +++++++ .../TestComponentsAwakeEvent.scene | 54 +++++++++++ .../TestComponentsAwakeEvent.ts | 60 ++++++++++++ 15 files changed, 360 insertions(+), 34 deletions(-) create mode 100755 tests/workspace/test-typescript/scenes/componentsAwake/AwakeTest.components create mode 100755 tests/workspace/test-typescript/scenes/componentsAwake/ComponentWithAwake.ts create mode 100755 tests/workspace/test-typescript/scenes/componentsAwake/ComponentWithoutAwake.ts create mode 100755 tests/workspace/test-typescript/scenes/componentsAwake/TestComponentsAwakeEvent.scene create mode 100755 tests/workspace/test-typescript/scenes/componentsAwake/TestComponentsAwakeEvent.ts diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponent.ts index 513522765..154f41d62 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponent.ts @@ -1,7 +1,6 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { import read = colibri.core.json.read; - import write = colibri.core.json.write; export class UserComponent { @@ -9,6 +8,7 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { private _baseClass: string; private _gameObjectType: string; private _properties: sceneobjects.UserProperties; + private _generateAwakeEvent: boolean; constructor(name: string) { @@ -16,6 +16,7 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { this._baseClass = ""; this._gameObjectType = "Phaser.GameObjects.Image"; this._properties = new UserComponentProperties(this); + this._generateAwakeEvent = false; } toJSON(): any { @@ -27,7 +28,8 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { name: this._name, baseClass: this._baseClass, gameObjectType: this._gameObjectType, - properties: propsData + properties: propsData, + generateAwakeEvent: this._generateAwakeEvent }; return data; @@ -39,6 +41,17 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { this._baseClass = read(data, "baseClass", ""); this._gameObjectType = read(data, "gameObjectType", "Phaser.GameObjects.Image"); this._properties.readJSON(data.properties); + this._generateAwakeEvent = read(data, "generateAwakeEvent", true); + } + + isGenerateAwakeEvent() { + + return this._generateAwakeEvent; + } + + setGenerateAwakeEvent(generateAwakeEvent: boolean) { + + this._generateAwakeEvent = generateAwakeEvent; } getName() { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentSection.ts index 002ad284f..2cfcaf754 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentSection.ts @@ -39,6 +39,9 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { "Name of the type of the Game Object that this component can be added on.", () => this.createGameObjectTypeOptions()); this.stringProp(comp, "BaseClass", "Super Class", "Name of the super class of the component. It is optional.", () => this.createSuperClassOptions()); + + this.booleanProp(comp, "GenerateAwakeEvent", "Generate Awake Event", "Generate the 'components-awake' event." + + + " If changed, requires a build of all scenes using this component.") } private createSuperClassOptions(): string[] { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts index 166361286..1ab6e464b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts @@ -286,17 +286,39 @@ namespace phasereditor2d.scene.ui.sceneobjects { } const isScenePrefabObject = this.getObject().getEditorSupport().isScenePrefabObject(); - const hasUserComponents = this._compNames.length > 0 || prefabUserComponents.length > 0; - const emitComponentsAwake = !isScenePrefabObject && hasUserComponents; - if (allPropsStart !== args.lazyStatements.length || emitComponentsAwake) { + // generate the awake event? + + let generateAwakeEvent = false; + + if (!isScenePrefabObject) { + + for (const compName of this._compNames) { + + const result = finder.getUserComponentByName(compName); + generateAwakeEvent = generateAwakeEvent || result.component.isGenerateAwakeEvent(); + } + + if (!generateAwakeEvent) { + + for (const prefabComp of prefabUserComponents) { + + for (const comp of prefabComp.components) { + + generateAwakeEvent = generateAwakeEvent || comp.isGenerateAwakeEvent(); + } + } + } + } + + if (allPropsStart !== args.lazyStatements.length || generateAwakeEvent) { args.lazyStatements.splice(allPropsStart, 0, new code.RawCodeDOM(""), new code.RawCodeDOM(`// ${args.objectVarName} (components)`)); } - if (emitComponentsAwake) { + if (generateAwakeEvent) { const stmt = new code.MethodCallCodeDOM("emit", args.objectVarName); stmt.argLiteral("components-awake"); diff --git a/tests/workspace/test-typescript/components/Behaviors.components b/tests/workspace/test-typescript/components/Behaviors.components index 85c269fc3..c28b6bdf6 100755 --- a/tests/workspace/test-typescript/components/Behaviors.components +++ b/tests/workspace/test-typescript/components/Behaviors.components @@ -15,7 +15,8 @@ "id": "number" } } - ] + ], + "generateAwakeEvent": true }, { "name": "Tint", @@ -37,7 +38,8 @@ ] } } - ] + ], + "generateAwakeEvent": false } ], "meta": { diff --git a/tests/workspace/test-typescript/game.js b/tests/workspace/test-typescript/game.js index 8f7f5a1ee..a1900740e 100644 --- a/tests/workspace/test-typescript/game.js +++ b/tests/workspace/test-typescript/game.js @@ -133,6 +133,9 @@ class DinoPrefab extends Phaser.GameObjects.Image { constructor(scene, x, y, texture, frame) { super(scene, x, y, texture || "dino", frame); this.rotating = false; + // this (components) + new Tint(this); + new PushOnClick(this); /* START-USER-CTR-CODE */ // Write your code here. /* END-USER-CTR-CODE */ @@ -171,8 +174,12 @@ class DoubleDinoPrefab extends Phaser.GameObjects.Container { const testListInPrefab = [dinoRight, dinoLeft]; // dinoLeft (prefab fields) dinoLeft.emit("prefab-awake"); + // dinoLeft (components) + dinoLeft.emit("components-awake"); // dinoRight (prefab fields) dinoRight.emit("prefab-awake"); + // dinoRight (components) + dinoRight.emit("components-awake"); this.dinoLeft = dinoLeft; this.dinoRight = dinoRight; this.testListInPrefab = testListInPrefab; @@ -206,9 +213,9 @@ class Level extends Phaser.Scene { text_1.setOrigin(0.5, 0); text_1.text = "Phaser 3 + Phaser Editor 2D + TypeScript"; text_1.setStyle({ "fontFamily": "arial", "fontSize": "3em" }); - // dino_1 - const dino_1 = new DinoPrefab(this, 186, 160); - this.add.existing(dino_1); + // dinoPrefab + const dinoPrefab = new DinoPrefab(this, 186, 160); + this.add.existing(dinoPrefab); // doubleDinoPrefab const doubleDinoPrefab = new DoubleDinoPrefab(this, 666, 35); this.add.existing(doubleDinoPrefab); @@ -221,13 +228,11 @@ class Level extends Phaser.Scene { dinoPushOnClick.pushScale = 0.8; new Tint(dino); dino.emit("components-awake"); - // dino_1 (prefab fields) - dino_1.rotating = true; - dino_1.emit("prefab-awake"); - // dino_1 (components) - const dino_1Tint = new Tint(dino_1); - dino_1Tint.tint = "blue"; - dino_1.emit("components-awake"); + // dinoPrefab (prefab fields) + dinoPrefab.rotating = true; + dinoPrefab.emit("prefab-awake"); + // dinoPrefab (components) + dinoPrefab.emit("components-awake"); // doubleDinoPrefab (prefab fields) doubleDinoPrefab.emit("prefab-awake"); // withAwakeEventPrefab (prefab fields) @@ -325,6 +330,77 @@ class TextWordWrapScene extends Phaser.Scene { // You can write more code here // You can write more code here /* START OF COMPILED CODE */ +class ComponentWithAwake { + constructor(gameObject) { + this.gameObject = gameObject; + gameObject["__ComponentWithAwake"] = this; + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + static getComponent(gameObject) { + return gameObject["__ComponentWithAwake"]; + } +} +/* END OF COMPILED CODE */ +// You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ +class ComponentWithoutAwake { + constructor(gameObject) { + this.gameObject = gameObject; + gameObject["__ComponentWithoutAwake"] = this; + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + static getComponent(gameObject) { + return gameObject["__ComponentWithoutAwake"]; + } +} +/* END OF COMPILED CODE */ +// You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ +class TestComponentsAwakeEvent extends Phaser.Scene { + constructor() { + super("TestComponentsAwakeEvent"); + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + editorCreate() { + // hasComponentsAwake + const hasComponentsAwake = this.add.text(126, 183, "", {}); + hasComponentsAwake.text = "Has components-awake"; + hasComponentsAwake.setStyle({ "fontSize": "40px" }); + // doesntHaveComponentsAwake + const doesntHaveComponentsAwake = this.add.text(130, 275, "", {}); + doesntHaveComponentsAwake.text = "Doesn't have components-awake"; + doesntHaveComponentsAwake.setStyle({ "fontSize": "40px" }); + // dinoPrefab + const dinoPrefab = new DinoPrefab(this, 370, 475); + this.add.existing(dinoPrefab); + // hasComponentsAwake (components) + new ComponentWithAwake(hasComponentsAwake); + hasComponentsAwake.emit("components-awake"); + // doesntHaveComponentsAwake (components) + new ComponentWithoutAwake(doesntHaveComponentsAwake); + // dinoPrefab (prefab fields) + dinoPrefab.emit("prefab-awake"); + // dinoPrefab (components) + dinoPrefab.emit("components-awake"); + } + /* START-USER-CODE */ + // Write your code here + create() { + this.editorCreate(); + } +} +/* END OF COMPILED CODE */ +// You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ class PrefabAwakeTest extends Phaser.Scene { constructor() { super("PrefabAwakeTest"); diff --git a/tests/workspace/test-typescript/scenes/DinoPrefab.scene b/tests/workspace/test-typescript/scenes/DinoPrefab.scene index 8108691e5..3d45f32af 100755 --- a/tests/workspace/test-typescript/scenes/DinoPrefab.scene +++ b/tests/workspace/test-typescript/scenes/DinoPrefab.scene @@ -12,7 +12,10 @@ "type": "Image", "id": "dd494496-e0c6-479b-98ed-25ff529caa6f", "label": "dino_1", - "components": [], + "components": [ + "Tint", + "PushOnClick" + ], "texture": { "key": "dino" }, diff --git a/tests/workspace/test-typescript/scenes/DinoPrefab.ts b/tests/workspace/test-typescript/scenes/DinoPrefab.ts index ee6ed3067..c5b518912 100755 --- a/tests/workspace/test-typescript/scenes/DinoPrefab.ts +++ b/tests/workspace/test-typescript/scenes/DinoPrefab.ts @@ -8,6 +8,10 @@ class DinoPrefab extends Phaser.GameObjects.Image { constructor(scene: Phaser.Scene, x: number, y: number, texture?: string, frame?: number | string) { super(scene, x, y, texture || "dino", frame); + // this (components) + new Tint(this); + new PushOnClick(this); + /* START-USER-CTR-CODE */ // Write your code here. /* END-USER-CTR-CODE */ diff --git a/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts b/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts index d98eebc30..36fa7f60b 100755 --- a/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts +++ b/tests/workspace/test-typescript/scenes/DoubleDinoPrefab.ts @@ -22,9 +22,15 @@ class DoubleDinoPrefab extends Phaser.GameObjects.Container { // dinoLeft (prefab fields) dinoLeft.emit("prefab-awake"); + // dinoLeft (components) + dinoLeft.emit("components-awake"); + // dinoRight (prefab fields) dinoRight.emit("prefab-awake"); + // dinoRight (components) + dinoRight.emit("components-awake"); + this.dinoLeft = dinoLeft; this.dinoRight = dinoRight; this.testListInPrefab = testListInPrefab; diff --git a/tests/workspace/test-typescript/scenes/Level.scene b/tests/workspace/test-typescript/scenes/Level.scene index 415c4cff8..719c69a15 100755 --- a/tests/workspace/test-typescript/scenes/Level.scene +++ b/tests/workspace/test-typescript/scenes/Level.scene @@ -42,12 +42,9 @@ "unlock": [ "rotating" ], - "label": "dino_1", + "label": "dinoPrefab", "rotating": true, - "components": [ - "Tint" - ], - "Tint.tint": "blue", + "components": [], "x": 186, "y": 160 }, diff --git a/tests/workspace/test-typescript/scenes/Level.ts b/tests/workspace/test-typescript/scenes/Level.ts index f5e792d99..792a93e4c 100755 --- a/tests/workspace/test-typescript/scenes/Level.ts +++ b/tests/workspace/test-typescript/scenes/Level.ts @@ -24,9 +24,9 @@ class Level extends Phaser.Scene { text_1.text = "Phaser 3 + Phaser Editor 2D + TypeScript"; text_1.setStyle({"fontFamily":"arial","fontSize":"3em"}); - // dino_1 - const dino_1 = new DinoPrefab(this, 186, 160); - this.add.existing(dino_1); + // dinoPrefab + const dinoPrefab = new DinoPrefab(this, 186, 160); + this.add.existing(dinoPrefab); // doubleDinoPrefab const doubleDinoPrefab = new DoubleDinoPrefab(this, 666, 35); @@ -43,14 +43,12 @@ class Level extends Phaser.Scene { new Tint(dino); dino.emit("components-awake"); - // dino_1 (prefab fields) - dino_1.rotating = true; - dino_1.emit("prefab-awake"); + // dinoPrefab (prefab fields) + dinoPrefab.rotating = true; + dinoPrefab.emit("prefab-awake"); - // dino_1 (components) - const dino_1Tint = new Tint(dino_1); - dino_1Tint.tint = "blue"; - dino_1.emit("components-awake"); + // dinoPrefab (components) + dinoPrefab.emit("components-awake"); // doubleDinoPrefab (prefab fields) doubleDinoPrefab.emit("prefab-awake"); diff --git a/tests/workspace/test-typescript/scenes/componentsAwake/AwakeTest.components b/tests/workspace/test-typescript/scenes/componentsAwake/AwakeTest.components new file mode 100755 index 000000000..09857ed4c --- /dev/null +++ b/tests/workspace/test-typescript/scenes/componentsAwake/AwakeTest.components @@ -0,0 +1,24 @@ +{ + "components": [ + { + "name": "ComponentWithoutAwake", + "baseClass": "", + "gameObjectType": "Phaser.GameObjects.Text", + "properties": [], + "generateAwakeEvent": false + }, + { + "name": "ComponentWithAwake", + "baseClass": "", + "gameObjectType": "Phaser.GameObjects.Text", + "properties": [], + "generateAwakeEvent": true + } + ], + "meta": { + "app": "Phaser Editor 2D - Object Script Editor", + "url": "https://phasereditor2d.com", + "contentType": "phasereditor2d.core.scene.SceneContentType" + }, + "outputLang": "TYPE_SCRIPT" +} \ No newline at end of file diff --git a/tests/workspace/test-typescript/scenes/componentsAwake/ComponentWithAwake.ts b/tests/workspace/test-typescript/scenes/componentsAwake/ComponentWithAwake.ts new file mode 100755 index 000000000..95fa015f7 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/componentsAwake/ComponentWithAwake.ts @@ -0,0 +1,32 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +class ComponentWithAwake { + + constructor(gameObject: Phaser.GameObjects.Text) { + this.gameObject = gameObject; + (gameObject as any)["__ComponentWithAwake"] = this; + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + static getComponent(gameObject: Phaser.GameObjects.Text): ComponentWithAwake { + return (gameObject as any)["__ComponentWithAwake"]; + } + + private gameObject: Phaser.GameObjects.Text; + + /* START-USER-CODE */ + + // Write your code here. + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/tests/workspace/test-typescript/scenes/componentsAwake/ComponentWithoutAwake.ts b/tests/workspace/test-typescript/scenes/componentsAwake/ComponentWithoutAwake.ts new file mode 100755 index 000000000..cdc340941 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/componentsAwake/ComponentWithoutAwake.ts @@ -0,0 +1,32 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +class ComponentWithoutAwake { + + constructor(gameObject: Phaser.GameObjects.Text) { + this.gameObject = gameObject; + (gameObject as any)["__ComponentWithoutAwake"] = this; + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + static getComponent(gameObject: Phaser.GameObjects.Text): ComponentWithoutAwake { + return (gameObject as any)["__ComponentWithoutAwake"]; + } + + private gameObject: Phaser.GameObjects.Text; + + /* START-USER-CODE */ + + // Write your code here. + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/tests/workspace/test-typescript/scenes/componentsAwake/TestComponentsAwakeEvent.scene b/tests/workspace/test-typescript/scenes/componentsAwake/TestComponentsAwakeEvent.scene new file mode 100755 index 000000000..8e692ec75 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/componentsAwake/TestComponentsAwakeEvent.scene @@ -0,0 +1,54 @@ +{ + "id": "26f2bbb7-6dfb-4799-8fe8-f597aa26dd14", + "sceneType": "SCENE", + "settings": { + "preloadPackFiles": [], + "createMethodName": "editorCreate", + "sceneKey": "TestComponentsAwakeEvent", + "compilerOutputLanguage": "TYPE_SCRIPT" + }, + "displayList": [ + { + "type": "Text", + "id": "611241a7-356a-4a98-9d62-a14559d4abdd", + "label": "hasComponentsAwake", + "components": [ + "ComponentWithAwake" + ], + "x": 126, + "y": 183, + "originX": 0, + "originY": 0, + "text": "Has components-awake", + "fontSize": "40px" + }, + { + "type": "Text", + "id": "26867206-bc49-47e9-920a-62aa075c8869", + "label": "doesntHaveComponentsAwake", + "components": [ + "ComponentWithoutAwake" + ], + "x": 130, + "y": 275, + "originX": 0, + "originY": 0, + "text": "Doesn't have components-awake", + "fontSize": "40px" + }, + { + "prefabId": "280fd0ee-2787-46a5-8832-a38b3ef81d08", + "id": "8f86a518-c8e7-44cd-b7e0-b5d1221151e4", + "label": "dinoPrefab", + "components": [], + "x": 370, + "y": 475 + } + ], + "plainObjects": [], + "meta": { + "app": "Phaser Editor 2D - Scene Editor", + "url": "https://phasereditor2d.com", + "contentType": "phasereditor2d.core.scene.SceneContentType" + } +} \ No newline at end of file diff --git a/tests/workspace/test-typescript/scenes/componentsAwake/TestComponentsAwakeEvent.ts b/tests/workspace/test-typescript/scenes/componentsAwake/TestComponentsAwakeEvent.ts new file mode 100755 index 000000000..2525bc5f2 --- /dev/null +++ b/tests/workspace/test-typescript/scenes/componentsAwake/TestComponentsAwakeEvent.ts @@ -0,0 +1,60 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +class TestComponentsAwakeEvent extends Phaser.Scene { + + constructor() { + super("TestComponentsAwakeEvent"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + editorCreate() { + + // hasComponentsAwake + const hasComponentsAwake = this.add.text(126, 183, "", {}); + hasComponentsAwake.text = "Has components-awake"; + hasComponentsAwake.setStyle({"fontSize":"40px"}); + + // doesntHaveComponentsAwake + const doesntHaveComponentsAwake = this.add.text(130, 275, "", {}); + doesntHaveComponentsAwake.text = "Doesn't have components-awake"; + doesntHaveComponentsAwake.setStyle({"fontSize":"40px"}); + + // dinoPrefab + const dinoPrefab = new DinoPrefab(this, 370, 475); + this.add.existing(dinoPrefab); + + // hasComponentsAwake (components) + new ComponentWithAwake(hasComponentsAwake); + hasComponentsAwake.emit("components-awake"); + + // doesntHaveComponentsAwake (components) + new ComponentWithoutAwake(doesntHaveComponentsAwake); + + // dinoPrefab (prefab fields) + dinoPrefab.emit("prefab-awake"); + + // dinoPrefab (components) + dinoPrefab.emit("components-awake"); + } + + /* START-USER-CODE */ + + // Write your code here + + create() { + + this.editorCreate(); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here From baaefad11a3e8ff5721c8554fa8c389f3f181949 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 16 Jul 2021 23:09:57 -0400 Subject: [PATCH 012/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index f2f4d636c..5bd02ae91 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -7,6 +7,7 @@ Word wrap width does not behave correctly * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: constructor ordering of custom definition props and START-USER-CTR-CODE. * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: `generateAwakeEvent` and `generateAwakeHandler`. +* [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) User components: the `generateAwakeEvent` flag. ## v3.15.0 - Jul 11, 2021 From 475794b19525f41b30494aa1cde23f77aaa35ff0 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 16 Jul 2021 23:11:33 -0400 Subject: [PATCH 013/108] Simple loop break. --- .../object/properties/UserComponentsEditorComponent.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts index 1ab6e464b..bad55bf86 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts @@ -297,6 +297,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { const result = finder.getUserComponentByName(compName); generateAwakeEvent = generateAwakeEvent || result.component.isGenerateAwakeEvent(); + + if (generateAwakeEvent) { + + break; + } } if (!generateAwakeEvent) { From 2e9cf45f79ec67884a5a7ac2efc78fbddd4af358 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sat, 17 Jul 2021 16:25:17 -0400 Subject: [PATCH 014/108] Update version to 3.15.0-next. --- source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts b/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts index 7fc96a5b2..24fc76942 100644 --- a/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts +++ b/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts @@ -308,7 +308,7 @@ namespace phasereditor2d.ide { /* program entry point */ - export const VER = "3.15.0"; + export const VER = "3.15.0-next"; async function main() { From fbb9ca1b60f406e40690d9a7bbda86a21313edd0 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 19 Jul 2021 10:47:36 -0400 Subject: [PATCH 015/108] #136 A command for disabling `prefab-awake` event in all prefabs. --- .../phasereditor2d.scene/src/ScenePlugin.ts | 4 +- .../ui/editor/commands/SceneEditorCommands.ts | 89 +++++++++++++++---- source/editor/tsconfig-base.json | 3 +- 3 files changed, 77 insertions(+), 19 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ScenePlugin.ts b/source/editor/plugins/phasereditor2d.scene/src/ScenePlugin.ts index f2be85bc2..1ee156c32 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ScenePlugin.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ScenePlugin.ts @@ -196,10 +196,10 @@ namespace phasereditor2d.scene { // commands reg.addExtension( - new ide.commands.CommandExtension(ui.editor.commands.SceneEditorCommands.registerCommands)); + new ide.commands.CommandExtension(m => ui.editor.commands.SceneEditorCommands.registerCommands(m))); reg.addExtension( - new ide.commands.CommandExtension(ui.editor.usercomponent.UserComponentsEditor.registerCommands)); + new ide.commands.CommandExtension(m => ui.editor.usercomponent.UserComponentsEditor.registerCommands(m))); // compile project diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index d5beb4648..b1dea0c9e 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -41,6 +41,7 @@ namespace phasereditor2d.scene.ui.editor.commands { export const CMD_DUPLICATE_SCENE_FILE = "phasereditor2d.scene.ui.editor.commands.DuplicateSceneFile"; export const CMD_CLEAR_SCENE_THUMBNAIL_CACHE = "phasereditor2d.scene.ui.editor.commands.ClearSceneThumbnailCache"; export const CMD_OPEN_SCENE_FILE = "phasereditor2d.scene.ui.editor.commands.OpenSceneFile"; + export const CMD_DISABLE_AWAKE_EVENT_PREFABS = "phasereditor2d.scene.ui.editor.commands.DisableAwakeEventPrefabs"; function isSceneScope(args: colibri.ui.ide.commands.HandlerArgs) { @@ -89,35 +90,93 @@ namespace phasereditor2d.scene.ui.editor.commands { name: "Scene Editor" }); - SceneEditorCommands.registerGlobalCommands(manager); + this.registerGlobalCommands(manager); - SceneEditorCommands.registerEditCommands(manager); + this.registerEditCommands(manager); - SceneEditorCommands.registerAddObjectCommands(manager); + this.registerAddObjectCommands(manager); - SceneEditorCommands.registerSceneCommands(manager); + this.registerSceneCommands(manager); - SceneEditorCommands.registerVisibilityCommands(manager); + this.registerVisibilityCommands(manager); - SceneEditorCommands.registerSelectionCommands(manager); + this.registerSelectionCommands(manager); - SceneEditorCommands.registerParentCommands(manager); + this.registerParentCommands(manager); - SceneEditorCommands.registerCompilerCommands(manager); + this.registerCompilerCommands(manager); - SceneEditorCommands.registerToolsCommands(manager); + this.registerToolsCommands(manager); - SceneEditorCommands.registerOriginCommands(manager); + this.registerOriginCommands(manager); - SceneEditorCommands.registerDepthCommands(manager); + this.registerDepthCommands(manager); - SceneEditorCommands.registerTypeCommands(manager); + this.registerTypeCommands(manager); - SceneEditorCommands.registerMoveObjectCommands(manager); + this.registerMoveObjectCommands(manager); - SceneEditorCommands.registerTextureCommands(manager); + this.registerTextureCommands(manager); - SceneEditorCommands.registerSnappingCommands(manager); + this.registerSnappingCommands(manager); + + this.registerPrefabAwakeCommands(manager); + } + + private static registerPrefabAwakeCommands(manager: colibri.ui.ide.commands.CommandManager) { + + manager.add({ + command: { + category: CAT_SCENE_EDITOR, + name: "Disable Awake Event By Default In All Prefabs", + id: "id", + tooltip: "Disables the awake event in all prefabs, where it is not set explicity." + }, + handler: { + testFunc: args => args.activeWindow instanceof ide.ui.DesignWindow, + executeFunc: async args => { + + const editors = args.activeWindow.getEditorArea().getEditors(); + + if (editors.length > 0) { + + alert("For executing this command, please, close all the editors.") + + return; + } + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + const dlg = new controls.dialogs.ProgressDialog(); + dlg.create(); + dlg.setTitle("Disabling Awake Event In Prefabs"); + + const monitor = new controls.dialogs.ProgressDialogMonitor(dlg); + + const prefabs = finder.getPrefabFiles(); + + monitor.addTotal(prefabs.length); + + for (const prefabFile of prefabs) { + + const data = finder.getSceneData(prefabFile); + + if (!("generateAwakeEvent" in data.settings)) { + + data.settings["generateAwakeEvent"] = false; + + dlg.setTitle("Precessing " + prefabFile.getName()); + + await colibri.ui.ide.FileUtils.setFileString_async(prefabFile, JSON.stringify(data, null, 4)); + + monitor.step(); + } + } + + dlg.close(); + } + } + }) } static registerAddObjectCommands(manager: colibri.ui.ide.commands.CommandManager) { diff --git a/source/editor/tsconfig-base.json b/source/editor/tsconfig-base.json index 6d8a97e91..7ed4b6120 100644 --- a/source/editor/tsconfig-base.json +++ b/source/editor/tsconfig-base.json @@ -9,6 +9,5 @@ "declaration": true, "declarationMap": true, "disableSourceOfProjectReferenceRedirect": true - }, - + } } \ No newline at end of file From 871f32b6a7a2d7a0600429ef300f9f6d952d9322 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 19 Jul 2021 10:48:45 -0400 Subject: [PATCH 016/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 5bd02ae91..55d4af79d 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -8,6 +8,7 @@ Word wrap width does not behave correctly * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: constructor ordering of custom definition props and START-USER-CTR-CODE. * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: `generateAwakeEvent` and `generateAwakeHandler`. * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) User components: the `generateAwakeEvent` flag. +* [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) A commands for disabling the Awake event in all prefabs. But ony it is not set explicitly in the prefab. ## v3.15.0 - Jul 11, 2021 From ce97306b34cec0c4072ff49aa0c4c03dc5e93e3d Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 19 Jul 2021 10:52:04 -0400 Subject: [PATCH 017/108] Misses using a constant in the command id. --- .../src/ui/editor/commands/SceneEditorCommands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index b1dea0c9e..9e6940f05 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -129,7 +129,7 @@ namespace phasereditor2d.scene.ui.editor.commands { command: { category: CAT_SCENE_EDITOR, name: "Disable Awake Event By Default In All Prefabs", - id: "id", + id: CMD_DISABLE_AWAKE_EVENT_PREFABS, tooltip: "Disables the awake event in all prefabs, where it is not set explicity." }, handler: { From 9d22a9762144a6b9bdac05b3a117826c1e444679 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 19 Jul 2021 13:50:36 -0400 Subject: [PATCH 018/108] Scene Editor: fixes Move To Parent dialog in context of prefab scenes. --- .../object/properties/ParentDialog.ts | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentDialog.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentDialog.ts index 5184de699..7b0b5078f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentDialog.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentDialog.ts @@ -19,7 +19,23 @@ namespace phasereditor2d.scene.ui.sceneobjects { viewer.setCellRendererProvider(new editor.outline.SceneEditorOutlineRendererProvider()); viewer.setContentProvider(new ParentContentProvider(this._editor)); - viewer.setInput(this._editor.getScene().sys.displayList); + if (this._editor.getScene().isPrefabSceneType()) { + + const obj = this._editor.getScene().getPrefabObject(); + + if (obj instanceof Phaser.GameObjects.Container || obj instanceof Phaser.GameObjects.Layer) { + + viewer.setInput(obj); + + } else { + + viewer.setInput([]); + } + + } else { + + viewer.setInput(this._editor.getScene().sys.displayList); + } viewer.setExpanded(viewer.getInput(), true); @@ -68,6 +84,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this.filterList(parent.list); } + if (parent instanceof Phaser.GameObjects.DisplayList) { + + return this.filterList(parent.list); + } + if (parent instanceof Container) { return this.filterList(parent.list); From 5067894a18ba1c41d209538757190b078ea104c8 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 19 Jul 2021 13:52:06 -0400 Subject: [PATCH 019/108] Update changelog. --- CHANGELOG.MD | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 55d4af79d..6453a996f 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -2,14 +2,23 @@ ## dev -* [#134](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/134) Creating a list in the editor results in an initialized array in the generated code. -* [#135](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/135) -Word wrap width does not behave correctly -* [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: constructor ordering of custom definition props and START-USER-CTR-CODE. +### Added + * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: `generateAwakeEvent` and `generateAwakeHandler`. * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) User components: the `generateAwakeEvent` flag. * [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) A commands for disabling the Awake event in all prefabs. But ony it is not set explicitly in the prefab. +### Updated + +* [#136](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/136) Prefabs: constructor ordering of custom definition props and START-USER-CTR-CODE. + +### Fixed + +* [#134](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/134) Creating a list in the editor results in an initialized array in the generated code. +* [#135](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/135) +Word wrap width does not behave correctly +* Scene Editor: fixes Move To Parent dialog in context of prefab scenes. + ## v3.15.0 - Jul 11, 2021 ### Fixed From a0a9aec706bfa71f799bd95356c3a0d46e71bae9 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 21 Jul 2021 04:29:28 -0400 Subject: [PATCH 020/108] Start with nested prefab. --- .../ui/controls/properties/EasyFormBuilder.ts | 4 +-- .../src/ui/controls/properties/FormBuilder.ts | 4 +-- .../ui/controls/properties/PropertySection.ts | 4 +-- .../SceneEditorOutlineContentProvider.ts | 2 +- .../ui/editor/properties/CompilerSection.ts | 2 +- .../src/ui/editor/properties/SceneSection.ts | 6 ++-- .../properties/UserPropertiesSection.ts | 2 +- .../UserComponentsCompilerSection.ts | 2 +- .../src/ui/sceneobjects/EditorSupport.ts | 9 ++++- .../sceneobjects/GameObjectEditorSupport.ts | 34 +++++++++++++++++++ .../ScenePlainObjectVariableSection.ts | 2 +- .../sceneobjects/list/ListVariableSection.ts | 2 +- .../sceneobjects/object/VariableComponent.ts | 4 +-- .../properties/GameObjectVariableSection.ts | 10 +++++- .../properties/SceneGameObjectSection.ts | 7 ++-- 15 files changed, 72 insertions(+), 22 deletions(-) diff --git a/source/editor/plugins/colibri/src/ui/controls/properties/EasyFormBuilder.ts b/source/editor/plugins/colibri/src/ui/controls/properties/EasyFormBuilder.ts index a2ae20182..17162cf7f 100644 --- a/source/editor/plugins/colibri/src/ui/controls/properties/EasyFormBuilder.ts +++ b/source/editor/plugins/colibri/src/ui/controls/properties/EasyFormBuilder.ts @@ -22,10 +22,10 @@ namespace colibri.ui.controls.properties { createMenuButton( text: string, - items: Array<{ name: string, value: any, icon?: controls.IImage }>, + getItems: () => Array<{ name: string, value: any, icon?: controls.IImage }>, callback: (value: any) => void) { - return this._formBuilder.createMenuButton(this._parent, text, items, callback); + return this._formBuilder.createMenuButton(this._parent, text, getItems, callback); } createText(readOnly?: boolean) { diff --git a/source/editor/plugins/colibri/src/ui/controls/properties/FormBuilder.ts b/source/editor/plugins/colibri/src/ui/controls/properties/FormBuilder.ts index 28bc430f1..22bac1ead 100644 --- a/source/editor/plugins/colibri/src/ui/controls/properties/FormBuilder.ts +++ b/source/editor/plugins/colibri/src/ui/controls/properties/FormBuilder.ts @@ -34,14 +34,14 @@ namespace colibri.ui.controls.properties { createMenuButton( parent: HTMLElement, text: string, - items: Array<{ name: string, value: any, icon?: controls.IImage }>, + getItems: () => Array<{ name: string, value: any, icon?: controls.IImage }>, callback: (value: any) => void) { const btn = this.createButton(parent, text, e => { const menu = new controls.Menu(); - for (const item of items) { + for (const item of getItems()) { menu.add(new Action({ text: item.name, diff --git a/source/editor/plugins/colibri/src/ui/controls/properties/PropertySection.ts b/source/editor/plugins/colibri/src/ui/controls/properties/PropertySection.ts index b2e9eeafc..982167451 100644 --- a/source/editor/plugins/colibri/src/ui/controls/properties/PropertySection.ts +++ b/source/editor/plugins/colibri/src/ui/controls/properties/PropertySection.ts @@ -265,14 +265,14 @@ namespace colibri.ui.controls.properties { createMenuButton( parent: HTMLElement, text: string, - items: Array<{ name: string, value: any, icon?: controls.IImage }>, + getItems: () => Array<{ name: string, value: any, icon?: controls.IImage }>, callback: (value: any) => void) { const btn = this.createButton(parent, text, e => { const menu = new controls.Menu(); - for (const item of items) { + for (const item of getItems()) { menu.add(new Action({ text: item.name, diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts index 9cc1c52dd..32edb877f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts @@ -50,7 +50,7 @@ namespace phasereditor2d.scene.ui.editor.outline { if (parent.getEditorSupport().isPrefabInstance()) { - return []; + return parent.getEditorSupport().getNestedPrefabs(); } const list = [...parent.getChildren()]; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/CompilerSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/CompilerSection.ts index bebe76373..b09c08674 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/CompilerSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/CompilerSection.ts @@ -48,7 +48,7 @@ namespace phasereditor2d.scene.ui.editor.properties { "Compiles the scene into code.")); this.createMenuField( - comp, [ + comp, () => [ { name: "JavaScript", value: core.json.SourceLang.JAVA_SCRIPT, diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/SceneSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/SceneSection.ts index 9ef885f8a..bf1f69211 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/SceneSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/SceneSection.ts @@ -100,12 +100,12 @@ namespace phasereditor2d.scene.ui.editor.properties { createMenuField( comp: HTMLElement, - items: Array<{ name: string, value: any }>, + getItems: () => Array<{ name: string, value: any }>, name: string, label: string, tooltip: string) { this.createLabel(comp, label, tooltip); - const btn = this.createMenuButton(comp, "-", items, value => { + const btn = this.createMenuButton(comp, "-", getItems, value => { const editor = this.getEditor(); @@ -121,7 +121,7 @@ namespace phasereditor2d.scene.ui.editor.properties { this.addUpdater(() => { - const item = items.find(i => i.value === this.getSettings()[name]); + const item = getItems().find(i => i.value === this.getSettings()[name]); btn.textContent = item ? item.name : "-"; }); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/UserPropertiesSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/UserPropertiesSection.ts index ef79d94a0..60f93060c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/UserPropertiesSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/UserPropertiesSection.ts @@ -32,7 +32,7 @@ namespace phasereditor2d.scene.ui.editor.properties { const propTypes = ScenePlugin.getInstance().createUserPropertyTypes(); - const btn = this.createMenuButton(comp, "Add Property", propTypes.map(t => ({ + const btn = this.createMenuButton(comp, "Add Property", () => propTypes.map(t => ({ name: t.getName() + " Property", value: t.getId() })), (typeId: string) => { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentsCompilerSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentsCompilerSection.ts index 380c63aed..b8b7d0393 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentsCompilerSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentsCompilerSection.ts @@ -29,7 +29,7 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { this.createLabel(comp, "Output Language", "The components code output language."); - const btn = this.createMenuButton(comp, "", [{ + const btn = this.createMenuButton(comp, "", () => [{ name: "JavaScript", value: core.json.SourceLang.JAVA_SCRIPT }, { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts index b5046ef96..ddf62ec62 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts @@ -6,7 +6,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { METHOD = "METHOD", CLASS = "CLASS", - PUBLIC = "PUBLIC" + PUBLIC = "PUBLIC", + PREFAB_PUBLIC = "PREFAB_PUBLIC" } export abstract class EditorSupport { @@ -82,6 +83,12 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this._scope; } + isPublic() { + + return this._scope === ObjectScope.PUBLIC + || this._scope === ObjectScope.PREFAB_PUBLIC; + } + setScope(scope: ObjectScope) { this._scope = scope; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index c281f046c..64e548d7d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -407,6 +407,40 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this.isPrefabInstance() && this.getOwnerPrefabInstance() !== this.getObject(); } + isNestedPrefab() { + + const owner = this.getOwnerPrefabInstance(); + + if (owner && owner !== this.getObject()) { + + return this.getScope() === ObjectScope.PREFAB_PUBLIC; + } + + return false; + } + + getNestedPrefabs(): ISceneGameObject[] { + + const obj = this.getObject(); + + if (obj instanceof Layer || obj instanceof Container) { + + const result: ISceneGameObject[] = []; + + for (const child of obj.getChildren()) { + + if (child.getEditorSupport().isNestedPrefab()) { + + result.push(child); + } + } + + return result; + } + + return []; + } + getOwnerPrefabInstance(): ISceneGameObject { const obj = this.getObject(); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ScenePlainObjectVariableSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ScenePlainObjectVariableSection.ts index ad3bb7e68..273515148 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ScenePlainObjectVariableSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ScenePlainObjectVariableSection.ts @@ -67,7 +67,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { value: ObjectScope.PUBLIC }]; - const btn = this.createMenuButton(comp, "", items, scope => { + const btn = this.createMenuButton(comp, "", () => items, scope => { this.performChange(objects => { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/list/ListVariableSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/list/ListVariableSection.ts index 3c9d1083a..0a68e51c1 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/list/ListVariableSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/list/ListVariableSection.ts @@ -63,7 +63,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { value: ObjectScope.PUBLIC }]; - const btn = this.createMenuButton(comp, "", items, scope => { + const btn = this.createMenuButton(comp, "", () => items, scope => { this.performChange(list => { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/VariableComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/VariableComponent.ts index 6f8898f23..6b4fe2fbe 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/VariableComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/VariableComponent.ts @@ -18,8 +18,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { local: true, getValue: obj => obj.getEditorSupport().getScope(), setValue: (obj, value) => obj.getEditorSupport().setScope(value), - values: [ObjectScope.METHOD, ObjectScope.CLASS, ObjectScope.PUBLIC], - getValueLabel: value => value[0] + value.toLowerCase().substring(1) + values: [ObjectScope.METHOD, ObjectScope.CLASS, ObjectScope.PUBLIC, ObjectScope.PREFAB_PUBLIC], + getValueLabel: value => value.split("_").map(v => v[0] + v.substring(1).toLowerCase()).join(" ") }; constructor(obj: ISceneGameObjectLike) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts index 7f54ded9b..9884ae920 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts @@ -79,7 +79,15 @@ namespace phasereditor2d.scene.ui.sceneobjects { // Scope this.createLabel(comp, "Scope", "The lexical scope of this object's variable, in code."); - this.createEnumField(comp, VariableComponent.scope, false); + this.createEnumField(comp, VariableComponent.scope, false, scope => { + + if (this.getEditor().getScene().isPrefabSceneType()) { + + return true; + } + + return scope !== ObjectScope.PREFAB_PUBLIC; + }); } } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/SceneGameObjectSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/SceneGameObjectSection.ts index 2381e9994..c8f6ea5ee 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/SceneGameObjectSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/SceneGameObjectSection.ts @@ -255,9 +255,10 @@ namespace phasereditor2d.scene.ui.sceneobjects { } createEnumField( - parent: HTMLElement, property: IEnumProperty, checkUnlocked = true) { + parent: HTMLElement, property: IEnumProperty, checkUnlocked = true, filter?: (v: TValue) => boolean) { - const items = property.values + const getItems = () => property.values + .filter(v => !filter || filter(v)) .map(value => { return { name: property.getValueLabel(value), @@ -265,7 +266,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { }; }); - const btn = this.createMenuButton(parent, "", items, value => { + const btn = this.createMenuButton(parent, "", getItems, value => { this.getEditor().getUndoManager().add( new SimpleOperation(this.getEditor(), this.getSelection(), property, value)); From e65e081d2e03776db25ca6c16b24dbd41aa2eb34 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Thu, 29 Jul 2021 23:35:05 -0400 Subject: [PATCH 021/108] Scene Editor: improves Size Tool. Allows different object types. --- .../src/ui/editor/SceneEditor.ts | 7 +++++-- .../sceneobjects/GameObjectEditorSupport.ts | 15 ++++++++++++++ .../object/tools/BaseObjectTool.ts | 19 ++++++++++++------ .../sceneobjects/object/tools/OriginTool.ts | 4 ++-- .../sceneobjects/object/tools/RotateTool.ts | 2 +- .../ui/sceneobjects/object/tools/ScaleTool.ts | 4 ++-- .../object/tools/SizeOperation.ts | 13 ++++++------ .../ui/sceneobjects/object/tools/SizeTool.ts | 20 ++++++++----------- .../sceneobjects/object/tools/SizeToolItem.ts | 10 +++++----- 9 files changed, 58 insertions(+), 36 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SceneEditor.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SceneEditor.ts index 4ed1bff1f..7675818d6 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SceneEditor.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SceneEditor.ts @@ -79,7 +79,7 @@ namespace phasereditor2d.scene.ui.editor { } } - async confirmUnlockProperty(props: Array>, propLabel: string, sectionId: string): Promise { + async confirmUnlockProperty(props: Array>, propLabel: string, ...sectionId: string[]): Promise { const lockedObjects = this.getSelectedGameObjects().filter(obj => { @@ -107,7 +107,10 @@ namespace phasereditor2d.scene.ui.editor { this.getUndoManager() .add(new sceneobjects.PropertyUnlockOperation(this, lockedObjects, props, true)); - this.updateInspectorViewSection(sectionId); + for (const id of sectionId) { + + this.updateInspectorViewSection(id); + } } resolve(ok); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index c281f046c..3387d3fd9 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -376,6 +376,21 @@ namespace phasereditor2d.scene.ui.sceneobjects { return list; } + getSizeProperties() { + + if (this.hasComponent(SizeComponent)) { + + return [SizeComponent.width, SizeComponent.height]; + } + + return []; + } + + getSizeSectionId() { + + return SizeSection.SECTION_ID; + } + isDescendentOf(parent: Container | Layer) { const set = new Set(this.getAllParents()); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/BaseObjectTool.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/BaseObjectTool.ts index 0d7936eea..2265a8644 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/BaseObjectTool.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/BaseObjectTool.ts @@ -1,7 +1,5 @@ namespace phasereditor2d.scene.ui.sceneobjects { - import controls = colibri.ui.controls; - export class BaseObjectTool extends editor.tools.SceneTool { private _properties: Array>; @@ -12,13 +10,20 @@ namespace phasereditor2d.scene.ui.sceneobjects { this._properties = properties; } + protected getProperties(obj: any) { + + return this._properties; + } + canEdit(obj: unknown): boolean { if (sceneobjects.isGameObject(obj)) { const support = (obj as unknown as ISceneGameObject).getEditorSupport(); - for (const prop of this._properties) { + const props = this.getProperties(obj); + + for (const prop of props) { if (!support.hasProperty(prop)) { return false; @@ -41,7 +46,9 @@ namespace phasereditor2d.scene.ui.sceneobjects { const support = (obj as unknown as ISceneGameObject).getEditorSupport(); - for (const prop of this._properties) { + const props = this.getProperties(obj); + + for (const prop of props) { if (support.hasProperty(prop)) { return true; @@ -52,9 +59,9 @@ namespace phasereditor2d.scene.ui.sceneobjects { return false; } - confirmUnlockProperty(props: Array>, propLabel: string, sectionId: string, args: editor.tools.ISceneToolContextArgs) { + confirmUnlockProperty(args: editor.tools.ISceneToolContextArgs, props: Array>, propLabel: string, ...sectionId: string[]) { - args.editor.confirmUnlockProperty(props, propLabel, sectionId); + args.editor.confirmUnlockProperty(props, propLabel, ...sectionId); } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/OriginTool.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/OriginTool.ts index 00a739ee2..383286524 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/OriginTool.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/OriginTool.ts @@ -61,8 +61,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { super.onActivated(args); - this.confirmUnlockProperty([sceneobjects.OriginComponent.originX, sceneobjects.OriginComponent.originY], - "origin", OriginSection.SECTION_ID, args); + this.confirmUnlockProperty(args, [sceneobjects.OriginComponent.originX, sceneobjects.OriginComponent.originY], + "origin", OriginSection.SECTION_ID); } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/RotateTool.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/RotateTool.ts index c99078d9f..477e30702 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/RotateTool.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/RotateTool.ts @@ -26,7 +26,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { super.onActivated(args); - this.confirmUnlockProperty([sceneobjects.TransformComponent.angle], "angle", TransformSection.SECTION_ID, args); + this.confirmUnlockProperty(args, [sceneobjects.TransformComponent.angle], "angle", TransformSection.SECTION_ID); } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/ScaleTool.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/ScaleTool.ts index f2ff5bbae..c1deb993c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/ScaleTool.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/ScaleTool.ts @@ -23,8 +23,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { super.onActivated(args); - this.confirmUnlockProperty([sceneobjects.TransformComponent.scale.x, sceneobjects.TransformComponent.scale.y], - "scale", TransformSection.SECTION_ID, args); + this.confirmUnlockProperty(args, [sceneobjects.TransformComponent.scale.x, sceneobjects.TransformComponent.scale.y], + "scale", TransformSection.SECTION_ID); } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeOperation.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeOperation.ts index ea083a94a..7feedcc5b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeOperation.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeOperation.ts @@ -7,18 +7,19 @@ namespace phasereditor2d.scene.ui.sceneobjects { return SizeToolItem.getInitialSize(obj); } - getFinalValue(obj: any): { x: number; y: number; } { + getFinalValue(obj: ISceneGameObject): { x: number; y: number; } { - const sprite = obj as TileSprite; + const [w, h] = obj.getEditorSupport().getSizeProperties(); - return { x: sprite.width, y: sprite.height }; + return { x: w.getValue(obj), y: h.getValue(obj) }; } - setValue(obj: any, value: { x: number; y: number; }) { + setValue(obj: ISceneGameObject, value: { x: number; y: number; }) { - const sprite = obj as TileSprite; + const [w, h] = obj.getEditorSupport().getSizeProperties(); - sprite.setSize(value.x, value.y); + w.setValue(obj, value.x); + h.setValue(obj, value.y); } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeTool.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeTool.ts index fb417f4e7..e8317b3d7 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeTool.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeTool.ts @@ -8,7 +8,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { super({ id: SizeTool.ID, command: editor.commands.CMD_RESIZE_SCENE_OBJECT, - }, SizeComponent.width, SizeComponent.height); + }); this.addItems( new SizeToolItem(1, 0.5), @@ -17,24 +17,20 @@ namespace phasereditor2d.scene.ui.sceneobjects { ); } - canEdit(obj: unknown) { + getProperties(obj: ISceneGameObject) { - const support = GameObjectEditorSupport.getEditorSupport(obj); - - if (support.hasComponent(SizeComponent)) { - - return support.isUnlockedProperty(SizeComponent.width); - } - - return false; + return obj.getEditorSupport().getSizeProperties(); } onActivated(args: editor.tools.ISceneToolContextArgs) { super.onActivated(args); - this.confirmUnlockProperty([sceneobjects.SizeComponent.width, sceneobjects.SizeComponent.height], - "size", SizeSection.SECTION_ID, args); + const props = args.objects.flatMap(obj => obj.getEditorSupport().getSizeProperties()); + + const sections = args.objects.flatMap(obj => obj.getEditorSupport().getSizeSectionId()); + + this.confirmUnlockProperty(args, props, "size", ...sections); } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeToolItem.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeToolItem.ts index d27b6a21a..02e6c0161 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeToolItem.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/SizeToolItem.ts @@ -119,19 +119,19 @@ namespace phasereditor2d.scene.ui.sceneobjects { const changeX = this._x === 1 && this._y === 0.5 || changeAll; const changeY = this._x === 0.5 && this._y === 1 || changeAll; + const [widthProp, heightProp] = sprite.getEditorSupport().getSizeProperties(); + if (changeX) { - sprite.setSize(Math.floor(width), sprite.height); - sprite.updateDisplayOrigin(); + widthProp.setValue(sprite, Math.floor(width)); } if (changeY) { - sprite.setSize(sprite.width, Math.floor(height)); - sprite.updateDisplayOrigin(); + heightProp.setValue(sprite, Math.floor(height)); } - args.editor.updateInspectorViewSection(SizeSection.SECTION_ID); + args.editor.updateInspectorViewSection(obj.getEditorSupport().getSizeSectionId()); } } From 6daa4bbe02ceed0b51a0324a0f170610b0eeaf7d Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 30 Jul 2021 04:40:22 -0400 Subject: [PATCH 022/108] Refactoring code resources manager. --- .../phasereditor2d.scene/src/core/code/CodeResources.ts | 8 ++++---- .../ui/editor/usercomponent/UserComponentCodeResources.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/CodeResources.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/CodeResources.ts index 6ce2f84d6..b226c3787 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/CodeResources.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/CodeResources.ts @@ -9,11 +9,13 @@ namespace phasereditor2d.scene.core.code { export class CodeResources { + private _plugin: colibri.Plugin; private _resources: IResource[]; private _resDataMap: Map; - constructor() { + constructor(plugin: colibri.Plugin) { + this._plugin = plugin; this._resources = []; this._resDataMap = new Map(); } @@ -25,11 +27,9 @@ namespace phasereditor2d.scene.core.code { async preload(): Promise { - const plugin = ScenePlugin.getInstance(); - for (const res of this._resources) { - const data = await plugin.getString(res.path); + const data = await this._plugin.getString(res.path); this._resDataMap.set(res.id, data); } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentCodeResources.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentCodeResources.ts index 57c9125cd..62d3b0877 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentCodeResources.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentCodeResources.ts @@ -10,7 +10,7 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { } private constructor() { - super(); + super(ScenePlugin.getInstance()); this.addResource("usercomponent.js", "data/UserComponent.js.txt"); this.addResource("usercomponent.module.js", "data/UserComponent.module.js.txt"); From 599b39ecfcb0e6a6e9821fb2a8dbc5149652c248 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 30 Jul 2021 11:34:16 -0400 Subject: [PATCH 023/108] Set alpha version. --- CHANGELOG.MD | 2 +- source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 6453a996f..2f07e80fd 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,6 +1,6 @@ # Change Log -## dev +## v3.16.0-alpha.1 ### Added diff --git a/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts b/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts index 24fc76942..6480fa445 100644 --- a/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts +++ b/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts @@ -308,7 +308,7 @@ namespace phasereditor2d.ide { /* program entry point */ - export const VER = "3.15.0-next"; + export const VER = "v3.16.0-alpha.1"; async function main() { From 5ec6e9e457eb84e7b7be1358121a4873b5d32060 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 30 Jul 2021 11:40:13 -0400 Subject: [PATCH 024/108] Update version. --- source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts b/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts index 6480fa445..489c10654 100644 --- a/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts +++ b/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts @@ -308,7 +308,7 @@ namespace phasereditor2d.ide { /* program entry point */ - export const VER = "v3.16.0-alpha.1"; + export const VER = "3.16.0-alpha.1"; async function main() { From 631535528c222ed774265adb299300eb6a722c4c Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sat, 31 Jul 2021 23:30:54 -0400 Subject: [PATCH 025/108] Nested prefab instance: doesn't show the Variable properties section. --- .../object/properties/GameObjectVariableSection.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts index 9884ae920..a1bd77a8b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts @@ -93,10 +93,18 @@ namespace phasereditor2d.scene.ui.sceneobjects { canEdit(obj: any, n: number): boolean { + const support = GameObjectEditorSupport.getEditorSupport(obj); + + if (support && support.isNestedPrefab()) { + + return false; + } + return GameObjectEditorSupport.hasObjectComponent(obj, VariableComponent) && !this.isPrefabSceneObject(obj); } canEditNumber(n: number): boolean { + return n > 0; } } From 8b384f5c518918dd6de5b136168d0d5b962b1ae4 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 1 Aug 2021 00:10:56 -0400 Subject: [PATCH 026/108] Nested prefab: doesn't show Parent section. --- .../src/ui/sceneobjects/GameObjectEditorSupport.ts | 12 ++++++++++++ .../object/properties/GameObjectVariableSection.ts | 11 +++-------- .../sceneobjects/object/properties/ParentSection.ts | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index c4ebc55e8..fe1b57a9e 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -2,6 +2,18 @@ namespace phasereditor2d.scene.ui.sceneobjects { import json = core.json; + export function isNestedPrefab(obj: any) { + + const support = GameObjectEditorSupport.getEditorSupport(obj); + + if (support) { + + return support.isNestedPrefab(); + } + + return false; + } + export function isGameObject(obj: any) { return GameObjectEditorSupport.hasEditorSupport(obj); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts index a1bd77a8b..ee2a70d4d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts @@ -93,14 +93,9 @@ namespace phasereditor2d.scene.ui.sceneobjects { canEdit(obj: any, n: number): boolean { - const support = GameObjectEditorSupport.getEditorSupport(obj); - - if (support && support.isNestedPrefab()) { - - return false; - } - - return GameObjectEditorSupport.hasObjectComponent(obj, VariableComponent) && !this.isPrefabSceneObject(obj); + return GameObjectEditorSupport.hasObjectComponent(obj, VariableComponent) + && !this.isPrefabSceneObject(obj) + && !isNestedPrefab(obj); } canEditNumber(n: number): boolean { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentSection.ts index e8a701944..4f6f6cb59 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentSection.ts @@ -78,7 +78,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { canEdit(obj: any, n: number): boolean { - return sceneobjects.isGameObject(obj); + return sceneobjects.isGameObject(obj) && !isNestedPrefab(obj); } canEditNumber(n: number): boolean { From 2338c497e17f9cf5f76e690168016abcf73d0491 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 1 Aug 2021 03:19:26 -0400 Subject: [PATCH 027/108] Nested prefab: simplifying prefab model. --- .../src/core/json/IObjectData.ts | 2 ++ .../src/core/json/SceneFinder.ts | 23 +++++++++++++++++++ .../phasereditor2d.scene/src/ui/SceneMaker.ts | 12 +++++++++- .../sceneobjects/GameObjectEditorSupport.ts | 23 +++++++------------ .../container/ContainerEditorSupport.ts | 10 +++----- .../container/ContainerExtension.ts | 7 +----- .../sceneobjects/layer/LayerEditorSupport.ts | 8 ++----- .../ui/sceneobjects/layer/LayerExtension.ts | 4 ++-- .../properties/GameObjectVariableSection.ts | 2 +- .../object/properties/ParentSection.ts | 2 +- 10 files changed, 54 insertions(+), 39 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts index 05d19fe7c..369eb688d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts @@ -7,5 +7,7 @@ namespace phasereditor2d.scene.core.json { components?: string[], label: string; unlock?: string[]; + scope?: ui.sceneobjects.ObjectScope; + list?: IObjectData[]; } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts index 2d88f1ced..d41e538f2 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts @@ -224,6 +224,9 @@ namespace phasereditor2d.scene.core.json { prefabObjectId_ObjectData_Map.set(data.id, objData); prefabId_File_Map.set(data.id, file); + + this.mapNestedPrefabData( + prefabObjectId_ObjectData_Map, prefabId_File_Map, file, objData); } if (data.sceneType === SceneType.PREFAB) { @@ -249,6 +252,26 @@ namespace phasereditor2d.scene.core.json { this._prefabFiles = prefabFiles; } + private mapNestedPrefabData( + prefabObjectId_ObjectData_Map: Map, + prefabId_File_Map: Map, + file: io.FilePath, + objData: IObjectData) { + + if (objData.list) { + + for (const c of objData.list) { + + if (c.scope === ui.sceneobjects.ObjectScope.PREFAB_PUBLIC) { + + prefabObjectId_ObjectData_Map.set(c.id, c); + prefabId_File_Map.set(c.id, file); + } + } + } + } + + getUserComponentsFiles() { return this._compFiles; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index 0be45437e..275ab8c9a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -467,10 +467,20 @@ namespace phasereditor2d.scene.ui { return newObjects; } - createObject(data: json.IObjectData, errors?: string[]) { + createObject(data: json.IObjectData, errors?: string[], parent?: sceneobjects.ISceneGameObject) { try { + if (parent && parent.getEditorSupport().isPrefabInstance() + && data.scope === sceneobjects.ObjectScope.PREFAB_PUBLIC) { + + data = { + id: Phaser.Utils.String.UUID(), + prefabId: data.id, + label: data.label + }; + } + const ser = this.getSerializer(data); const type = ser.getType(); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index fe1b57a9e..0c459942b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -2,13 +2,13 @@ namespace phasereditor2d.scene.ui.sceneobjects { import json = core.json; - export function isNestedPrefab(obj: any) { + export function isNestedPrefabInstance(obj: any) { const support = GameObjectEditorSupport.getEditorSupport(obj); if (support) { - return support.isNestedPrefab(); + return support.isPrefabInstance(); } return false; @@ -370,6 +370,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { return undefined; } + isNestedPreabInstance() { + + return this.isPrefabInstance() && this.getOwnerPrefabInstance() !== this.getObject(); + } + isPrefabInstance() { return typeof this._prefabId === "string"; } @@ -434,18 +439,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this.isPrefabInstance() && this.getOwnerPrefabInstance() !== this.getObject(); } - isNestedPrefab() { - - const owner = this.getOwnerPrefabInstance(); - - if (owner && owner !== this.getObject()) { - - return this.getScope() === ObjectScope.PREFAB_PUBLIC; - } - - return false; - } - getNestedPrefabs(): ISceneGameObject[] { const obj = this.getObject(); @@ -456,7 +449,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { for (const child of obj.getChildren()) { - if (child.getEditorSupport().isNestedPrefab()) { + if (child.getEditorSupport().isPrefabInstance()) { result.push(child); } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 7c43cd2f7..015824d8c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -3,10 +3,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { import controls = colibri.ui.controls; import json = core.json; - export interface IContainerData extends json.IObjectData { - list: json.IObjectData[]; - } - export class ContainerEditorSupport extends GameObjectEditorSupport { private _allowPickChildren: boolean; @@ -78,7 +74,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { return new controls.viewers.IconImageCellRenderer(ScenePlugin.getInstance().getIcon(ICON_GROUP)); } - writeJSON(containerData: IContainerData) { + writeJSON(containerData: json.IObjectData) { super.writeJSON(containerData); @@ -95,7 +91,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { } } - readJSON(containerData: IContainerData) { + readJSON(containerData: json.IObjectData) { super.readJSON(containerData); @@ -111,7 +107,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { for (const objData of list) { - const sprite = maker.createObject(objData); + const sprite = maker.createObject(objData, undefined, container); if (sprite) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts index 3ace5a45c..add683438 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts @@ -2,11 +2,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { import json = core.json; - export interface IContainerData extends json.IObjectData { - - list: json.IObjectData[]; - } - export class ContainerExtension extends SceneGameObjectExtension { private static _instance: ContainerExtension; @@ -72,7 +67,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const container = this.createContainerObject(args.scene, 0, 0, []); - container.getEditorSupport().readJSON(args.data as IContainerData); + container.getEditorSupport().readJSON(args.data); return container; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts index 942f74870..9cd5079bd 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts @@ -3,10 +3,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { import controls = colibri.ui.controls; import json = phasereditor2d.scene.core.json; - export interface ILayerData extends json.IObjectData { - list: json.IObjectData[]; - } - export class LayerEditorSupport extends GameObjectEditorSupport { constructor(obj: Layer, scene: Scene) { @@ -62,7 +58,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { return new controls.viewers.IconImageCellRenderer(ScenePlugin.getInstance().getIcon(ICON_LAYER)); } - writeJSON(layerData: ILayerData) { + writeJSON(layerData: json.IObjectData) { super.writeJSON(layerData); @@ -79,7 +75,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { } } - readJSON(layerData: ILayerData) { + readJSON(layerData: json.IObjectData) { super.readJSON(layerData); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerExtension.ts index 5d0f30769..e17194b87 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerExtension.ts @@ -24,7 +24,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { if (originalObject instanceof Container) { - const containerData = serializer.getData() as IContainerData; + const containerData = serializer.getData(); const children = originalObject.getChildren(); @@ -65,7 +65,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const container = this.createLayerObject(args.scene, []); - container.getEditorSupport().readJSON(args.data as IContainerData); + container.getEditorSupport().readJSON(args.data); return container; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts index ee2a70d4d..7b7c9daa3 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts @@ -95,7 +95,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { return GameObjectEditorSupport.hasObjectComponent(obj, VariableComponent) && !this.isPrefabSceneObject(obj) - && !isNestedPrefab(obj); + && !isNestedPrefabInstance(obj); } canEditNumber(n: number): boolean { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentSection.ts index 4f6f6cb59..0ad83b346 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/ParentSection.ts @@ -78,7 +78,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { canEdit(obj: any, n: number): boolean { - return sceneobjects.isGameObject(obj) && !isNestedPrefab(obj); + return sceneobjects.isGameObject(obj) && !isNestedPrefabInstance(obj); } canEditNumber(n: number): boolean { From 075aea97f238fd3c95727d9ad3824a84992ea8eb Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 1 Aug 2021 03:26:21 -0400 Subject: [PATCH 028/108] Nested prefabs: removes IConatinerData and ILayerData interfaces. --- .../src/core/json/IObjectData.ts | 1 + .../container/ContainerEditorSupport.ts | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts index 369eb688d..e8bd9fd1a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts @@ -9,5 +9,6 @@ namespace phasereditor2d.scene.core.json { unlock?: string[]; scope?: ui.sceneobjects.ObjectScope; list?: IObjectData[]; + nestedPrefabs?: IObjectData[]; } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 015824d8c..e75600120 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -78,7 +78,22 @@ namespace phasereditor2d.scene.ui.sceneobjects { super.writeJSON(containerData); - if (!this.isPrefabInstance()) { + if (this.isPrefabInstance()) { + + containerData.nestedPrefabs = this.getObject().getChildren() + + .filter(obj => obj.getEditorSupport().isPrefabInstance()) + + .map(obj => { + + const objData = {} as json.IObjectData; + + obj.getEditorSupport().writeJSON(objData); + + return objData as json.IObjectData; + }); + + } else { containerData.list = this.getObject().getChildren().map(obj => { From 5f2e987cdd887cf44268ead73af6c9546ab82b81 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 1 Aug 2021 03:44:20 -0400 Subject: [PATCH 029/108] Nested prefab: serialization. --- .../phasereditor2d.scene/src/ui/SceneMaker.ts | 2 +- .../ui/sceneobjects/GameObjectEditorSupport.ts | 14 ++++++++++++++ .../container/ContainerEditorSupport.ts | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index 275ab8c9a..6bd80d131 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -477,7 +477,7 @@ namespace phasereditor2d.scene.ui { data = { id: Phaser.Utils.String.UUID(), prefabId: data.id, - label: data.label + label: data.label, }; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 0c459942b..36b4ccbc5 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -629,5 +629,19 @@ namespace phasereditor2d.scene.ui.sceneobjects { s.readJSON(ser); } } + + protected readNestedPrefabData(objData: json.IObjectData) { + + const list = objData.nestedPrefabs || []; + + const map = new Map(); + + for (const data of list) { + + map.set(data.prefabId, data); + } + + return map; + } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index e75600120..e8f2069e2 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -114,6 +114,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { const list = ser.read("list", []) as json.IObjectData[]; + const nestedPrefabMap = this.readNestedPrefabData(containerData); + const maker = this.getScene().getMaker(); const container = this.getObject(); @@ -122,7 +124,18 @@ namespace phasereditor2d.scene.ui.sceneobjects { for (const objData of list) { - const sprite = maker.createObject(objData, undefined, container); + let sprite:ISceneGameObject; + + if (nestedPrefabMap.has(objData.id)) { + + const prefabData = nestedPrefabMap.get(objData.id); + + sprite = maker.createObject(prefabData); + + } else { + + sprite = maker.createObject(objData, undefined, container); + } if (sprite) { From d3ba279d599490a5e5610fc8802f14c578bf2e1b Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 1 Aug 2021 03:53:06 -0400 Subject: [PATCH 030/108] Nested prefab: fixes nested prefab testing. --- .../src/ui/sceneobjects/GameObjectEditorSupport.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 36b4ccbc5..5fc55f0b6 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -8,7 +8,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { if (support) { - return support.isPrefabInstance(); + return support.isNestedPrefabInstance(); } return false; @@ -370,7 +370,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { return undefined; } - isNestedPreabInstance() { + isNestedPrefabInstance() { return this.isPrefabInstance() && this.getOwnerPrefabInstance() !== this.getObject(); } From 44041d76b7932a67999236866a6cd39d9fcf297a Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 2 Aug 2021 15:38:15 -0400 Subject: [PATCH 031/108] Scene Editor: allows lock/unlock prefab's position. --- CHANGELOG.MD | 5 ++ .../phasereditor2d.scene/src/ui/SceneMaker.ts | 7 +- .../src/ui/editor/DropManager.ts | 11 ++-- .../ui/editor/commands/SceneEditorCommands.ts | 4 +- .../ui/editor/undo/ConvertTypeOperation.ts | 6 ++ .../sceneobjects/GameObjectCodeDOMBuilder.ts | 66 +++++++++++++++++++ .../sceneobjects/GameObjectEditorSupport.ts | 8 +-- .../bitmapText/BitmapTextCodeDOMBuilder.ts | 12 ++-- .../image/BaseImageCodeDOMBuilder.ts | 13 ++-- .../sceneobjects/image/BaseImageExtension.ts | 2 +- .../sceneobjects/object/TransformComponent.ts | 4 +- .../properties/MoveToParentOperation.ts | 4 +- .../object/properties/TransformSection.ts | 2 +- .../object/tools/TranslateTool.ts | 8 +++ .../shapes/ellipse/EllipseCodeDOMBuilder.ts | 27 ++------ .../shapes/rect/RectangleCodeDOMBuilder.ts | 26 ++------ .../shapes/triangle/TriangleCodeDOMBuilder.ts | 57 +++++++--------- .../sceneobjects/text/TextCodeDOMBuilder.ts | 14 ++-- .../tilesprite/TileSpriteCodeDOMBuilder.ts | 24 ++----- 19 files changed, 164 insertions(+), 136 deletions(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 2f07e80fd..50e15bcda 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,5 +1,10 @@ # Change Log +## dev + +* Nested prefabs: + * Uses nullish operator (`??`) in prefab constructors. + ## v3.16.0-alpha.1 ### Added diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index 6bd80d131..733edc647 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -246,12 +246,9 @@ namespace phasereditor2d.scene.ui { label: "temporal" }); - const { x, y } = this.getCanvasCenterPoint(); + if (obj.getEditorSupport().isUnlockedProperty(sceneobjects.TransformComponent.x)) { - const transformComponent = obj.getEditorSupport() - .getComponent(sceneobjects.TransformComponent) as sceneobjects.TransformComponent; - - if (transformComponent) { + const { x, y } = this.getCanvasCenterPoint(); const sprite = obj as unknown as sceneobjects.ITransformLikeObject; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/DropManager.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/DropManager.ts index cfd7859cc..78f21f59c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/DropManager.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/DropManager.ts @@ -135,14 +135,11 @@ namespace phasereditor2d.scene.ui.editor { const sprite = await sceneMaker.createPrefabInstanceWithFile(data); - const transformComp = sprite.getEditorSupport() - .getComponent(sceneobjects.TransformComponent) as sceneobjects.TransformComponent; + if (sprite.getEditorSupport().hasComponent(sceneobjects.TransformComponent)) { - if (transformComp) { - - const obj = transformComp.getObject(); - obj.x = x; - obj.y = y; + sprite.getEditorSupport().setUnlockedProperty(sceneobjects.TransformComponent.x, true); + sprite.getEditorSupport().setUnlockedProperty(sceneobjects.TransformComponent.y, true); + (sprite as any as Phaser.GameObjects.Image).setPosition(x, y); } if (sprite) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index 9e6940f05..12e8932da 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -1090,7 +1090,9 @@ namespace phasereditor2d.scene.ui.editor.commands { const obj = args.activeEditor.getSelection()[0] as sceneobjects.ISceneGameObject; - const objData: core.json.IObjectData = {} as any; + const objData: core.json.IObjectData = { + unlock: ["x", "y"] + } as any; obj.getEditorSupport().writeJSON(objData); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/undo/ConvertTypeOperation.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/undo/ConvertTypeOperation.ts index 51814ffad..dae8648a7 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/undo/ConvertTypeOperation.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/undo/ConvertTypeOperation.ts @@ -82,6 +82,12 @@ namespace phasereditor2d.scene.ui.editor.undo { const type = ser.getType(); const ext = ScenePlugin.getInstance().getGameObjectExtensionByObjectType(type); + if (obj.getEditorSupport().isUnlockedProperty(sceneobjects.TransformComponent.x)) { + + ser.setUnlocked(sceneobjects.TransformComponent.x.name, true); + ser.setUnlocked(sceneobjects.TransformComponent.y.name, true); + } + ext.adaptDataAfterTypeConversion(ser, obj, this._extraData); result.objects.push({ diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectCodeDOMBuilder.ts index ae6dc6270..b232b9ccb 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectCodeDOMBuilder.ts @@ -30,6 +30,50 @@ namespace phasereditor2d.scene.ui.sceneobjects { */ abstract buildCreatePrefabInstanceCodeDOM(args: IBuildPrefabConstructorCodeDOMArgs): void; + /** + * Adds the X and Y arguments to the prefab's instance creation. + * + * @param args This method args. + */ + protected buildCreatePrefabInstanceCodeDOM_XY_Arguments(args: IBuildPrefabConstructorCodeDOMArgs) { + + const obj = args.obj as any as ITransformLikeObject; + const call = args.methodCallDOM; + + if (obj.getEditorSupport().isUnlockedPropertyXY(TransformComponent.position)) { + + call.argFloat(obj.x); + call.argFloat(obj.y); + + } else { + + call.arg("undefined"); + call.arg("undefined"); + } + } + + /** + * Adds the Width and Height arguments to the prefab's instance creation. + * + * @param args This method args. + */ + protected buildCreatePrefabInstanceCodeDOM_Size_Arguments(args: IBuildPrefabConstructorCodeDOMArgs) { + + const obj = args.obj as any as ISizeLikeObject; + const call = args.methodCallDOM; + + if (obj.getEditorSupport().isUnlockedPropertyXY(SizeComponent.size)) { + + call.argFloat(obj.width); + call.argFloat(obj.height); + + } else { + + call.arg("undefined"); + call.arg("undefined"); + } + } + /** * Build the CodeDOM of the prefab class constructor. * @@ -48,5 +92,27 @@ namespace phasereditor2d.scene.ui.sceneobjects { */ abstract buildPrefabConstructorDeclarationSupperCallCodeDOM( args: IBuildPrefabConstructorDeclarationSupperCallCodeDOMArgs): void; + + /** + * Adds the X and Y parameters to the `super` statement of a prefab constructor. + * + * @param args Method args + */ + protected buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args: IBuildPrefabConstructorDeclarationSupperCallCodeDOMArgs) { + + const obj = args.prefabObj; + const call = args.superMethodCallCodeDOM; + + if (obj.getEditorSupport().isUnlockedPropertyXY(TransformComponent.position)) { + + call.arg(`x ?? ${TransformComponent.x.getValue(obj)}`); + call.arg(`y ?? ${TransformComponent.y.getValue(obj)}`); + + } else { + + call.arg("x"); + call.arg("x"); + } + } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 5fc55f0b6..d32aa386a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -147,12 +147,12 @@ namespace phasereditor2d.scene.ui.sceneobjects { return !this.isUnlockedProperty(property); } - isUnlockedProperty(property: IProperty) { + isUnlockedPropertyXY(property: IPropertyXY) { - if (property === TransformComponent.x || property === TransformComponent.y) { + return this.isUnlockedProperty(property.x) && this.isUnlockedProperty(property.y); + } - return true; - } + isUnlockedProperty(property: IProperty) { if (this.isPrefabInstance()) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapTextCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapTextCodeDOMBuilder.ts index 814a3a861..ef8048ef9 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapTextCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapTextCodeDOMBuilder.ts @@ -27,8 +27,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { call.arg(args.sceneExpr); - call.argFloat(obj.x); - call.argFloat(obj.y); + this.buildCreatePrefabInstanceCodeDOM_XY_Arguments(args); if (support.isUnlockedProperty(BitmapTextComponent.font)) { @@ -44,8 +43,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { const ctr = args.ctrDeclCodeDOM; - ctr.arg("x", "number"); - ctr.arg("y", "number"); + ctr.arg("x", "number", true); + ctr.arg("y", "number", true); ctr.arg("font", "string", true); } @@ -57,8 +56,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.superMethodCallCodeDOM; - call.arg("x"); - call.arg("y"); + this.buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args); if (support.isLockedProperty(BitmapTextComponent.font)) { @@ -66,7 +64,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { } else { - call.arg("font || " + code.CodeDOM.quote(obj.font)); + call.arg("font ?? " + code.CodeDOM.quote(obj.font)); } } } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/image/BaseImageCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/image/BaseImageCodeDOMBuilder.ts index fa734dc69..f1c0253c5 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/image/BaseImageCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/image/BaseImageCodeDOMBuilder.ts @@ -19,8 +19,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.superMethodCallCodeDOM; - call.arg("x"); - call.arg("y"); + this.buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args); this.buildPrefabConstructorDeclarationSupperCallCodeDOM_TextureParameters(args, call); } @@ -58,7 +57,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { if (frameCode) { - call.arg("frame !== undefined && frame !== null ? frame : " + frameCode); + call.arg("frame ?? " + frameCode); } else { @@ -71,8 +70,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { const ctr = args.ctrDeclCodeDOM; - ctr.arg("x", "number"); - ctr.arg("y", "number"); + ctr.arg("x", "number", true); + ctr.arg("y", "number", true); ctr.arg("texture", "string", true); ctr.arg("frame", "number | string", true); } @@ -84,8 +83,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.methodCallDOM; call.arg(args.sceneExpr); - call.argFloat(obj.x); - call.argFloat(obj.y); + + this.buildCreatePrefabInstanceCodeDOM_XY_Arguments(args); if (support.isUnlockedProperty(TextureComponent.texture)) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/image/BaseImageExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/image/BaseImageExtension.ts index 189390678..79adeb108 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/image/BaseImageExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/image/BaseImageExtension.ts @@ -6,7 +6,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { async getAssetsFromObjectData(args: IGetAssetsFromObjectArgs): Promise { - const { key, frame } = args.serializer.read(TextureComponent.texture.name, {}) as ITextureKeys; + const { key } = args.serializer.read(TextureComponent.texture.name, {}) as ITextureKeys; const finder = args.finder; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/TransformComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/TransformComponent.ts index d08ca5a02..350fd715b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/TransformComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/TransformComponent.ts @@ -13,8 +13,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { export class TransformComponent extends Component { - static x = SimpleProperty("x", 0, "X", "phaser:Phaser.GameObjects.Components.Transform.x", true); - static y = SimpleProperty("y", 0, "Y", "phaser:Phaser.GameObjects.Components.Transform.y", true); + static x = SimpleProperty("x", 0, "X", "phaser:Phaser.GameObjects.Components.Transform.x"); + static y = SimpleProperty("y", 0, "Y", "phaser:Phaser.GameObjects.Components.Transform.y"); static position: IPropertyXY = { label: "Position", diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/MoveToParentOperation.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/MoveToParentOperation.ts index 29a5e1be1..c33ea69da 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/MoveToParentOperation.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/MoveToParentOperation.ts @@ -73,9 +73,9 @@ namespace phasereditor2d.scene.ui.sceneobjects { for (const obj of this.getEditor().getSelectedGameObjects()) { - const sprite = obj as unknown as Phaser.GameObjects.Sprite; + const sprite = obj as unknown as Sprite; - const hasPosition = obj.getEditorSupport().hasComponent(TransformComponent); + const hasPosition = obj.getEditorSupport().isUnlockedProperty(TransformComponent.x); const currentParent = getObjectParent(obj); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/TransformSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/TransformSection.ts index 63af614b0..2deb6b731 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/TransformSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/TransformSection.ts @@ -37,7 +37,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const comp = this.createGridElementWithPropertiesXY(parent); - this.createPropertyXYRow(comp, TransformComponent.position, false); + this.createPropertyXYRow(comp, TransformComponent.position); this.createPropertyXYRow(comp, TransformComponent.scale); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/TranslateTool.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/TranslateTool.ts index 904035959..37acd3b74 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/TranslateTool.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/tools/TranslateTool.ts @@ -22,5 +22,13 @@ namespace phasereditor2d.scene.ui.sceneobjects { y ); } + + onActivated(args: editor.tools.ISceneToolContextArgs) { + + super.onActivated(args); + + this.confirmUnlockProperty(args, [sceneobjects.TransformComponent.x, sceneobjects.TransformComponent.y], + "position", TransformSection.SECTION_ID); + } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/ellipse/EllipseCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/ellipse/EllipseCodeDOMBuilder.ts index 575f9a819..405143cd1 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/ellipse/EllipseCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/ellipse/EllipseCodeDOMBuilder.ts @@ -10,32 +10,18 @@ namespace phasereditor2d.scene.ui.sceneobjects { buildCreatePrefabInstanceCodeDOM(args: IBuildPrefabConstructorCodeDOMArgs) { - const obj = args.obj as TileSprite; - const support = obj.getEditorSupport(); - const call = args.methodCallDOM; - - call.arg(args.sceneExpr); - call.argFloat(obj.x); - call.argFloat(obj.y); + args.methodCallDOM.arg(args.sceneExpr); - if (support.isUnlockedProperty(SizeComponent.width)) { - - call.argFloat(obj.width); - call.argFloat(obj.height); - - } else { - - call.arg("undefined"); - call.arg("undefined"); - } + this.buildCreatePrefabInstanceCodeDOM_XY_Arguments(args); + this.buildCreatePrefabInstanceCodeDOM_Size_Arguments(args); } buildPrefabConstructorDeclarationCodeDOM(args: IBuildPrefabConstructorDeclarationCodeDOM): void { const ctr = args.ctrDeclCodeDOM; - ctr.arg("x", "number"); - ctr.arg("y", "number"); + ctr.arg("x", "number", true); + ctr.arg("y", "number", true); ctr.arg("width", "number", true); ctr.arg("height", "number", true); } @@ -48,8 +34,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.superMethodCallCodeDOM; - call.arg("x"); - call.arg("y"); + this.buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args); if (support.isUnlockedProperty(SizeComponent.width)) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/rect/RectangleCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/rect/RectangleCodeDOMBuilder.ts index 6060b5351..b21360968 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/rect/RectangleCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/rect/RectangleCodeDOMBuilder.ts @@ -10,32 +10,21 @@ namespace phasereditor2d.scene.ui.sceneobjects { buildCreatePrefabInstanceCodeDOM(args: IBuildPrefabConstructorCodeDOMArgs) { - const obj = args.obj as TileSprite; - const support = obj.getEditorSupport(); const call = args.methodCallDOM; call.arg(args.sceneExpr); - call.argFloat(obj.x); - call.argFloat(obj.y); - if (support.isUnlockedProperty(SizeComponent.width)) { + this.buildCreatePrefabInstanceCodeDOM_XY_Arguments(args); - call.argFloat(obj.width); - call.argFloat(obj.height); - - } else { - - call.arg("undefined"); - call.arg("undefined"); - } + this.buildCreatePrefabInstanceCodeDOM_Size_Arguments(args); } buildPrefabConstructorDeclarationCodeDOM(args: IBuildPrefabConstructorDeclarationCodeDOM): void { const ctr = args.ctrDeclCodeDOM; - ctr.arg("x", "number"); - ctr.arg("y", "number"); + ctr.arg("x", "number", true); + ctr.arg("y", "number", true); ctr.arg("width", "number", true); ctr.arg("height", "number", true); } @@ -48,13 +37,12 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.superMethodCallCodeDOM; - call.arg("x"); - call.arg("y"); + this.buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args); if (support.isUnlockedProperty(SizeComponent.width)) { - call.arg("typeof width === \"number\" ? width : " + obj.width); - call.arg("typeof height === \"number\" ? height : " + obj.height); + call.arg("width ?? " + obj.width); + call.arg("height ?? " + obj.height); } else { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/triangle/TriangleCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/triangle/TriangleCodeDOMBuilder.ts index 9c1435e86..c9efd839c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/triangle/TriangleCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/triangle/TriangleCodeDOMBuilder.ts @@ -15,26 +15,21 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.methodCallDOM; call.arg(args.sceneExpr); - call.argFloat(obj.x); - call.argFloat(obj.y); - if (support.isUnlockedProperty(SizeComponent.width)) { + this.buildCreatePrefabInstanceCodeDOM_XY_Arguments(args); + + for (const p of [TriangleComponent.p1, TriangleComponent.p2, TriangleComponent.p3]) { - call.argFloat(obj.x1); - call.argFloat(obj.y1); - call.argFloat(obj.x2); - call.argFloat(obj.y2); - call.argFloat(obj.x3); - call.argFloat(obj.y3); + if (support.isUnlockedPropertyXY(p)) { - } else { + call.argFloat(p.x.getValue(obj)); + call.argFloat(p.y.getValue(obj)); - call.arg("undefined"); - call.arg("undefined"); - call.arg("undefined"); - call.arg("undefined"); - call.arg("undefined"); - call.arg("undefined"); + } else { + + call.arg("undefined"); + call.arg("undefined"); + } } } @@ -42,8 +37,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { const ctr = args.ctrDeclCodeDOM; - ctr.arg("x", "number"); - ctr.arg("y", "number"); + ctr.arg("x", "number", true); + ctr.arg("y", "number", true); ctr.arg("x1", "number", true); ctr.arg("y1", "number", true); ctr.arg("x2", "number", true); @@ -60,26 +55,20 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.superMethodCallCodeDOM; - call.arg("x"); - call.arg("y"); + this.buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args); + + for (const p of [TriangleComponent.p1, TriangleComponent.p2, TriangleComponent.p3]) { - if (support.isUnlockedProperty(SizeComponent.width)) { + if (support.isUnlockedPropertyXY(p)) { - call.arg("typeof x1 === \"number\" ? x1 : " + obj.x1); - call.arg("typeof y1 === \"number\" ? y1 : " + obj.y1); - call.arg("typeof x2 === \"number\" ? x2 : " + obj.x2); - call.arg("typeof y2 === \"number\" ? y2 : " + obj.y2); - call.arg("typeof x3 === \"number\" ? x3 : " + obj.x3); - call.arg("typeof y3 === \"number\" ? y3 : " + obj.y3); + call.arg(`${p.x.name} ?? ${p.x.getValue(obj)}`); + call.arg(`${p.y.name} ?? ${p.y.getValue(obj)}`); - } else { + } else { - call.arg("x1"); - call.arg("y1"); - call.arg("x2"); - call.arg("y2"); - call.arg("x3"); - call.arg("y3"); + call.arg("undefined"); + call.arg("undefined"); + } } } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/text/TextCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/text/TextCodeDOMBuilder.ts index a1858e862..cf303506c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/text/TextCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/text/TextCodeDOMBuilder.ts @@ -19,21 +19,19 @@ namespace phasereditor2d.scene.ui.sceneobjects { buildCreatePrefabInstanceCodeDOM(args: IBuildPrefabConstructorCodeDOMArgs) { - const obj = args.obj as Text; const call = args.methodCallDOM; call.arg(args.sceneExpr); - call.argFloat(obj.x); - call.argFloat(obj.y); + + this.buildCreatePrefabInstanceCodeDOM_XY_Arguments(args); } buildPrefabConstructorDeclarationSupperCallCodeDOM( args: IBuildPrefabConstructorDeclarationSupperCallCodeDOMArgs): void { - const call = args.superMethodCallCodeDOM; + this.buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args); - call.arg("x"); - call.arg("y"); + const call = args.superMethodCallCodeDOM; if (!args.prefabObj.getEditorSupport().isPrefabInstance()) { @@ -46,8 +44,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { const ctr = args.ctrDeclCodeDOM; - ctr.arg("x", "number"); - ctr.arg("y", "number"); + ctr.arg("x", "number", true); + ctr.arg("y", "number", true); } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/tilesprite/TileSpriteCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/tilesprite/TileSpriteCodeDOMBuilder.ts index eb44361f4..e31149024 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/tilesprite/TileSpriteCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/tilesprite/TileSpriteCodeDOMBuilder.ts @@ -15,19 +15,10 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.methodCallDOM; call.arg(args.sceneExpr); - call.argFloat(obj.x); - call.argFloat(obj.y); - - if (support.isUnlockedProperty(SizeComponent.width)) { - call.argFloat(obj.width); - call.argFloat(obj.height); + this.buildCreatePrefabInstanceCodeDOM_XY_Arguments(args); - } else { - - call.arg("undefined"); - call.arg("undefined"); - } + this.buildCreatePrefabInstanceCodeDOM_Size_Arguments(args); if (support.isUnlockedProperty(TextureComponent.texture)) { @@ -40,8 +31,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { const ctr = args.ctrDeclCodeDOM; - ctr.arg("x", "number"); - ctr.arg("y", "number"); + ctr.arg("x", "number", true); + ctr.arg("y", "number", true); ctr.arg("width", "number", true); ctr.arg("height", "number", true); ctr.arg("texture", "string", true); @@ -56,13 +47,12 @@ namespace phasereditor2d.scene.ui.sceneobjects { const call = args.superMethodCallCodeDOM; - call.arg("x"); - call.arg("y"); + this.buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args); if (support.isUnlockedProperty(SizeComponent.width)) { - call.arg("typeof width === \"number\" ? width : " + obj.width); - call.arg("typeof height === \"number\" ? height : " + obj.height); + call.arg("width ?? " + obj.width); + call.arg("height ?? " + obj.height); } else { From 9ae7338525ad8665e68ab8905e6735ff46c730a8 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 2 Aug 2021 15:44:05 -0400 Subject: [PATCH 032/108] Scene Editor: fixes Shape section layout when a prefab instance is selected. --- .../src/ui/sceneobjects/shapes/ShapeSection.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/ShapeSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/ShapeSection.ts index 08d638801..0d7a940e8 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/ShapeSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/ShapeSection.ts @@ -16,18 +16,23 @@ namespace phasereditor2d.scene.ui.sceneobjects { this.createPropertyBoolean(comp, ShapeComponent.isFilled) .checkElement.style.gridColumn = "3 / span 2"; - this.createPropertyColorRow(comp, ShapeComponent.fillColor, false); + this.createPropertyColorRow(comp, ShapeComponent.fillColor, false) + .element.style.gridColumn = "3 / span 2"; - this.createPropertyFloatRow(comp, ShapeComponent.fillAlpha); + this.createPropertyFloatRow(comp, ShapeComponent.fillAlpha) + .style.gridColumn = "3 / span 2"; this.createPropertyBoolean(comp, ShapeComponent.isStroked) .checkElement.style.gridColumn = "3 / span 2"; - this.createPropertyColorRow(comp, ShapeComponent.strokeColor, false); + this.createPropertyColorRow(comp, ShapeComponent.strokeColor, false) + .element.style.gridColumn = "3 / span 2"; - this.createPropertyFloatRow(comp, ShapeComponent.strokeAlpha); + this.createPropertyFloatRow(comp, ShapeComponent.strokeAlpha) + .style.gridColumn = "3 / span 2"; - this.createPropertyFloatRow(comp, ShapeComponent.lineWidth); + this.createPropertyFloatRow(comp, ShapeComponent.lineWidth) + .style.gridColumn = "3 / span 2"; } canEdit(obj: any, n: number): boolean { From bd74add96efb54926a053fb4c196bdac009faa7a Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 2 Aug 2021 15:44:40 -0400 Subject: [PATCH 033/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 2f07e80fd..4722f8266 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -18,6 +18,7 @@ * [#135](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/135) Word wrap width does not behave correctly * Scene Editor: fixes Move To Parent dialog in context of prefab scenes. +* Scene Editor: fixes Scene section layout when shows a prefab's instance. ## v3.15.0 - Jul 11, 2021 From c9f88487233e8395f2571030ee3ee69ffd824f95 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 2 Aug 2021 16:48:11 -0400 Subject: [PATCH 034/108] Scene Editor: migrates pregab object's position lock. --- .../src/core/json/ISceneData.ts | 3 +- .../src/core/json/SceneWriter.ts | 3 +- .../core/json/Version1ToVersion2Migration.ts | 32 +++++++++++++++++++ .../phasereditor2d.scene/src/ui/SceneMaker.ts | 5 +++ 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 source/editor/plugins/phasereditor2d.scene/src/core/json/Version1ToVersion2Migration.ts diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/ISceneData.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/ISceneData.ts index 009f6a195..9e8316326 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/ISceneData.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/ISceneData.ts @@ -18,7 +18,8 @@ namespace phasereditor2d.scene.core.json { meta: { app: string, url: string, - contentType: string + contentType: string, + version?: number }; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneWriter.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneWriter.ts index c8a5a0abb..3df2a64d0 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneWriter.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneWriter.ts @@ -19,7 +19,8 @@ namespace phasereditor2d.scene.core.json { meta: { app: "Phaser Editor 2D - Scene Editor", url: "https://phasereditor2d.com", - contentType: core.CONTENT_TYPE_SCENE + contentType: core.CONTENT_TYPE_SCENE, + version: 2 } }; diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/Version1ToVersion2Migration.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/Version1ToVersion2Migration.ts new file mode 100644 index 000000000..9289c09a0 --- /dev/null +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/Version1ToVersion2Migration.ts @@ -0,0 +1,32 @@ +namespace phasereditor2d.scene.core.json { + + export class Version1ToVersion2Migration { + + migrate(data: ISceneData) { + + console.log("Migrating: unlock position by default"); + + this.migrateUnlockPosition(data.displayList); + + console.log(data); + } + + private migrateUnlockPosition(list?: IObjectData[]) { + + if (list) { + + for (const obj of list) { + + if (obj.prefabId) { + + console.log(`Migrating: unlock position of ${obj.label}(${obj.id})`); + obj.unlock = obj.unlock ?? []; + obj.unlock.push("x", "y"); + } + + this.migrateUnlockPosition(obj.list); + } + } + } + } +} \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index 733edc647..973cf7096 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -272,6 +272,11 @@ namespace phasereditor2d.scene.ui { createScene(sceneData: json.ISceneData, errors?: string[]) { + if (sceneData.meta.version === undefined || sceneData.meta.version === 1) { + // old version, perform unlock x & y migration + new json.Version1ToVersion2Migration().migrate(sceneData); + } + if (sceneData.settings) { this._editorScene.getSettings().readJSON(sceneData.settings); From 87038fb499cd5e76eb96cbe15a1aa3b1cf704a4e Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 2 Aug 2021 17:09:07 -0400 Subject: [PATCH 035/108] Removes extra log message. --- .../src/core/json/Version1ToVersion2Migration.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/Version1ToVersion2Migration.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/Version1ToVersion2Migration.ts index 9289c09a0..8ce8d9cd9 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/Version1ToVersion2Migration.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/Version1ToVersion2Migration.ts @@ -7,8 +7,6 @@ namespace phasereditor2d.scene.core.json { console.log("Migrating: unlock position by default"); this.migrateUnlockPosition(data.displayList); - - console.log(data); } private migrateUnlockPosition(list?: IObjectData[]) { From 098d5b48caf54678b0402f8b2799875e7c503188 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 2 Aug 2021 17:38:32 -0400 Subject: [PATCH 036/108] Nested prefab: preloads nested prefabs assets. --- .../src/ui/sceneobjects/container/ContainerExtension.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts index add683438..617326179 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts @@ -29,8 +29,9 @@ namespace phasereditor2d.scene.ui.sceneobjects { const list = []; const children = args.serializer.read("list", []) as json.IObjectData[]; + const nestedPrefabs = args.serializer.getData().nestedPrefabs ?? []; - for (const objData of children) { + for (const objData of [...children, ...nestedPrefabs]) { const ser = args.serializer.getSerializer(objData); From 2a4c0eb51681a248bec1cfe5e67ece15fc199e25 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 2 Aug 2021 18:42:48 -0400 Subject: [PATCH 037/108] Nested prefab: start with code generation of properties init. --- .../src/core/code/SceneCodeDOMBuilder.ts | 72 ++++++++++++++++--- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index d92bef87f..7df9241d8 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -292,7 +292,7 @@ namespace phasereditor2d.scene.core.code { body.push(...result.statements); - if ((prefabObj instanceof Container || prefabObj instanceof Layer) && !prefabObj.getEditorSupport().isPrefabInstance()) { + if (prefabObj instanceof Container || prefabObj instanceof Layer) { this.addChildrenObjects({ createMethodDecl: ctrDecl, @@ -363,10 +363,17 @@ namespace phasereditor2d.scene.core.code { for (const obj of this._scene.getDisplayListChildren()) { - body.push(new RawCodeDOM("")); - body.push(new RawCodeDOM("// " + obj.getEditorSupport().getLabel())); + if (obj.getEditorSupport().isNestedPrefabInstance()) { + + this.addCreateObjectCodeOfNestedPrefab(obj, createMethodDecl, lazyStatements); + + } else { + + body.push(new RawCodeDOM("")); + body.push(new RawCodeDOM("// " + obj.getEditorSupport().getLabel())); - this.addCreateObjectCode(obj, createMethodDecl, lazyStatements); + this.addCreateObjectCode(obj, createMethodDecl, lazyStatements); + } } this.addCreateListsCode(body); @@ -525,6 +532,28 @@ namespace phasereditor2d.scene.core.code { mainCreateMethodCall.setReturnToVar(varname); } } + private addCreateObjectCodeOfNestedPrefab(obj: ISceneGameObject, createMethodDecl: MethodDeclCodeDOM, lazyStatements: CodeDOM[]) { + + const varname = this.getPrefabInstanceVarName(obj); + + const result = this.buildSetObjectProperties({ + obj, + varname + }); + + lazyStatements.push(...result.lazyStatements); + + createMethodDecl.getBody().push(...result.statements); + + if (obj instanceof Container || obj instanceof Layer) { + + this.addChildrenObjects({ + createMethodDecl, + obj, + lazyStatements + }); + } + } private addCreateObjectCode(obj: ISceneGameObject, createMethodDecl: MethodDeclCodeDOM, lazyStatements: CodeDOM[]) { @@ -578,6 +607,7 @@ namespace phasereditor2d.scene.core.code { const objParent = ui.sceneobjects.getObjectParent(obj); + createMethodDecl.getBody().push(createObjectMethodCall); if (objSupport.isPrefabInstance()) { @@ -597,6 +627,7 @@ namespace phasereditor2d.scene.core.code { varname }); + if (result.statements.length + result.lazyStatements.length > 0) { createObjectMethodCall.setDeclareReturnToVar(true); @@ -623,7 +654,7 @@ namespace phasereditor2d.scene.core.code { createMethodDecl.getBody().push(addToParentCall); } - if ((obj instanceof Container || obj instanceof Layer) && !objSupport.isPrefabInstance()) { + if (obj instanceof Container || obj instanceof Layer) { createObjectMethodCall.setDeclareReturnToVar(true); @@ -655,6 +686,22 @@ namespace phasereditor2d.scene.core.code { } } + private getPrefabInstanceVarName(obj: ISceneGameObject) { + + const support = obj.getEditorSupport(); + + const varName = formatToValidVarName(support.getLabel()); + + if (support.isNestedPrefabInstance()) { + + const parentVarName = this.getPrefabInstanceVarName(ui.sceneobjects.getObjectParent(obj)); + + return parentVarName + "." + varName; + } + + return varName; + } + private buildSetObjectProperties(args: { obj: ISceneGameObject, varname: string @@ -695,12 +742,21 @@ namespace phasereditor2d.scene.core.code { lazyStatements: CodeDOM[] }) { + const body = args.createMethodDecl.getBody(); + for (const child of args.obj.getChildren()) { - args.createMethodDecl.getBody().push(new RawCodeDOM("")); - args.createMethodDecl.getBody().push(new RawCodeDOM("// " + child.getEditorSupport().getLabel())); + if (child.getEditorSupport().isNestedPrefabInstance()) { + + this.addCreateObjectCodeOfNestedPrefab(child, args.createMethodDecl, args.lazyStatements); - this.addCreateObjectCode(child, args.createMethodDecl, args.lazyStatements); + } else { + + body.push(new RawCodeDOM("")); + body.push(new RawCodeDOM("// " + child.getEditorSupport().getLabel())); + + this.addCreateObjectCode(child, args.createMethodDecl, args.lazyStatements); + } } } From e39ae94a3e178e2badfa93a1588d188921b8fad9 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 3 Aug 2021 00:46:24 -0400 Subject: [PATCH 038/108] Nested prefabs: component's code generation. --- .../src/ui/sceneobjects/SizeComponent.ts | 15 ++++++++++++++- .../bitmapText/BitmapTextComponent.ts | 9 +++++++++ .../sceneobjects/object/TransformComponent.ts | 13 +++++++++++++ .../shapes/triangle/TriangleComponent.ts | 18 +++++++++++++++++- .../sceneobjects/texture/TextureComponent.ts | 16 +++++++++++++++- 5 files changed, 68 insertions(+), 3 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/SizeComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/SizeComponent.ts index 4b4b84cd1..009c92b37 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/SizeComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/SizeComponent.ts @@ -29,7 +29,20 @@ namespace phasereditor2d.scene.ui.sceneobjects { buildSetObjectPropertiesCodeDOM(args: ISetObjectPropertiesCodeDOMArgs): void { - // this.buildSetObjectPropertyCodeDOM_FloatProperty(args, SizeComponent.width, SizeComponent.height); + const obj = this.getObject(); + const support = obj.getEditorSupport(); + const prop = SizeComponent.size; + + if (support.isNestedPrefabInstance() + && support.isUnlockedPropertyXY(prop)) { + + const dom = new core.code.MethodCallCodeDOM("setSize", args.objectVarName); + dom.argFloat(prop.x.getValue(obj)); + dom.argFloat(prop.y.getValue(obj)); + args.statements.push(dom); + args.statements.push( + new core.code.MethodCallCodeDOM("updateDisplayOrigin", args.objectVarName)); + } } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapTextComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapTextComponent.ts index e846fd691..ad3416775 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapTextComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapTextComponent.ts @@ -70,6 +70,15 @@ namespace phasereditor2d.scene.ui.sceneobjects { buildSetObjectPropertiesCodeDOM(args: ISetObjectPropertiesCodeDOMArgs): void { + const support = this.getObject().getEditorSupport(); + + if (support.isUnlockedProperty(BitmapTextComponent.font) && support.isNestedPrefabInstance()) { + + const dom = new core.code.MethodCallCodeDOM("setFont", args.objectVarName); + dom.argLiteral(this.getObject().font); + args.statements.push(dom); + } + this.buildSetObjectPropertyCodeDOM_FloatProperty(args, BitmapTextComponent.fontSize, BitmapTextComponent.align, diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/TransformComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/TransformComponent.ts index 350fd715b..1d5ebe2d8 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/TransformComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/TransformComponent.ts @@ -46,6 +46,19 @@ namespace phasereditor2d.scene.ui.sceneobjects { buildSetObjectPropertiesCodeDOM(args: ISetObjectPropertiesCodeDOMArgs): void { + const obj = this.getObject(); + const support = obj.getEditorSupport(); + const prop = TransformComponent.position; + + if (support.isNestedPrefabInstance() + && support.isUnlockedPropertyXY(prop)) { + + const dom = new core.code.MethodCallCodeDOM("setPosition", args.objectVarName); + dom.argFloat(prop.x.getValue(obj)); + dom.argFloat(prop.y.getValue(obj)); + args.statements.push(dom); + } + this.buildSetObjectPropertyCodeDOM_FloatProperty( args, TransformComponent.scaleX, diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/triangle/TriangleComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/triangle/TriangleComponent.ts index 9eb7d5d44..03e8b7d36 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/triangle/TriangleComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/shapes/triangle/TriangleComponent.ts @@ -39,7 +39,23 @@ namespace phasereditor2d.scene.ui.sceneobjects { buildSetObjectPropertiesCodeDOM(args: ISetObjectPropertiesCodeDOMArgs) { - // nothing + const obj = this.getObject(); + const support = obj.getEditorSupport(); + + if (support.isNestedPrefabInstance() && + (support.isUnlockedPropertyXY(TriangleComponent.p1) + || support.isUnlockedPropertyXY(TriangleComponent.p2) + || support.isUnlockedPropertyXY(TriangleComponent.p3))) { + + const dom = new core.code.MethodCallCodeDOM("setTo", args.objectVarName); + dom.argFloat(obj.x1); + dom.argFloat(obj.y1); + dom.argFloat(obj.x2); + dom.argFloat(obj.y2); + dom.argFloat(obj.x3); + dom.argFloat(obj.y3); + args.statements.push(dom); + } } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/texture/TextureComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/texture/TextureComponent.ts index f78a15284..18b71b775 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/texture/TextureComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/texture/TextureComponent.ts @@ -46,11 +46,25 @@ namespace phasereditor2d.scene.ui.sceneobjects { super(obj, [ TextureComponent.texture ]); + this._textureKeys = {}; } buildSetObjectPropertiesCodeDOM(args: ISetObjectPropertiesCodeDOMArgs): void { - // nothing, the properties are set when the object is created. + + const obj = this.getObject(); + const support = obj.getEditorSupport(); + const prop = TextureComponent.texture; + + if (support.isNestedPrefabInstance() + && support.isUnlockedProperty(prop)) { + + const dom = new core.code.MethodCallCodeDOM("setTexture", args.objectVarName); + const keys = prop.getValue(obj) as ITextureKeys; + dom.argLiteral(keys.key); + dom.argStringOrFloat(keys.frame); + args.statements.push(dom); + } } getTextureKeys(): ITextureKeys { From a8ce3acc51df82a16a819b40f7aeec511a5d1d56 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 3 Aug 2021 01:06:13 -0400 Subject: [PATCH 039/108] Nested prefabs: prevents errors when nested prefab is not public. --- .../phasereditor2d.scene/src/core/json/SceneFinder.ts | 5 +++++ .../src/ui/sceneobjects/GameObjectEditorSupport.ts | 7 ++++++- .../src/ui/sceneobjects/container/ContainerExtension.ts | 6 ++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts index d41e538f2..0809aad32 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts @@ -330,6 +330,11 @@ namespace phasereditor2d.scene.core.json { return this._prefabFiles; } + existsPrefab(prefabId: string) { + + return this._prefabObjectId_ObjectData_Map.has(prefabId); + } + getPrefabData(prefabId: string): IObjectData { return this._prefabObjectId_ObjectData_Map.get(prefabId); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index d32aa386a..40ce0a25d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -632,13 +632,18 @@ namespace phasereditor2d.scene.ui.sceneobjects { protected readNestedPrefabData(objData: json.IObjectData) { + const finder = ScenePlugin.getInstance().getSceneFinder(); + const list = objData.nestedPrefabs || []; const map = new Map(); for (const data of list) { - map.set(data.prefabId, data); + if (finder.existsPrefab(data.prefabId)) { + + map.set(data.prefabId, data); + } } return map; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts index 617326179..b13ee11d6 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts @@ -26,10 +26,12 @@ namespace phasereditor2d.scene.ui.sceneobjects { static async getAssetsFromNestedData(args: IGetAssetsFromObjectArgs) { - const list = []; + const sceneFinder = ScenePlugin.getInstance().getSceneFinder(); + const list = []; const children = args.serializer.read("list", []) as json.IObjectData[]; - const nestedPrefabs = args.serializer.getData().nestedPrefabs ?? []; + const nestedPrefabs = (args.serializer.getData().nestedPrefabs ?? []) + .filter(data => sceneFinder.existsPrefab(data.prefabId)); for (const objData of [...children, ...nestedPrefabs]) { From 2824ad7eb769b5a437208af9603e0530804a0794 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 3 Aug 2021 01:21:15 -0400 Subject: [PATCH 040/108] Nested prefab: recovers from missing nested prefab. --- .../phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts | 3 ++- .../src/ui/sceneobjects/container/ContainerEditorSupport.ts | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index 7df9241d8..c45d93ccf 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -743,6 +743,7 @@ namespace phasereditor2d.scene.core.code { }) { const body = args.createMethodDecl.getBody(); + const parentIsPrefab = args.obj.getEditorSupport().isPrefabInstance(); for (const child of args.obj.getChildren()) { @@ -750,7 +751,7 @@ namespace phasereditor2d.scene.core.code { this.addCreateObjectCodeOfNestedPrefab(child, args.createMethodDecl, args.lazyStatements); - } else { + } else if (!parentIsPrefab) { body.push(new RawCodeDOM("")); body.push(new RawCodeDOM("// " + child.getEditorSupport().getLabel())); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index e8f2069e2..a535b8bb1 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -78,12 +78,16 @@ namespace phasereditor2d.scene.ui.sceneobjects { super.writeJSON(containerData); + const finder = ScenePlugin.getInstance().getSceneFinder(); + if (this.isPrefabInstance()) { containerData.nestedPrefabs = this.getObject().getChildren() .filter(obj => obj.getEditorSupport().isPrefabInstance()) + .filter(obj => finder.existsPrefab(obj.getEditorSupport().getPrefabId())) + .map(obj => { const objData = {} as json.IObjectData; From de0339e769e882adccdc45f11aa4aadba7f40920 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 3 Aug 2021 03:49:46 -0400 Subject: [PATCH 041/108] Nested prefab: renamed "public prefab" to "nested prefab". --- .../plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts | 2 +- .../editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts | 2 +- .../phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts | 4 ++-- .../src/ui/sceneobjects/object/VariableComponent.ts | 2 +- .../object/properties/GameObjectVariableSection.ts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts index 0809aad32..41da9de51 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts @@ -262,7 +262,7 @@ namespace phasereditor2d.scene.core.json { for (const c of objData.list) { - if (c.scope === ui.sceneobjects.ObjectScope.PREFAB_PUBLIC) { + if (c.scope === ui.sceneobjects.ObjectScope.NESTED_PREFAB) { prefabObjectId_ObjectData_Map.set(c.id, c); prefabId_File_Map.set(c.id, file); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index 973cf7096..bce4bac3c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -474,7 +474,7 @@ namespace phasereditor2d.scene.ui { try { if (parent && parent.getEditorSupport().isPrefabInstance() - && data.scope === sceneobjects.ObjectScope.PREFAB_PUBLIC) { + && data.scope === sceneobjects.ObjectScope.NESTED_PREFAB) { data = { id: Phaser.Utils.String.UUID(), diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts index ddf62ec62..d00900d7f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts @@ -7,7 +7,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { METHOD = "METHOD", CLASS = "CLASS", PUBLIC = "PUBLIC", - PREFAB_PUBLIC = "PREFAB_PUBLIC" + NESTED_PREFAB = "NESTED_PREFAB" } export abstract class EditorSupport { @@ -86,7 +86,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { isPublic() { return this._scope === ObjectScope.PUBLIC - || this._scope === ObjectScope.PREFAB_PUBLIC; + || this._scope === ObjectScope.NESTED_PREFAB; } setScope(scope: ObjectScope) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/VariableComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/VariableComponent.ts index 6b4fe2fbe..28a4b8691 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/VariableComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/VariableComponent.ts @@ -18,7 +18,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { local: true, getValue: obj => obj.getEditorSupport().getScope(), setValue: (obj, value) => obj.getEditorSupport().setScope(value), - values: [ObjectScope.METHOD, ObjectScope.CLASS, ObjectScope.PUBLIC, ObjectScope.PREFAB_PUBLIC], + values: [ObjectScope.METHOD, ObjectScope.CLASS, ObjectScope.PUBLIC, ObjectScope.NESTED_PREFAB], getValueLabel: value => value.split("_").map(v => v[0] + v.substring(1).toLowerCase()).join(" ") }; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts index 7b7c9daa3..f72d8ee95 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/GameObjectVariableSection.ts @@ -86,7 +86,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { return true; } - return scope !== ObjectScope.PREFAB_PUBLIC; + return scope !== ObjectScope.NESTED_PREFAB; }); } } From ac0c53dcd7b78aea80deb9014887957ef8cf91da Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 3 Aug 2021 19:05:19 -0400 Subject: [PATCH 042/108] Nested prefab: denies deleting nested prefab. --- .../src/ui/editor/commands/SceneEditorCommands.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index 12e8932da..f003d38aa 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -54,6 +54,14 @@ namespace phasereditor2d.scene.ui.editor.commands { )); } + function noNestedPrefabSelected(args: colibri.ui.ide.commands.HandlerArgs) { + + return args.activeEditor.getSelection() + .filter(obj => ui.sceneobjects.isGameObject(obj)) + .filter((obj: ui.sceneobjects.ISceneGameObject) => obj.getEditorSupport().isNestedPrefabInstance()) + .length === 0; + } + function isOnlyContainerSelected(args: colibri.ui.ide.commands.HandlerArgs) { return isSceneScope(args) && editorHasSelection(args) @@ -602,7 +610,7 @@ namespace phasereditor2d.scene.ui.editor.commands { manager.addHandlerHelper(colibri.ui.ide.actions.CMD_DELETE, - args => isSceneScope(args) && args.activeEditor.getSelection().length > 0, + args => isSceneScope(args) && args.activeEditor.getSelection().length > 0 && noNestedPrefabSelected(args), args => args.activeEditor.getUndoManager() .add(new undo.DeleteOperation(args.activeEditor as SceneEditor)) From 2418a447d39f006a255716ee835ba850f308cf4d Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 3 Aug 2021 19:13:01 -0400 Subject: [PATCH 043/108] Nested prefab: allows selecting nested prefab in the scene. --- .../src/ui/editor/SelectionManager.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts index ec9d3d83f..8f8192c09 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts @@ -138,9 +138,17 @@ namespace phasereditor2d.scene.ui.editor { const obj = selected as sceneobjects.ISceneGameObject; - const owner = obj.getEditorSupport().getOwnerPrefabInstance(); + const objSupport = obj.getEditorSupport(); - selected = owner ?? selected; + const owner = objSupport.getOwnerPrefabInstance(); + + if (objSupport.isNestedPrefabInstance() && owner instanceof sceneobjects.Container + && owner.getEditorSupport().isAllowPickChildren()) { + // ok, it can be selected + } else { + + selected = owner ?? selected; + } } if (selected) { From 3238f13ebba1cf1e63c16090579557ae2614a33c Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 4 Aug 2021 01:37:41 -0400 Subject: [PATCH 044/108] Nested prefab: fixes nestedPrefab condition test. --- .../colibri/src/core/json/Serialization.ts | 5 +++ .../src/core/json/IObjectData.ts | 1 + .../phasereditor2d.scene/src/ui/SceneMaker.ts | 2 + .../sceneobjects/GameObjectEditorSupport.ts | 42 +++++++++++-------- .../container/ContainerEditorSupport.ts | 2 +- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/source/editor/plugins/colibri/src/core/json/Serialization.ts b/source/editor/plugins/colibri/src/core/json/Serialization.ts index bdaeb5626..e0ee0144a 100644 --- a/source/editor/plugins/colibri/src/core/json/Serialization.ts +++ b/source/editor/plugins/colibri/src/core/json/Serialization.ts @@ -18,6 +18,11 @@ namespace colibri.core.json { return defaultValue; } + export function copy(data: any) { + + return JSON.parse(JSON.stringify(data)); + } + export function getDataValue(data: any, key: string) { let result = data; diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts index e8bd9fd1a..b38e682e8 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts @@ -4,6 +4,7 @@ namespace phasereditor2d.scene.core.json { id: string; type?: string; prefabId?: string; + isNestedPrefab?:boolean; components?: string[], label: string; unlock?: string[]; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index bce4bac3c..70e1387d7 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -233,6 +233,7 @@ namespace phasereditor2d.scene.ui { const content = await FileUtils.preloadAndGetFileString(file); if (!content) { + return null; } @@ -479,6 +480,7 @@ namespace phasereditor2d.scene.ui { data = { id: Phaser.Utils.String.UUID(), prefabId: data.id, + isNestedPrefab: true, label: data.label, }; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 40ce0a25d..0fa06150b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -37,6 +37,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { // tslint:disable-next-line:ban-types private _componentMap: Map>; private _unlockedProperties: Set; + private _isNestedPrefabInstance: boolean; constructor(extension: SceneGameObjectExtension, obj: T, scene: Scene) { super(obj, extension.getTypeName().toLowerCase(), scene); @@ -45,6 +46,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { this._unlockedProperties = new Set(); this._serializables = []; this._componentMap = new Map(); + this._isNestedPrefabInstance = false; obj.setDataEnabled(); @@ -372,7 +374,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { isNestedPrefabInstance() { - return this.isPrefabInstance() && this.getOwnerPrefabInstance() !== this.getObject(); + return this._isNestedPrefabInstance; } isPrefabInstance() { @@ -388,7 +390,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const list: Array = []; - this.getAllParents2(list); + this.getAllParents2(this.getObject(), list); return list; } @@ -415,15 +417,15 @@ namespace phasereditor2d.scene.ui.sceneobjects { return set.has(parent); } - private getAllParents2(list: Array) { - - const obj = this.getObject(); + private getAllParents2(obj: ISceneGameObject, list: Array) { const objParent = GameObjectEditorSupport.getObjectParent(obj); if (objParent) { list.push(objParent); + + this.getAllParents2(objParent, list); } return list; @@ -441,6 +443,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { getNestedPrefabs(): ISceneGameObject[] { + if (!this.isPrefabInstance()) { + + return []; + } + const obj = this.getObject(); if (obj instanceof Layer || obj instanceof Container) { @@ -449,7 +456,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { for (const child of obj.getChildren()) { - if (child.getEditorSupport().isPrefabInstance()) { + if (child.getEditorSupport().isNestedPrefabInstance()) { result.push(child); } @@ -463,23 +470,19 @@ namespace phasereditor2d.scene.ui.sceneobjects { getOwnerPrefabInstance(): ISceneGameObject { - const obj = this.getObject(); - - if (obj.parentContainer) { - - const parent = obj.parentContainer as unknown as ISceneGameObject; + const parents = this.getAllParents().reverse(); - const owner = parent.getEditorSupport().getOwnerPrefabInstance(); + for (const parent of parents) { - if (owner) { + if (parent.getEditorSupport().isPrefabInstance()) { - return owner; + return parent; } } - if (obj.getEditorSupport().isPrefabInstance()) { + if (this.isPrefabInstance()) { - return obj; + return this.getObject(); } return null; @@ -622,6 +625,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { this.setId(data.id); this._prefabId = data.prefabId; + this._isNestedPrefabInstance = data.isNestedPrefab ?? false; this._unlockedProperties = new Set(data["unlock"] ?? []); for (const s of this._serializables) { @@ -642,7 +646,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { if (finder.existsPrefab(data.prefabId)) { - map.set(data.prefabId, data); + const copy = colibri.core.json.copy(data) as core.json.IObjectData; + + copy.isNestedPrefab = true; + + map.set(data.prefabId, copy); } } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index a535b8bb1..d51b6cb93 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -128,7 +128,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { for (const objData of list) { - let sprite:ISceneGameObject; + let sprite: ISceneGameObject; if (nestedPrefabMap.has(objData.id)) { From fa8e3a8d802ba02efbaac233931aed5158788cd6 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 4 Aug 2021 03:28:32 -0400 Subject: [PATCH 045/108] Nested prefab: fixes prefab status computation. --- .../phasereditor2d.scene/src/ui/SceneMaker.ts | 1 + .../src/ui/editor/SelectionManager.ts | 3 +- .../sceneobjects/GameObjectEditorSupport.ts | 28 +++++++++++++++++++ .../container/ContainerEditorSupport.ts | 2 +- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index 70e1387d7..31d49c7e2 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -481,6 +481,7 @@ namespace phasereditor2d.scene.ui { id: Phaser.Utils.String.UUID(), prefabId: data.id, isNestedPrefab: true, + nestedPrefabs: data.nestedPrefabs, label: data.label, }; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts index 8f8192c09..c386c17f6 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts @@ -142,7 +142,8 @@ namespace phasereditor2d.scene.ui.editor { const owner = objSupport.getOwnerPrefabInstance(); - if (objSupport.isNestedPrefabInstance() && owner instanceof sceneobjects.Container + if (owner instanceof sceneobjects.Container + && objSupport.isAccessibleNestedPrefab() && owner.getEditorSupport().isAllowPickChildren()) { // ok, it can be selected } else { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 0fa06150b..9341b5d5a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -372,6 +372,34 @@ namespace phasereditor2d.scene.ui.sceneobjects { return undefined; } + isAccessibleNestedPrefab() { + + if (this.isNestedPrefabInstance()) { + + const parent = getObjectParent(this.getObject()) as ISceneGameObject; + + return parent.getEditorSupport().isNestedPrefabInstance() + || parent.getEditorSupport().isPrefabInstanceRoot(); + } + + return false; + } + + isPrefabInstanceRoot() { + + if (this.isPrefabInstance() && !this.isNestedPrefabInstance()) { + + const parent = getObjectParent(this.getObject()); + + if (!parent || !parent.getEditorSupport().isPrefabInstance()) { + + return true; + } + } + + return false; + } + isNestedPrefabInstance() { return this._isNestedPrefabInstance; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index d51b6cb93..9b15e96c6 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -84,7 +84,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { containerData.nestedPrefabs = this.getObject().getChildren() - .filter(obj => obj.getEditorSupport().isPrefabInstance()) + .filter(obj => obj.getEditorSupport().isNestedPrefabInstance()) .filter(obj => finder.existsPrefab(obj.getEditorSupport().getPrefabId())) From d2de78ed52831e598167ea42573b25776103ea05 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 4 Aug 2021 11:28:30 -0400 Subject: [PATCH 046/108] Update container's code dom build with new position methods. --- .../container/ContainerCodeDOMBuilder.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerCodeDOMBuilder.ts index 2e79a0a3f..78bf5333d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerCodeDOMBuilder.ts @@ -13,28 +13,24 @@ namespace phasereditor2d.scene.ui.sceneobjects { buildPrefabConstructorDeclarationSupperCallCodeDOM( args: IBuildPrefabConstructorDeclarationSupperCallCodeDOMArgs): void { - const call = args.superMethodCallCodeDOM; - - call.arg("x"); - call.arg("y"); + this.buildPrefabConstructorDeclarationSupperCallCodeDOM_XYParameters(args); } buildPrefabConstructorDeclarationCodeDOM(args: IBuildPrefabConstructorDeclarationCodeDOM): void { const ctr = args.ctrDeclCodeDOM; - ctr.arg("x", "number"); - ctr.arg("y", "number"); + ctr.arg("x", "number", true); + ctr.arg("y", "number", true); } buildCreatePrefabInstanceCodeDOM(args: IBuildPrefabConstructorCodeDOMArgs) { - const obj = args.obj as Container; const call = args.methodCallDOM; call.arg(args.sceneExpr); - call.argFloat(obj.x); - call.argFloat(obj.y); + + this.buildCreatePrefabInstanceCodeDOM_XY_Arguments(args); } buildCreateObjectWithFactoryCodeDOM(args: IBuildObjectFactoryCodeDOMArgs): code.MethodCallCodeDOM { From d26fccf5f9c4fe22ef17b8a61b6e66bea9635f96 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 4 Aug 2021 14:24:14 -0400 Subject: [PATCH 047/108] Neted prefabs: improves selection behavior. --- .../src/ui/editor/SelectionManager.ts | 2 +- .../sceneobjects/GameObjectEditorSupport.ts | 19 +++++++++++++++---- .../container/ContainerEditorSupport.ts | 5 +++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts index c386c17f6..309ad5606 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts @@ -143,7 +143,7 @@ namespace phasereditor2d.scene.ui.editor { const owner = objSupport.getOwnerPrefabInstance(); if (owner instanceof sceneobjects.Container - && objSupport.isAccessibleNestedPrefab() + && objSupport.isActiveNestedPrefab() && owner.getEditorSupport().isAllowPickChildren()) { // ok, it can be selected } else { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 9341b5d5a..73d1fc606 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -372,19 +372,30 @@ namespace phasereditor2d.scene.ui.sceneobjects { return undefined; } - isAccessibleNestedPrefab() { + /** + * Checks if it is a nested prefab instance that can be modified (published to the scene, + * accessible from the prefab instance's root). + * + * @returns If active. + */ + isActiveNestedPrefab() { if (this.isNestedPrefabInstance()) { const parent = getObjectParent(this.getObject()) as ISceneGameObject; + const parentSupport = parent.getEditorSupport(); - return parent.getEditorSupport().isNestedPrefabInstance() - || parent.getEditorSupport().isPrefabInstanceRoot(); + return parentSupport.isNestedPrefabInstance() + || parentSupport.isPrefabInstanceRoot(); } return false; } - + /** + * Checks if the object is a prefab instance and the parent isn't a prefab instance. + * + * @returns If it is the root. + */ isPrefabInstanceRoot() { if (this.isPrefabInstance() && !this.isNestedPrefabInstance()) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 9b15e96c6..f0fdba716 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -84,7 +84,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { containerData.nestedPrefabs = this.getObject().getChildren() - .filter(obj => obj.getEditorSupport().isNestedPrefabInstance()) + .filter(obj => obj.getEditorSupport().isActiveNestedPrefab()) .filter(obj => finder.existsPrefab(obj.getEditorSupport().getPrefabId())) @@ -130,7 +130,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { let sprite: ISceneGameObject; - if (nestedPrefabMap.has(objData.id)) { + if (objData.scope === ObjectScope.NESTED_PREFAB + && nestedPrefabMap.has(objData.id)) { const prefabData = nestedPrefabMap.get(objData.id); From 752c285eb71f4eb19ad6190c9abc5d45c9e2b361 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 4 Aug 2021 16:03:08 -0400 Subject: [PATCH 048/108] Nested prefab: syntax changes. --- .../src/core/json/SceneFinder.ts | 13 +++++++++++++ .../phasereditor2d.scene/src/ui/SceneMaker.ts | 3 ++- .../src/ui/sceneobjects/GameObjectEditorSupport.ts | 5 ----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts index 41da9de51..057326689 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts @@ -266,9 +266,22 @@ namespace phasereditor2d.scene.core.json { prefabObjectId_ObjectData_Map.set(c.id, c); prefabId_File_Map.set(c.id, file); + + this.mapNestedPrefabData(prefabObjectId_ObjectData_Map, prefabId_File_Map, file, c); } } } + + if (objData.nestedPrefabs && objData.scope === ui.sceneobjects.ObjectScope.NESTED_PREFAB) { + + for (const c of objData.nestedPrefabs) { + + prefabObjectId_ObjectData_Map.set(c.id, c); + prefabId_File_Map.set(c.id, file); + + this.mapNestedPrefabData(prefabObjectId_ObjectData_Map, prefabId_File_Map, file, c); + } + } } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index 31d49c7e2..5e15ab20f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -474,7 +474,8 @@ namespace phasereditor2d.scene.ui { try { - if (parent && parent.getEditorSupport().isPrefabInstance() + if (parent + && parent.getEditorSupport().isPrefabInstance() && data.scope === sceneobjects.ObjectScope.NESTED_PREFAB) { data = { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 73d1fc606..59c26e47c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -420,11 +420,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { return typeof this._prefabId === "string"; } - _setPrefabId(prefabId: string) { - - this._prefabId = prefabId; - } - getAllParents() { const list: Array = []; From 7851fcd991594288d2a45e8f11574031534c151d Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Fri, 6 Aug 2021 16:53:21 -0400 Subject: [PATCH 049/108] Nested prefabs: some steps in the wrong direction. --- .../src/core/json/IObjectData.ts | 1 - .../src/core/json/SceneFinder.ts | 20 ++++++- .../phasereditor2d.scene/src/ui/SceneMaker.ts | 43 +++++++++----- .../sceneobjects/GameObjectEditorSupport.ts | 56 ++++++++++++++++--- .../container/ContainerEditorSupport.ts | 22 ++++++-- .../container/ContainerExtension.ts | 10 ++-- 6 files changed, 119 insertions(+), 33 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts index b38e682e8..e8bd9fd1a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/IObjectData.ts @@ -4,7 +4,6 @@ namespace phasereditor2d.scene.core.json { id: string; type?: string; prefabId?: string; - isNestedPrefab?:boolean; components?: string[], label: string; unlock?: string[]; diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts index 057326689..cf7a8159d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts @@ -272,7 +272,7 @@ namespace phasereditor2d.scene.core.json { } } - if (objData.nestedPrefabs && objData.scope === ui.sceneobjects.ObjectScope.NESTED_PREFAB) { + if (objData.nestedPrefabs) { for (const c of objData.nestedPrefabs) { @@ -284,7 +284,6 @@ namespace phasereditor2d.scene.core.json { } } - getUserComponentsFiles() { return this._compFiles; @@ -343,6 +342,23 @@ namespace phasereditor2d.scene.core.json { return this._prefabFiles; } + getOriginalPrefabId(prefabId: string): string | undefined { + + const objData = this.getPrefabData(prefabId); + + if (!objData) { + + return undefined; + } + + if (objData.prefabId) { + + return this.getOriginalPrefabId(objData.prefabId); + } + + return prefabId; + } + existsPrefab(prefabId: string) { return this._prefabObjectId_ObjectData_Map.has(prefabId); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index 5e15ab20f..feba3accc 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -247,6 +247,8 @@ namespace phasereditor2d.scene.ui { label: "temporal" }); + this.postProcessingOfNestedPrefabs(obj); + if (obj.getEditorSupport().isUnlockedProperty(sceneobjects.TransformComponent.x)) { const { x, y } = this.getCanvasCenterPoint(); @@ -267,6 +269,34 @@ namespace phasereditor2d.scene.ui { } } + private postProcessingOfNestedPrefabs(obj: sceneobjects.ISceneGameObject) { + + const support = obj.getEditorSupport(); + + if (support.getScope() === sceneobjects.ObjectScope.NESTED_PREFAB) { + + support.setPrefabId(support.getId()); + support.setIsNestedPrefabInstance(true); + support.setId(Phaser.Utils.String.UUID()); + support.setScope(sceneobjects.ObjectScope.METHOD); + + } else { + + if (support.isActiveNestedPrefab()) { + + support.setPrefabId(support.getId()); + support.setId(Phaser.Utils.String.UUID()); + } + } + + const list = sceneobjects.getObjectChildren(obj); + + for(const child of list) { + + // this.postProcessingOfNestedPrefabs(child); + } + } + getSerializer(data: json.IObjectData) { return new json.Serializer(data); } @@ -474,19 +504,6 @@ namespace phasereditor2d.scene.ui { try { - if (parent - && parent.getEditorSupport().isPrefabInstance() - && data.scope === sceneobjects.ObjectScope.NESTED_PREFAB) { - - data = { - id: Phaser.Utils.String.UUID(), - prefabId: data.id, - isNestedPrefab: true, - nestedPrefabs: data.nestedPrefabs, - label: data.label, - }; - } - const ser = this.getSerializer(data); const type = ser.getType(); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index 59c26e47c..ec5d94c9b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -19,6 +19,16 @@ namespace phasereditor2d.scene.ui.sceneobjects { return GameObjectEditorSupport.hasEditorSupport(obj); } + export function getObjectChildren(obj: ISceneGameObject) { + + if (obj instanceof Layer || obj instanceof Container) { + + return obj.getChildren(); + } + + return []; + } + export function getObjectParent(obj: ISceneGameObject) { return GameObjectEditorSupport.getObjectParent(obj); @@ -188,6 +198,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { } } + _clearUnlockProperties() { + + this._unlockedProperties.clear(); + } + private static async buildPrefabDependencyHash(builder: ide.core.MultiHashBuilder, prefabId: string) { if (!prefabId) { @@ -416,6 +431,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this._isNestedPrefabInstance; } + setIsNestedPrefabInstance(isNestedPrefabImage: boolean) { + + this._isNestedPrefabInstance = isNestedPrefabImage; + } + isPrefabInstance() { return typeof this._prefabId === "string"; } @@ -527,6 +547,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this._prefabId; } + setPrefabId(id: string) { + + this._prefabId = id; + } + getPrefabName() { const file = this.getPrefabFile(); @@ -659,7 +684,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { this.setId(data.id); this._prefabId = data.prefabId; - this._isNestedPrefabInstance = data.isNestedPrefab ?? false; this._unlockedProperties = new Set(data["unlock"] ?? []); for (const s of this._serializables) { @@ -668,26 +692,42 @@ namespace phasereditor2d.scene.ui.sceneobjects { } } - protected readNestedPrefabData(objData: json.IObjectData) { + static readNestedPrefabData(objData: json.IObjectData, map?: Map, foreignPrefab = false) { + + map = map ?? new Map(); const finder = ScenePlugin.getInstance().getSceneFinder(); const list = objData.nestedPrefabs || []; - const map = new Map(); - for (const data of list) { - if (finder.existsPrefab(data.prefabId)) { + const id = finder.getOriginalPrefabId(data.prefabId); + + if (id && !map.has(id)) { + + if (foreignPrefab) { - const copy = colibri.core.json.copy(data) as core.json.IObjectData; + const copy = colibri.core.json.copy(data); + copy.prefabId = data.id; + copy.id = Phaser.Utils.String.UUID(); - copy.isNestedPrefab = true; + map.set(id, copy); - map.set(data.prefabId, copy); + } else { + + map.set(id, data); + } } } + if (objData.prefabId) { + + const prefabData = finder.getPrefabData(objData.prefabId); + + this.readNestedPrefabData(prefabData, map, true); + } + return map; } } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index f0fdba716..7d1558b6b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -118,7 +118,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const list = ser.read("list", []) as json.IObjectData[]; - const nestedPrefabMap = this.readNestedPrefabData(containerData); + const nestedPrefabMap = GameObjectEditorSupport.readNestedPrefabData(containerData); const maker = this.getScene().getMaker(); @@ -130,16 +130,30 @@ namespace phasereditor2d.scene.ui.sceneobjects { let sprite: ISceneGameObject; - if (objData.scope === ObjectScope.NESTED_PREFAB - && nestedPrefabMap.has(objData.id)) { + if (objData.scope === ObjectScope.NESTED_PREFAB && nestedPrefabMap.has(objData.id)) { const prefabData = nestedPrefabMap.get(objData.id); sprite = maker.createObject(prefabData); + sprite.getEditorSupport().setIsNestedPrefabInstance(true); } else { - sprite = maker.createObject(objData, undefined, container); + if (this.isPrefabInstance() && objData.scope === ObjectScope.NESTED_PREFAB) { + + const copy = colibri.core.json.copy(objData) as core.json.IObjectData; + + copy.prefabId = objData.id; + copy.id = Phaser.Utils.String.UUID(); + + sprite = maker.createObject(copy); + + sprite.getEditorSupport().setIsNestedPrefabInstance(true); + + } else { + + sprite = maker.createObject(objData); + } } if (sprite) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts index b13ee11d6..a32159517 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts @@ -26,14 +26,14 @@ namespace phasereditor2d.scene.ui.sceneobjects { static async getAssetsFromNestedData(args: IGetAssetsFromObjectArgs) { - const sceneFinder = ScenePlugin.getInstance().getSceneFinder(); - const list = []; const children = args.serializer.read("list", []) as json.IObjectData[]; - const nestedPrefabs = (args.serializer.getData().nestedPrefabs ?? []) - .filter(data => sceneFinder.existsPrefab(data.prefabId)); + // const nestedPrefabs = (args.serializer.getData().nestedPrefabs ?? []) + // .filter(data => sceneFinder.existsPrefab(data.prefabId)); + + const nestedPrefabs = GameObjectEditorSupport.readNestedPrefabData(args.serializer.getData()); - for (const objData of [...children, ...nestedPrefabs]) { + for (const objData of [...children, ...nestedPrefabs.values()]) { const ser = args.serializer.getSerializer(objData); From 1a5cb9c0cdaf4ea8de99f53c3eec77b43d8234cf Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sat, 7 Aug 2021 16:12:46 -0400 Subject: [PATCH 050/108] Nested prefabs: hey, I see the light! --- .../phasereditor2d.scene/src/ui/SceneMaker.ts | 30 --- .../SceneEditorOutlineContentProvider.ts | 2 +- .../sceneobjects/GameObjectEditorSupport.ts | 82 ++---- .../container/ContainerEditorSupport.ts | 240 ++++++++++++++++-- .../container/ContainerExtension.ts | 2 +- 5 files changed, 238 insertions(+), 118 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index feba3accc..e5d2939fb 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -247,8 +247,6 @@ namespace phasereditor2d.scene.ui { label: "temporal" }); - this.postProcessingOfNestedPrefabs(obj); - if (obj.getEditorSupport().isUnlockedProperty(sceneobjects.TransformComponent.x)) { const { x, y } = this.getCanvasCenterPoint(); @@ -269,34 +267,6 @@ namespace phasereditor2d.scene.ui { } } - private postProcessingOfNestedPrefabs(obj: sceneobjects.ISceneGameObject) { - - const support = obj.getEditorSupport(); - - if (support.getScope() === sceneobjects.ObjectScope.NESTED_PREFAB) { - - support.setPrefabId(support.getId()); - support.setIsNestedPrefabInstance(true); - support.setId(Phaser.Utils.String.UUID()); - support.setScope(sceneobjects.ObjectScope.METHOD); - - } else { - - if (support.isActiveNestedPrefab()) { - - support.setPrefabId(support.getId()); - support.setId(Phaser.Utils.String.UUID()); - } - } - - const list = sceneobjects.getObjectChildren(obj); - - for(const child of list) { - - // this.postProcessingOfNestedPrefabs(child); - } - } - getSerializer(data: json.IObjectData) { return new json.Serializer(data); } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts index 32edb877f..34ac1c42e 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts @@ -50,7 +50,7 @@ namespace phasereditor2d.scene.ui.editor.outline { if (parent.getEditorSupport().isPrefabInstance()) { - return parent.getEditorSupport().getNestedPrefabs(); + return parent.getEditorSupport().getNestedActivePrefabInstances(); } const list = [...parent.getChildren()]; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index ec5d94c9b..ea6cdcb29 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -47,7 +47,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { // tslint:disable-next-line:ban-types private _componentMap: Map>; private _unlockedProperties: Set; - private _isNestedPrefabInstance: boolean; constructor(extension: SceneGameObjectExtension, obj: T, scene: Scene) { super(obj, extension.getTypeName().toLowerCase(), scene); @@ -56,7 +55,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { this._unlockedProperties = new Set(); this._serializables = []; this._componentMap = new Map(); - this._isNestedPrefabInstance = false; obj.setDataEnabled(); @@ -154,6 +152,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { return false; } + hasUnlockedProperties() { + + return this._unlockedProperties.size > 0; + } + isLockedProperty(property: IProperty) { return !this.isUnlockedProperty(property); @@ -405,6 +408,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { } return false; + + // return this.isNestedPrefabInstance() && this.getScope() === sceneobjects.ObjectScope.NESTED_PREFAB; } /** * Checks if the object is a prefab instance and the parent isn't a prefab instance. @@ -428,16 +433,12 @@ namespace phasereditor2d.scene.ui.sceneobjects { isNestedPrefabInstance() { - return this._isNestedPrefabInstance; - } - - setIsNestedPrefabInstance(isNestedPrefabImage: boolean) { - - this._isNestedPrefabInstance = isNestedPrefabImage; + return this.isPrefabInstance() && this.getOwnerPrefabInstance() !== this.getObject(); } isPrefabInstance() { - return typeof this._prefabId === "string"; + + return this._prefabId !== undefined && this._prefabId !== null; } getAllParents() { @@ -495,28 +496,14 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this.isPrefabInstance() && this.getOwnerPrefabInstance() !== this.getObject(); } - getNestedPrefabs(): ISceneGameObject[] { + getNestedActivePrefabInstances(): ISceneGameObject[] { - if (!this.isPrefabInstance()) { - - return []; - } - - const obj = this.getObject(); - - if (obj instanceof Layer || obj instanceof Container) { - - const result: ISceneGameObject[] = []; - - for (const child of obj.getChildren()) { - - if (child.getEditorSupport().isNestedPrefabInstance()) { + if (this.isPrefabInstance()) { - result.push(child); - } - } + const children = sceneobjects.getObjectChildren(this.getObject()); - return result; + return children + .filter(obj => obj.getEditorSupport().isActiveNestedPrefab()); } return []; @@ -691,44 +678,5 @@ namespace phasereditor2d.scene.ui.sceneobjects { s.readJSON(ser); } } - - static readNestedPrefabData(objData: json.IObjectData, map?: Map, foreignPrefab = false) { - - map = map ?? new Map(); - - const finder = ScenePlugin.getInstance().getSceneFinder(); - - const list = objData.nestedPrefabs || []; - - for (const data of list) { - - const id = finder.getOriginalPrefabId(data.prefabId); - - if (id && !map.has(id)) { - - if (foreignPrefab) { - - const copy = colibri.core.json.copy(data); - copy.prefabId = data.id; - copy.id = Phaser.Utils.String.UUID(); - - map.set(id, copy); - - } else { - - map.set(id, data); - } - } - } - - if (objData.prefabId) { - - const prefabData = finder.getPrefabData(objData.prefabId); - - this.readNestedPrefabData(prefabData, map, true); - } - - return map; - } } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 7d1558b6b..1b524c513 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -95,7 +95,9 @@ namespace phasereditor2d.scene.ui.sceneobjects { obj.getEditorSupport().writeJSON(objData); return objData as json.IObjectData; - }); + }) + + .filter(data => (data.nestedPrefabs ?? []).length > 0 || (data.unlock ?? []).length > 0); } else { @@ -116,9 +118,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const ser = this.getSerializer(containerData); - const list = ser.read("list", []) as json.IObjectData[]; - - const nestedPrefabMap = GameObjectEditorSupport.readNestedPrefabData(containerData); + const originalChildren = ser.read("list", []) as json.IObjectData[]; const maker = this.getScene().getMaker(); @@ -126,41 +126,243 @@ namespace phasereditor2d.scene.ui.sceneobjects { container.removeAll(true); - for (const objData of list) { + const children = containerData.prefabId ? + ContainerEditorSupport.buildPrefabChildrenData(containerData, originalChildren) : originalChildren; + + for (const objData of children) { + + const sprite = maker.createObject(objData); + + if (sprite) { + + this.getObject().add(sprite); + } + } + } + + static buildPrefabChildrenData(objData: core.json.IObjectData, originalPrefabChildren: core.json.IObjectData[]) { + + const result: json.IObjectData[] = []; + + const finder = ScenePlugin.getInstance().getSceneFinder(); - let sprite: ISceneGameObject; + const localNestedPrefabs = objData.nestedPrefabs ?? []; - if (objData.scope === ObjectScope.NESTED_PREFAB && nestedPrefabMap.has(objData.id)) { + for (const originalChild of originalPrefabChildren) { - const prefabData = nestedPrefabMap.get(objData.id); + if (originalChild.scope !== sceneobjects.ObjectScope.NESTED_PREFAB) { - sprite = maker.createObject(prefabData); - sprite.getEditorSupport().setIsNestedPrefabInstance(true); + result.push(originalChild); } else { - if (this.isPrefabInstance() && objData.scope === ObjectScope.NESTED_PREFAB) { - const copy = colibri.core.json.copy(objData) as core.json.IObjectData; + // find a local nested prefab - copy.prefabId = objData.id; - copy.id = Phaser.Utils.String.UUID(); + let localNestedPrefab: json.IObjectData; - sprite = maker.createObject(copy); + for (const local of localNestedPrefabs) { - sprite.getEditorSupport().setIsNestedPrefabInstance(true); + const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, originalChild.id); + + if (remoteNestedPrefab) { + + localNestedPrefab = colibri.core.json.copy(local) as json.IObjectData; + localNestedPrefab.prefabId = remoteNestedPrefab.id; + + break; + + } else { + + if (local.prefabId === originalChild.id) { + + localNestedPrefab = local; + + break; + } + } + } + + if (localNestedPrefab) { + + result.push(localNestedPrefab); } else { - sprite = maker.createObject(objData); + // we don't have a local prefab, find one remote and create a pointer to it + + const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, originalChild.id); + + if (remoteNestedPrefab) { + + // we found a remote nested prefab, create a link to it + + const nestedPrefab: core.json.IObjectData = { + id: Phaser.Utils.String.UUID(), + prefabId: remoteNestedPrefab.id, + label: remoteNestedPrefab.label, + }; + + result.push(nestedPrefab); + + } else { + + // ok, just create a link with the original child + + const nestedPrefab: core.json.IObjectData = { + id: Phaser.Utils.String.UUID(), + prefabId: originalChild.id, + label: originalChild.label, + }; + + result.push(nestedPrefab); + } } } + } - if (sprite) { + return result; + } + + static buildPrefabChildrenData__orig(objData: core.json.IObjectData, originalPrefabChildren: core.json.IObjectData[]) { + + const result: json.IObjectData[] = []; + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + const localNestedPrefabs = objData.nestedPrefabs ?? []; + + for (const originalChild of originalPrefabChildren) { + + if (originalChild.scope !== sceneobjects.ObjectScope.NESTED_PREFAB) { + + result.push(originalChild); + + } else { + + let localNestedPrefab: json.IObjectData; + + for (const local of localNestedPrefabs) { + + const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, finder.getOriginalPrefabId(local.prefabId)); + + if (!remoteNestedPrefab || remoteNestedPrefab.id === originalChild.id) { + + localNestedPrefab = local; + break; + } + } + + if (localNestedPrefab) { + + const nestedPrefab = this.reconnectWithRemoteNestedPrefab(objData.prefabId, localNestedPrefab); - container.add(sprite); + if (nestedPrefab) { + + result.push(nestedPrefab); + + } + + } else { + + const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, originalChild.id); + + if (remoteNestedPrefab) { + + const nestedPrefab: core.json.IObjectData = { + id: Phaser.Utils.String.UUID(), + prefabId: remoteNestedPrefab.id, + label: remoteNestedPrefab.label, + }; + + result.push(nestedPrefab); + + } else { + + // ok, create one connecting with the original child + + const nestedPrefab: core.json.IObjectData = { + id: Phaser.Utils.String.UUID(), + prefabId: originalChild.id, + label: originalChild.label, + }; + + result.push(nestedPrefab); + } + } } } + + return result; + } + + private static findRemoteNestedPrefab(parentPrefabId: string, originalNestedPrefabId: string): json.IObjectData { + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + const prefabData = finder.getPrefabData(parentPrefabId); + + if (!prefabData) { + + return null; + } + + const nestedPrefab = (prefabData.nestedPrefabs ?? []).find(obj => { + + const thisOriginalId = finder.getOriginalPrefabId(obj.prefabId); + + return thisOriginalId === originalNestedPrefabId + }); + + if (nestedPrefab) { + + return nestedPrefab; + } + + if (prefabData.prefabId) { + + return this.findRemoteNestedPrefab(prefabData.prefabId, originalNestedPrefabId); + } + + return null; + } + + private static reconnectWithRemoteNestedPrefab(parentPrefabId: string, nestedPrefabData: core.json.IObjectData) { + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + const origNestedPrefabId = finder.getOriginalPrefabId(nestedPrefabData.prefabId); + + if (!origNestedPrefabId) { + + return null; + } + + if (parentPrefabId === finder.getOriginalPrefabId(parentPrefabId) + && nestedPrefabData.prefabId && origNestedPrefabId) { + + // is pointing directly to the original object + return nestedPrefabData; + } + + const pointedPrefabData = finder.getPrefabData(parentPrefabId); + + if (!pointedPrefabData) { + + return null; + } + + const pointedNestedPrefab = (pointedPrefabData.nestedPrefabs ?? []) + .find(obj => origNestedPrefabId === finder.getOriginalPrefabId(obj.prefabId)); + + if (pointedNestedPrefab) { + + nestedPrefabData.prefabId = pointedNestedPrefab.id; + + return nestedPrefabData; + } + + return this.reconnectWithRemoteNestedPrefab(pointedPrefabData.prefabId, nestedPrefabData); } getScreenBounds(camera: Phaser.Cameras.Scene2D.Camera) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts index a32159517..80e5f8f41 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts @@ -31,7 +31,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { // const nestedPrefabs = (args.serializer.getData().nestedPrefabs ?? []) // .filter(data => sceneFinder.existsPrefab(data.prefabId)); - const nestedPrefabs = GameObjectEditorSupport.readNestedPrefabData(args.serializer.getData()); + const nestedPrefabs = ContainerEditorSupport.buildPrefabChildrenData(args.serializer.getData(), children); for (const objData of [...children, ...nestedPrefabs.values()]) { From b3adbe9533fe949b6a182f8ecc17f3154ca2f9bd Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sat, 7 Aug 2021 19:36:24 -0400 Subject: [PATCH 051/108] Some debug utils. --- .../plugins/colibri/src/core/debug/Debug.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 source/editor/plugins/colibri/src/core/debug/Debug.ts diff --git a/source/editor/plugins/colibri/src/core/debug/Debug.ts b/source/editor/plugins/colibri/src/core/debug/Debug.ts new file mode 100644 index 000000000..77eb5ad24 --- /dev/null +++ b/source/editor/plugins/colibri/src/core/debug/Debug.ts @@ -0,0 +1,22 @@ +namespace colibri.debug { + + export function getEditorSelectedObject() { + + return getEditorSelection()[0]; + } + + export function getEditorSelection() { + + return colibri.Platform.getWorkbench().getActiveEditor().getSelection(); + } + + export function getPartSelection() { + + return colibri.Platform.getWorkbench().getActivePart().getSelection(); + } + + export function getPartSelectedObject() { + + return getPartSelection()[0]; + } +} \ No newline at end of file From 804b7a4c02d4f1848c186ce873dbd666be67ace4 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sat, 7 Aug 2021 23:09:38 -0400 Subject: [PATCH 052/108] Nested prefab: serialization is working! --- .../src/ui/editor/SelectionManager.ts | 2 +- .../sceneobjects/GameObjectEditorSupport.ts | 19 +-- .../container/ContainerEditorSupport.ts | 125 ++---------------- 3 files changed, 24 insertions(+), 122 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts index 309ad5606..2dddf4f0a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts @@ -143,7 +143,7 @@ namespace phasereditor2d.scene.ui.editor { const owner = objSupport.getOwnerPrefabInstance(); if (owner instanceof sceneobjects.Container - && objSupport.isActiveNestedPrefab() + && objSupport.isMutableNestedPrefab() && owner.getEditorSupport().isAllowPickChildren()) { // ok, it can be selected } else { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index ea6cdcb29..e91975494 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -47,6 +47,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { // tslint:disable-next-line:ban-types private _componentMap: Map>; private _unlockedProperties: Set; + private _mutableNestedPrefab: boolean; constructor(extension: SceneGameObjectExtension, obj: T, scene: Scene) { super(obj, extension.getTypeName().toLowerCase(), scene); @@ -55,6 +56,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { this._unlockedProperties = new Set(); this._serializables = []; this._componentMap = new Map(); + this._mutableNestedPrefab = false; obj.setDataEnabled(); @@ -396,20 +398,21 @@ namespace phasereditor2d.scene.ui.sceneobjects { * * @returns If active. */ - isActiveNestedPrefab() { + isMutableNestedPrefab() { - if (this.isNestedPrefabInstance()) { + if (this._mutableNestedPrefab) { - const parent = getObjectParent(this.getObject()) as ISceneGameObject; - const parentSupport = parent.getEditorSupport(); + const parentSupport = (getObjectParent(this.getObject()) as ISceneGameObject).getEditorSupport(); - return parentSupport.isNestedPrefabInstance() - || parentSupport.isPrefabInstanceRoot(); + return parentSupport.isMutableNestedPrefab() || parentSupport.isPrefabInstanceRoot(); } return false; + } + + _setMutableNestedPrefab(b: boolean) { - // return this.isNestedPrefabInstance() && this.getScope() === sceneobjects.ObjectScope.NESTED_PREFAB; + this._mutableNestedPrefab = b; } /** * Checks if the object is a prefab instance and the parent isn't a prefab instance. @@ -503,7 +506,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const children = sceneobjects.getObjectChildren(this.getObject()); return children - .filter(obj => obj.getEditorSupport().isActiveNestedPrefab()); + .filter(obj => obj.getEditorSupport().isMutableNestedPrefab()); } return []; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 1b524c513..421060e4f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -84,7 +84,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { containerData.nestedPrefabs = this.getObject().getChildren() - .filter(obj => obj.getEditorSupport().isActiveNestedPrefab()) + .filter(obj => obj.getEditorSupport().isMutableNestedPrefab()) .filter(obj => finder.existsPrefab(obj.getEditorSupport().getPrefabId())) @@ -129,6 +129,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { const children = containerData.prefabId ? ContainerEditorSupport.buildPrefabChildrenData(containerData, originalChildren) : originalChildren; + let i = 0; + for (const objData of children) { const sprite = maker.createObject(objData); @@ -136,7 +138,16 @@ namespace phasereditor2d.scene.ui.sceneobjects { if (sprite) { this.getObject().add(sprite); + + const originalData = originalChildren[i]; + + if (originalData.scope === sceneobjects.ObjectScope.NESTED_PREFAB) { + + sprite.getEditorSupport()._setMutableNestedPrefab(true); + } } + + i++; } } @@ -144,8 +155,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { const result: json.IObjectData[] = []; - const finder = ScenePlugin.getInstance().getSceneFinder(); - const localNestedPrefabs = objData.nestedPrefabs ?? []; for (const originalChild of originalPrefabChildren) { @@ -224,78 +233,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { return result; } - static buildPrefabChildrenData__orig(objData: core.json.IObjectData, originalPrefabChildren: core.json.IObjectData[]) { - - const result: json.IObjectData[] = []; - - const finder = ScenePlugin.getInstance().getSceneFinder(); - - const localNestedPrefabs = objData.nestedPrefabs ?? []; - - for (const originalChild of originalPrefabChildren) { - - if (originalChild.scope !== sceneobjects.ObjectScope.NESTED_PREFAB) { - - result.push(originalChild); - - } else { - - let localNestedPrefab: json.IObjectData; - - for (const local of localNestedPrefabs) { - - const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, finder.getOriginalPrefabId(local.prefabId)); - - if (!remoteNestedPrefab || remoteNestedPrefab.id === originalChild.id) { - - localNestedPrefab = local; - break; - } - } - - if (localNestedPrefab) { - - const nestedPrefab = this.reconnectWithRemoteNestedPrefab(objData.prefabId, localNestedPrefab); - - if (nestedPrefab) { - - result.push(nestedPrefab); - - } - - } else { - - const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, originalChild.id); - - if (remoteNestedPrefab) { - - const nestedPrefab: core.json.IObjectData = { - id: Phaser.Utils.String.UUID(), - prefabId: remoteNestedPrefab.id, - label: remoteNestedPrefab.label, - }; - - result.push(nestedPrefab); - - } else { - - // ok, create one connecting with the original child - - const nestedPrefab: core.json.IObjectData = { - id: Phaser.Utils.String.UUID(), - prefabId: originalChild.id, - label: originalChild.label, - }; - - result.push(nestedPrefab); - } - } - } - } - - return result; - } - private static findRemoteNestedPrefab(parentPrefabId: string, originalNestedPrefabId: string): json.IObjectData { const finder = ScenePlugin.getInstance().getSceneFinder(); @@ -327,44 +264,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { return null; } - private static reconnectWithRemoteNestedPrefab(parentPrefabId: string, nestedPrefabData: core.json.IObjectData) { - - const finder = ScenePlugin.getInstance().getSceneFinder(); - - const origNestedPrefabId = finder.getOriginalPrefabId(nestedPrefabData.prefabId); - - if (!origNestedPrefabId) { - - return null; - } - - if (parentPrefabId === finder.getOriginalPrefabId(parentPrefabId) - && nestedPrefabData.prefabId && origNestedPrefabId) { - - // is pointing directly to the original object - return nestedPrefabData; - } - - const pointedPrefabData = finder.getPrefabData(parentPrefabId); - - if (!pointedPrefabData) { - - return null; - } - - const pointedNestedPrefab = (pointedPrefabData.nestedPrefabs ?? []) - .find(obj => origNestedPrefabId === finder.getOriginalPrefabId(obj.prefabId)); - - if (pointedNestedPrefab) { - - nestedPrefabData.prefabId = pointedNestedPrefab.id; - - return nestedPrefabData; - } - - return this.reconnectWithRemoteNestedPrefab(pointedPrefabData.prefabId, nestedPrefabData); - } - getScreenBounds(camera: Phaser.Cameras.Scene2D.Camera) { const container = this.getObject(); From 2ef3d466a6ebaa27e86bbe54df83540cdb883906 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sat, 7 Aug 2021 23:14:20 -0400 Subject: [PATCH 053/108] Nested prefab: uses mutable nested prefab in code generation. --- .../phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index c45d93ccf..12d5f2844 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -363,7 +363,7 @@ namespace phasereditor2d.scene.core.code { for (const obj of this._scene.getDisplayListChildren()) { - if (obj.getEditorSupport().isNestedPrefabInstance()) { + if (obj.getEditorSupport().isMutableNestedPrefab()) { this.addCreateObjectCodeOfNestedPrefab(obj, createMethodDecl, lazyStatements); @@ -747,7 +747,7 @@ namespace phasereditor2d.scene.core.code { for (const child of args.obj.getChildren()) { - if (child.getEditorSupport().isNestedPrefabInstance()) { + if (child.getEditorSupport().isMutableNestedPrefab()) { this.addCreateObjectCodeOfNestedPrefab(child, args.createMethodDecl, args.lazyStatements); From 1125829de5830d67558e52fd5c9f50677f83f836 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 8 Aug 2021 13:37:01 -0400 Subject: [PATCH 054/108] Nested prefabs: fiexes Prefab Instance section. --- .../plugins/colibri/styles/controls.css | 2 +- .../src/core/json/SceneFinder.ts | 17 +++++-- .../sceneobjects/GameObjectEditorSupport.ts | 21 ++++++++ .../object/PrefabUserPropertyComponent.ts | 2 +- .../PrefabInstanceUserPropertySection.ts | 51 ++++++++++++++----- 5 files changed, 76 insertions(+), 17 deletions(-) diff --git a/source/editor/plugins/colibri/styles/controls.css b/source/editor/plugins/colibri/styles/controls.css index 9964c3bde..b2ac047c9 100644 --- a/source/editor/plugins/colibri/styles/controls.css +++ b/source/editor/plugins/colibri/styles/controls.css @@ -342,7 +342,7 @@ .PropertyFormArea { display: grid; - padding: 10px 0px 10px 0px; + padding: 2px 0px 10px 0px; } .PropertyButtonPanel { diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts index cf7a8159d..4683184d0 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneFinder.ts @@ -51,10 +51,12 @@ namespace phasereditor2d.scene.core.json { private _compFilename_Data_Map: Map; private _compModelsInfo: IUserComponentsModelInfo[]; private _enabled: boolean; + private _nestedPrefabIds: Set; constructor() { this._prefabObjectId_ObjectData_Map = new Map(); + this._nestedPrefabIds = new Set(); this._sceneFilename_Data_Map = new Map(); this._sceneFilename_Settings_Map = new Map(); this._prefabId_File_Map = new Map(); @@ -179,6 +181,7 @@ namespace phasereditor2d.scene.core.json { private async preloadSceneFiles(monitor: controls.IProgressMonitor): Promise { const sceneIdSet = new Set(); const prefabObjectId_ObjectData_Map = new Map(); + const nestedPrefabIds = new Set(); const sceneFilename_Data_Map = new Map(); const sceneFilename_Settings_Map = new Map(); const prefabId_File_Map = new Map(); @@ -226,7 +229,7 @@ namespace phasereditor2d.scene.core.json { prefabId_File_Map.set(data.id, file); this.mapNestedPrefabData( - prefabObjectId_ObjectData_Map, prefabId_File_Map, file, objData); + prefabObjectId_ObjectData_Map, prefabId_File_Map, nestedPrefabIds, file, objData); } if (data.sceneType === SceneType.PREFAB) { @@ -245,6 +248,7 @@ namespace phasereditor2d.scene.core.json { } this._prefabObjectId_ObjectData_Map = prefabObjectId_ObjectData_Map; + this._nestedPrefabIds = nestedPrefabIds; this._sceneFilename_Data_Map = sceneFilename_Data_Map; this._sceneFilename_Settings_Map = sceneFilename_Settings_Map; this._prefabId_File_Map = prefabId_File_Map; @@ -255,6 +259,7 @@ namespace phasereditor2d.scene.core.json { private mapNestedPrefabData( prefabObjectId_ObjectData_Map: Map, prefabId_File_Map: Map, + nestedPrefabIds: Set, file: io.FilePath, objData: IObjectData) { @@ -266,8 +271,9 @@ namespace phasereditor2d.scene.core.json { prefabObjectId_ObjectData_Map.set(c.id, c); prefabId_File_Map.set(c.id, file); + nestedPrefabIds.add(c.id); - this.mapNestedPrefabData(prefabObjectId_ObjectData_Map, prefabId_File_Map, file, c); + this.mapNestedPrefabData(prefabObjectId_ObjectData_Map, prefabId_File_Map, nestedPrefabIds, file, c); } } } @@ -279,7 +285,7 @@ namespace phasereditor2d.scene.core.json { prefabObjectId_ObjectData_Map.set(c.id, c); prefabId_File_Map.set(c.id, file); - this.mapNestedPrefabData(prefabObjectId_ObjectData_Map, prefabId_File_Map, file, c); + this.mapNestedPrefabData(prefabObjectId_ObjectData_Map, prefabId_File_Map, nestedPrefabIds, file, c); } } } @@ -359,6 +365,11 @@ namespace phasereditor2d.scene.core.json { return prefabId; } + isNestedPrefab(prefabId: string) { + + return this._nestedPrefabIds.has(prefabId); + } + existsPrefab(prefabId: string) { return this._prefabObjectId_ObjectData_Map.has(prefabId); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index e91975494..b8bb2371e 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -569,6 +569,27 @@ namespace phasereditor2d.scene.ui.sceneobjects { return null; } + getPrefabOrNestedPrefabFile() { + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + if (this.isNestedPrefabInstance()) { + + const originalId = finder.getOriginalPrefabId(this._prefabId); + + if (finder.isNestedPrefab(originalId)) { + + return null; + + } else { + + return finder.getPrefabFile(originalId); + } + } + + return this.getPrefabFile(); + } + getPrefabData() { if (this._prefabId) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts index a99e61674..f7b6dfb1a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts @@ -41,7 +41,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { if (editorSupport.isPrefabInstance()) { - const prefabFile = this.getObject().getEditorSupport().getPrefabFile(); + const prefabFile = this.getObject().getEditorSupport().getPrefabOrNestedPrefabFile(); if (prefabFile) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/PrefabInstanceUserPropertySection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/PrefabInstanceUserPropertySection.ts index 21b267727..53e9bf06f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/PrefabInstanceUserPropertySection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/PrefabInstanceUserPropertySection.ts @@ -41,6 +41,13 @@ namespace phasereditor2d.scene.ui.sceneobjects { const obj = this.getSelectionFirstElement() as ISceneGameObject; + if (obj.getEditorSupport().isNestedPrefabInstance()) { + + const file = obj.getEditorSupport().getPrefabFile(); + + this.createPrefabLink(file, `Root Prefab: ${file.getNameWithoutExtension()}`); + } + const userPropsComponent = GameObjectEditorSupport .getObjectComponent(obj, PrefabUserPropertyComponent) as PrefabUserPropertyComponent; @@ -51,20 +58,22 @@ namespace phasereditor2d.scene.ui.sceneobjects { const prefabFile = propsByPrefab.prefabFile; const prefabName = prefabFile.getNameWithoutExtension(); - const headerDiv = document.createElement("div"); - headerDiv.classList.add("PrefabLink"); - headerDiv.style.gridColumn = "1 / span 3"; - headerDiv.style.width = "100%"; - this._propArea.appendChild(headerDiv); + const headerDiv = this.createPrefabLink(prefabFile); + + // const headerDiv = document.createElement("div"); + // headerDiv.classList.add("PrefabLink"); + // headerDiv.style.gridColumn = "1 / span 3"; + // headerDiv.style.width = "100%"; + // this._propArea.appendChild(headerDiv); - const prefabBtn = document.createElement("a"); - prefabBtn.href = "#"; - prefabBtn.innerHTML = prefabName; - headerDiv.appendChild(prefabBtn); + // const prefabBtn = document.createElement("a"); + // prefabBtn.href = "#"; + // prefabBtn.innerHTML = prefabName; + // headerDiv.appendChild(prefabBtn); - const openFileCallback = () => colibri.Platform.getWorkbench().openEditor(propsByPrefab.prefabFile); + // const openFileCallback = () => colibri.Platform.getWorkbench().openEditor(propsByPrefab.prefabFile); - prefabBtn.addEventListener("click", openFileCallback); + // prefabBtn.addEventListener("click", openFileCallback); this.createMenuIcon(headerDiv, () => { @@ -102,7 +111,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { menu.addAction({ text: `Open ${prefabName} File`, - callback: openFileCallback + callback: () => colibri.Platform.getWorkbench().openEditor(prefabFile) }) return menu; @@ -116,6 +125,24 @@ namespace phasereditor2d.scene.ui.sceneobjects { }); } + private createPrefabLink(file: colibri.core.io.FilePath, btnText?:string) { + + const headerDiv = document.createElement("div"); + headerDiv.classList.add("PrefabLink"); + headerDiv.style.gridColumn = "1 / span 3"; + headerDiv.style.width = "100%"; + this._propArea.appendChild(headerDiv); + + const prefabBtn = document.createElement("a"); + prefabBtn.href = "#"; + prefabBtn.innerHTML = btnText ?? file.getNameWithoutExtension(); + headerDiv.appendChild(prefabBtn); + + prefabBtn.addEventListener("click", () => colibri.Platform.getWorkbench().openEditor(file)); + + return headerDiv; + } + canEdit(obj: any, n: number): boolean { return true; From cefa3e6a70e637fb616f9f32a589e20c210bc3ee Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 8 Aug 2021 23:09:15 -0400 Subject: [PATCH 055/108] Nested prefab: small refactoring. --- .../src/core/code/SceneCodeDOMBuilder.ts | 4 +-- .../src/ui/editor/SelectionManager.ts | 2 +- .../src/ui/sceneobjects/EditorSupport.ts | 5 +++ .../sceneobjects/GameObjectEditorSupport.ts | 31 +++++++++++++++++-- .../container/ContainerEditorSupport.ts | 2 +- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index 12d5f2844..f1e2b65d9 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -363,7 +363,7 @@ namespace phasereditor2d.scene.core.code { for (const obj of this._scene.getDisplayListChildren()) { - if (obj.getEditorSupport().isMutableNestedPrefab()) { + if (obj.getEditorSupport().isMutableNestedPrefabInstance()) { this.addCreateObjectCodeOfNestedPrefab(obj, createMethodDecl, lazyStatements); @@ -747,7 +747,7 @@ namespace phasereditor2d.scene.core.code { for (const child of args.obj.getChildren()) { - if (child.getEditorSupport().isMutableNestedPrefab()) { + if (child.getEditorSupport().isMutableNestedPrefabInstance()) { this.addCreateObjectCodeOfNestedPrefab(child, args.createMethodDecl, args.lazyStatements); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts index 2dddf4f0a..1c6164f04 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts @@ -143,7 +143,7 @@ namespace phasereditor2d.scene.ui.editor { const owner = objSupport.getOwnerPrefabInstance(); if (owner instanceof sceneobjects.Container - && objSupport.isMutableNestedPrefab() + && objSupport.isMutableNestedPrefabInstance() && owner.getEditorSupport().isAllowPickChildren()) { // ok, it can be selected } else { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts index d00900d7f..324c846f2 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/EditorSupport.ts @@ -83,6 +83,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this._scope; } + isNestedPrefabScope() { + + return this._scope === ObjectScope.NESTED_PREFAB; + } + isPublic() { return this._scope === ObjectScope.PUBLIC diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index b8bb2371e..e733cd9be 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -398,13 +398,13 @@ namespace phasereditor2d.scene.ui.sceneobjects { * * @returns If active. */ - isMutableNestedPrefab() { + isMutableNestedPrefabInstance() { if (this._mutableNestedPrefab) { const parentSupport = (getObjectParent(this.getObject()) as ISceneGameObject).getEditorSupport(); - return parentSupport.isMutableNestedPrefab() || parentSupport.isPrefabInstanceRoot(); + return parentSupport.isMutableNestedPrefabInstance() || parentSupport.isPrefabInstanceRoot(); } return false; @@ -414,6 +414,31 @@ namespace phasereditor2d.scene.ui.sceneobjects { this._mutableNestedPrefab = b; } + + isRootPrefabDefined() { + + if (this.isPrefabInstance()) { + + return !this.isNestedPrefabDefined(); + } + + return false; + } + + isNestedPrefabDefined() { + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + if (this.isPrefabInstance()) { + + const id = finder.getOriginalPrefabId(this.getPrefabId()); + + return finder.isNestedPrefab(id); + } + + return false; + } + /** * Checks if the object is a prefab instance and the parent isn't a prefab instance. * @@ -506,7 +531,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const children = sceneobjects.getObjectChildren(this.getObject()); return children - .filter(obj => obj.getEditorSupport().isMutableNestedPrefab()); + .filter(obj => obj.getEditorSupport().isMutableNestedPrefabInstance()); } return []; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 421060e4f..016536260 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -84,7 +84,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { containerData.nestedPrefabs = this.getObject().getChildren() - .filter(obj => obj.getEditorSupport().isMutableNestedPrefab()) + .filter(obj => obj.getEditorSupport().isMutableNestedPrefabInstance()) .filter(obj => finder.existsPrefab(obj.getEditorSupport().getPrefabId())) From d49b5e6e33ea63fa421b93b3251b1fd5286a396e Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 8 Aug 2021 23:43:45 -0400 Subject: [PATCH 056/108] Good bye `prefabs-awake` & `components-awake` events. Welcome `scene-awake`. --- .../data/UserComponent.js.txt | 2 +- .../data/UserComponent.module.js.txt | 2 +- .../data/UserComponent.module.ts.txt | 2 +- .../data/UserComponent.ts.txt | 2 +- .../src/core/code/RawCodeDOM.ts | 2 +- .../src/core/code/SceneCodeDOMBuilder.ts | 7 ++- .../src/core/json/SceneSettings.ts | 3 - .../dialogs/NewPrefabFileDialogExtension.ts | 1 - .../ui/editor/commands/SceneEditorCommands.ts | 58 ------------------- .../properties/PrefabCompilerSection.ts | 8 +-- .../ui/editor/usercomponent/UserComponent.ts | 16 +---- .../usercomponent/UserComponentSection.ts | 3 - .../object/PrefabUserPropertyComponent.ts | 13 ----- .../UserComponentsEditorComponent.ts | 41 +------------ 14 files changed, 13 insertions(+), 147 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.js.txt b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.js.txt index 784945633..25f7dad7b 100755 --- a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.js.txt +++ b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.js.txt @@ -14,7 +14,7 @@ class UserComponent { if (listenAwake) { - gameObject.once("components-awake", this.awake, this); + this.scene.events.once("scene-awake", this.awake, this); } if (listenStart) { diff --git a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.js.txt b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.js.txt index d164fbc9b..8c1371e89 100755 --- a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.js.txt +++ b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.js.txt @@ -16,7 +16,7 @@ export default class UserComponent { if (listenAwake) { - gameObject.once("components-awake", this.awake, this); + this.scene.events.once("scene-awake", this.awake, this); } if (listenStart) { diff --git a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.ts.txt b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.ts.txt index fbd98e6c0..d23cd9b70 100755 --- a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.ts.txt +++ b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.ts.txt @@ -16,7 +16,7 @@ export default class UserComponent { if (listenAwake) { - gameObject.once("components-awake", this.awake, this); + this.scene.events.once("scene-awake", this.awake, this); } if (listenStart) { diff --git a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.ts.txt b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.ts.txt index f6753c63c..98bda5ac3 100755 --- a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.ts.txt +++ b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.ts.txt @@ -14,7 +14,7 @@ class UserComponent { if (listenAwake) { - gameObject.once("components-awake", this.awake, this); + this.scene.events.once("scene-awake", this.awake, this); } if (listenStart) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/RawCodeDOM.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/RawCodeDOM.ts index 661218b5b..349fef63e 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/RawCodeDOM.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/RawCodeDOM.ts @@ -9,7 +9,7 @@ namespace phasereditor2d.scene.core.code { return codes.map(code => new RawCodeDOM(code)); } - constructor(code: string) { + constructor(code = "") { super(); this._code = code; diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index f1e2b65d9..affe2160f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -273,10 +273,10 @@ namespace phasereditor2d.scene.core.code { // prefab awake handler const settings = this._scene.getSettings(); - if (settings.generateAwakeEvent && settings.generateAwakeHandler) { + if (settings.generateAwakeHandler) { body.push(new RawCodeDOM("// awake handler")); - body.push(new RawCodeDOM("this.once(\"prefab-awake\", () => this.awake());")); + body.push(new RawCodeDOM("this.scene.events.once(\"scene-awake\", () => this.awake());")); body.push(new RawCodeDOM("")); } } @@ -382,6 +382,9 @@ namespace phasereditor2d.scene.core.code { this.addFieldInitCode(body); + body.push(new RawCodeDOM("")); + body.push(new RawCodeDOM(`this.events.emit("scene-awake");`)); + return createMethodDecl; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneSettings.ts b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneSettings.ts index 49287b312..886f7e785 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneSettings.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/json/SceneSettings.ts @@ -20,7 +20,6 @@ namespace phasereditor2d.scene.core.json { public sceneKey = "", public exportClass = false, public autoImport = false, - public generateAwakeEvent = true, public generateAwakeHandler = false, public compilerOutputLanguage = SourceLang.JAVA_SCRIPT, public scopeBlocksToFolder: boolean = false, @@ -45,7 +44,6 @@ namespace phasereditor2d.scene.core.json { write(data, "onlyGenerateMethods", this.onlyGenerateMethods, false); write(data, "exportClass", this.exportClass, false); write(data, "autoImport", this.autoImport, false); - write(data, "generateAwakeEvent", this.generateAwakeEvent, true); write(data, "generateAwakeHandler", this.generateAwakeHandler, false); write(data, "superClassName", this.superClassName, ""); write(data, "preloadMethodName", this.preloadMethodName, "preload"); @@ -73,7 +71,6 @@ namespace phasereditor2d.scene.core.json { this.onlyGenerateMethods = read(data, "onlyGenerateMethods", false); this.exportClass = read(data, "exportClass", false); this.autoImport = read(data, "autoImport", false); - this.generateAwakeEvent = read(data, "generateAwakeEvent", true); this.generateAwakeHandler = read(data, "generateAwakeHandler", false); this.superClassName = read(data, "superClassName", ""); this.preloadMethodName = read(data, "preloadMethodName", "preload"); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/dialogs/NewPrefabFileDialogExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/dialogs/NewPrefabFileDialogExtension.ts index ae0cdfe8e..24842e09e 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/dialogs/NewPrefabFileDialogExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/dialogs/NewPrefabFileDialogExtension.ts @@ -16,7 +16,6 @@ namespace phasereditor2d.scene.ui.dialogs { compilerOutputLanguage: settings.compilerOutputLanguage, exportClass: settings.exportClass, autoImport: settings.autoImport, - generateAwakeEvent: false, generateAwakeHandler: false, compilerInsertSpaces: settings.compilerInsertSpaces, compilerTabSize: settings.compilerTabSize, diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index f003d38aa..ede769007 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -127,64 +127,6 @@ namespace phasereditor2d.scene.ui.editor.commands { this.registerTextureCommands(manager); this.registerSnappingCommands(manager); - - this.registerPrefabAwakeCommands(manager); - } - - private static registerPrefabAwakeCommands(manager: colibri.ui.ide.commands.CommandManager) { - - manager.add({ - command: { - category: CAT_SCENE_EDITOR, - name: "Disable Awake Event By Default In All Prefabs", - id: CMD_DISABLE_AWAKE_EVENT_PREFABS, - tooltip: "Disables the awake event in all prefabs, where it is not set explicity." - }, - handler: { - testFunc: args => args.activeWindow instanceof ide.ui.DesignWindow, - executeFunc: async args => { - - const editors = args.activeWindow.getEditorArea().getEditors(); - - if (editors.length > 0) { - - alert("For executing this command, please, close all the editors.") - - return; - } - - const finder = ScenePlugin.getInstance().getSceneFinder(); - - const dlg = new controls.dialogs.ProgressDialog(); - dlg.create(); - dlg.setTitle("Disabling Awake Event In Prefabs"); - - const monitor = new controls.dialogs.ProgressDialogMonitor(dlg); - - const prefabs = finder.getPrefabFiles(); - - monitor.addTotal(prefabs.length); - - for (const prefabFile of prefabs) { - - const data = finder.getSceneData(prefabFile); - - if (!("generateAwakeEvent" in data.settings)) { - - data.settings["generateAwakeEvent"] = false; - - dlg.setTitle("Precessing " + prefabFile.getName()); - - await colibri.ui.ide.FileUtils.setFileString_async(prefabFile, JSON.stringify(data, null, 4)); - - monitor.step(); - } - } - - dlg.close(); - } - } - }) } static registerAddObjectCommands(manager: colibri.ui.ide.commands.CommandManager) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/PrefabCompilerSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/PrefabCompilerSection.ts index 04e662c24..f8c9f341d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/PrefabCompilerSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/properties/PrefabCompilerSection.ts @@ -22,16 +22,10 @@ namespace phasereditor2d.scene.ui.editor.properties { comp.style.gridTemplateColumns = "auto 1fr"; - this.createBooleanField(comp, "generateAwakeEvent", - - this.createLabel(comp, "Generate Awake Event", - "Generate the firing of the 'prefab-awake' event." + - "\nChanging this value requires a build of all scenes referencing this prefab. (Ctrl+Alt+B).")); - this.createBooleanField(comp, "generateAwakeHandler", this.createLabel(comp, "Generate Awake Handler", - "Generate a handler for the 'prefab-awake' event.")); + "Generate a handler for the 'scene-awake' event.")); } canEdit(obj: any, n: number): boolean { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponent.ts index 154f41d62..a975e7439 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponent.ts @@ -8,7 +8,6 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { private _baseClass: string; private _gameObjectType: string; private _properties: sceneobjects.UserProperties; - private _generateAwakeEvent: boolean; constructor(name: string) { @@ -16,7 +15,6 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { this._baseClass = ""; this._gameObjectType = "Phaser.GameObjects.Image"; this._properties = new UserComponentProperties(this); - this._generateAwakeEvent = false; } toJSON(): any { @@ -28,8 +26,7 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { name: this._name, baseClass: this._baseClass, gameObjectType: this._gameObjectType, - properties: propsData, - generateAwakeEvent: this._generateAwakeEvent + properties: propsData }; return data; @@ -41,17 +38,6 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { this._baseClass = read(data, "baseClass", ""); this._gameObjectType = read(data, "gameObjectType", "Phaser.GameObjects.Image"); this._properties.readJSON(data.properties); - this._generateAwakeEvent = read(data, "generateAwakeEvent", true); - } - - isGenerateAwakeEvent() { - - return this._generateAwakeEvent; - } - - setGenerateAwakeEvent(generateAwakeEvent: boolean) { - - this._generateAwakeEvent = generateAwakeEvent; } getName() { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentSection.ts index 2cfcaf754..002ad284f 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/usercomponent/UserComponentSection.ts @@ -39,9 +39,6 @@ namespace phasereditor2d.scene.ui.editor.usercomponent { "Name of the type of the Game Object that this component can be added on.", () => this.createGameObjectTypeOptions()); this.stringProp(comp, "BaseClass", "Super Class", "Name of the super class of the component. It is optional.", () => this.createSuperClassOptions()); - - this.booleanProp(comp, "GenerateAwakeEvent", "Generate Awake Event", "Generate the 'components-awake' event." + - + " If changed, requires a build of all scenes using this component.") } private createSuperClassOptions(): string[] { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts index f7b6dfb1a..c299b8297 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/PrefabUserPropertyComponent.ts @@ -113,19 +113,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { userProp.getType().buildSetObjectPropertyCodeDOM(this, args, userProp); } - if (this.getObject().getEditorSupport().isPrefabInstance()) { - - const settings = this.getObject().getEditorSupport().getPrefabSettings(); - - if (settings && settings.generateAwakeEvent) { - - const stmt = new core.code.MethodCallCodeDOM("emit", args.objectVarName); - stmt.argLiteral("prefab-awake"); - - args.lazyStatements.push(stmt); - } - } - args.statements = temp; if (args.lazyStatements.length > mark) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts index bad55bf86..117a46ec3 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts @@ -285,51 +285,12 @@ namespace phasereditor2d.scene.ui.sceneobjects { } } - const isScenePrefabObject = this.getObject().getEditorSupport().isScenePrefabObject(); - - // generate the awake event? - - let generateAwakeEvent = false; - - if (!isScenePrefabObject) { - - for (const compName of this._compNames) { - - const result = finder.getUserComponentByName(compName); - generateAwakeEvent = generateAwakeEvent || result.component.isGenerateAwakeEvent(); - - if (generateAwakeEvent) { - - break; - } - } - - if (!generateAwakeEvent) { - - for (const prefabComp of prefabUserComponents) { - - for (const comp of prefabComp.components) { - - generateAwakeEvent = generateAwakeEvent || comp.isGenerateAwakeEvent(); - } - } - } - } - - if (allPropsStart !== args.lazyStatements.length || generateAwakeEvent) { + if (allPropsStart !== args.lazyStatements.length) { args.lazyStatements.splice(allPropsStart, 0, new code.RawCodeDOM(""), new code.RawCodeDOM(`// ${args.objectVarName} (components)`)); } - - if (generateAwakeEvent) { - - const stmt = new code.MethodCallCodeDOM("emit", args.objectVarName); - stmt.argLiteral("components-awake"); - - args.lazyStatements.push(stmt); - } } private buildSetObjectPropertiesCodeDOM2(comp: editor.usercomponent.UserComponent, compName: string, compVarName: string, args: ISetObjectPropertiesCodeDOMArgs) { From 2e25bc9b03c339b0fbbf94ba286ef95fb9b623df Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 8 Aug 2021 23:45:12 -0400 Subject: [PATCH 057/108] Update chnagelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index f5c557b92..2bebe047b 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -4,6 +4,7 @@ * Nested prefabs: * Uses nullish operator (`??`) in prefab constructors. +* Good bye `prefab-awake` & `components-awake` events. Welcome `scene-awake`. ## v3.16.0-alpha.1 From ec038bbe5fd0f6834c15fb6fad297368b9071a28 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Sun, 8 Aug 2021 23:52:14 -0400 Subject: [PATCH 058/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 2bebe047b..0a07edb46 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -4,6 +4,7 @@ * Nested prefabs: * Uses nullish operator (`??`) in prefab constructors. +* Scene Editor: allows unlock the position of prefab instances. This change introduces a new scene format that is not compatible with previous versions of the editor. * Good bye `prefab-awake` & `components-awake` events. Welcome `scene-awake`. ## v3.16.0-alpha.1 From 4946a9501acce1e746ff36a013ea6a846f6ec7c4 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 00:31:35 -0400 Subject: [PATCH 059/108] Nested prefab: fixes serialization of prefab properties. --- .../sceneobjects/container/ContainerEditorSupport.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 016536260..2f4ba1b95 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -133,7 +133,13 @@ namespace phasereditor2d.scene.ui.sceneobjects { for (const objData of children) { - const sprite = maker.createObject(objData); + // creates an empty object + const sprite = maker.createObject({ + id: objData.id, + prefabId: objData.prefabId, + type: objData.type, + label: objData.label, + }); if (sprite) { @@ -145,6 +151,9 @@ namespace phasereditor2d.scene.ui.sceneobjects { sprite.getEditorSupport()._setMutableNestedPrefab(true); } + + // updates the object with the final data + sprite.getEditorSupport().readJSON(objData); } i++; From 95e24d58c4feb0c091965e37d62733f2f13270fa Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 00:32:17 -0400 Subject: [PATCH 060/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 0a07edb46..621c127d2 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -6,6 +6,7 @@ * Uses nullish operator (`??`) in prefab constructors. * Scene Editor: allows unlock the position of prefab instances. This change introduces a new scene format that is not compatible with previous versions of the editor. * Good bye `prefab-awake` & `components-awake` events. Welcome `scene-awake`. + * Updates `UserComponent.js` templates. ## v3.16.0-alpha.1 From 34615be12b09476b0c379dc3773af4755a62667e Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 00:33:27 -0400 Subject: [PATCH 061/108] Update changelog. --- CHANGELOG.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 621c127d2..93422fae7 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -4,7 +4,7 @@ * Nested prefabs: * Uses nullish operator (`??`) in prefab constructors. -* Scene Editor: allows unlock the position of prefab instances. This change introduces a new scene format that is not compatible with previous versions of the editor. + * Allows unlock the position of prefab instances. This change introduces a new scene format that is not compatible with previous versions of the editor. * Good bye `prefab-awake` & `components-awake` events. Welcome `scene-awake`. * Updates `UserComponent.js` templates. From 8a2d7235a805cad4dcbfa4bd62e91f0fe693d4aa Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 00:46:47 -0400 Subject: [PATCH 062/108] Nested prefab: allows nested prefabs inside layers. --- .../container/ContainerEditorSupport.ts | 46 ++++++++++++------- .../sceneobjects/layer/LayerEditorSupport.ts | 32 +------------ 2 files changed, 31 insertions(+), 47 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 2f4ba1b95..e40a46e50 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -78,11 +78,25 @@ namespace phasereditor2d.scene.ui.sceneobjects { super.writeJSON(containerData); + ContainerEditorSupport.writeJSON_children(this.getObject(), containerData); + } + + readJSON(containerData: json.IObjectData) { + + super.readJSON(containerData); + + ContainerEditorSupport.readJSON_children(this.getObject(), containerData); + } + + static writeJSON_children(container: Container | Layer, containerData: json.IObjectData) { + const finder = ScenePlugin.getInstance().getSceneFinder(); - if (this.isPrefabInstance()) { + const support = container.getEditorSupport(); - containerData.nestedPrefabs = this.getObject().getChildren() + if (support.isPrefabInstance()) { + + containerData.nestedPrefabs = container.getChildren() .filter(obj => obj.getEditorSupport().isMutableNestedPrefabInstance()) @@ -101,7 +115,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { } else { - containerData.list = this.getObject().getChildren().map(obj => { + containerData.list = container.getChildren().map(obj => { const objData = {} as json.IObjectData; @@ -112,38 +126,36 @@ namespace phasereditor2d.scene.ui.sceneobjects { } } - readJSON(containerData: json.IObjectData) { + static readJSON_children(container: Container | Layer, containerData: json.IObjectData) { - super.readJSON(containerData); + const support = container.getEditorSupport(); - const ser = this.getSerializer(containerData); + const ser = support.getSerializer(containerData); const originalChildren = ser.read("list", []) as json.IObjectData[]; - const maker = this.getScene().getMaker(); - - const container = this.getObject(); + const maker = support.getScene().getMaker(); container.removeAll(true); const children = containerData.prefabId ? - ContainerEditorSupport.buildPrefabChildrenData(containerData, originalChildren) : originalChildren; + this.buildPrefabChildrenData(containerData, originalChildren) : originalChildren; let i = 0; - for (const objData of children) { + for (const childData of children) { // creates an empty object const sprite = maker.createObject({ - id: objData.id, - prefabId: objData.prefabId, - type: objData.type, - label: objData.label, + id: childData.id, + prefabId: childData.prefabId, + type: childData.type, + label: childData.label, }); if (sprite) { - this.getObject().add(sprite); + container.add(sprite); const originalData = originalChildren[i]; @@ -153,7 +165,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { } // updates the object with the final data - sprite.getEditorSupport().readJSON(objData); + sprite.getEditorSupport().readJSON(childData); } i++; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts index 9cd5079bd..9a544b4e1 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts @@ -62,42 +62,14 @@ namespace phasereditor2d.scene.ui.sceneobjects { super.writeJSON(layerData); - if (!this.isPrefabInstance()) { - - layerData.list = this.getObject().getChildren().map(obj => { - - const objData = {} as json.IObjectData; - - obj.getEditorSupport().writeJSON(objData); - - return objData as json.IObjectData; - }); - } + ContainerEditorSupport.writeJSON_children(this.getObject(), layerData); } readJSON(layerData: json.IObjectData) { super.readJSON(layerData); - const ser = this.getSerializer(layerData); - - const list = ser.read("list", []) as json.IObjectData[]; - - const maker = this.getScene().getMaker(); - - const layer = this.getObject(); - - layer.removeAll(true); - - for (const objData of list) { - - const sprite = maker.createObject(objData); - - if (sprite) { - - layer.add(sprite); - } - } + ContainerEditorSupport.readJSON_children(this.getObject(), layerData); } getScreenBounds(camera: Phaser.Cameras.Scene2D.Camera) { From 16831dd0349e1830e9e7e38aac5d2ea7e4873070 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 00:53:58 -0400 Subject: [PATCH 063/108] Scene Editor: the "generate awake handler" in prefabs are generated at the end. --- .../src/core/code/SceneCodeDOMBuilder.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index affe2160f..704c1d230 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -269,18 +269,6 @@ namespace phasereditor2d.scene.core.code { body.push(new RawCodeDOM("")); } - { - // prefab awake handler - const settings = this._scene.getSettings(); - - if (settings.generateAwakeHandler) { - - body.push(new RawCodeDOM("// awake handler")); - body.push(new RawCodeDOM("this.scene.events.once(\"scene-awake\", () => this.awake());")); - body.push(new RawCodeDOM("")); - } - } - const lazyStatements: CodeDOM[] = []; const result = this.buildSetObjectProperties({ @@ -309,6 +297,18 @@ namespace phasereditor2d.scene.core.code { this.addFieldInitCode(body); + { + // prefab awake handler + const settings = this._scene.getSettings(); + + if (settings.generateAwakeHandler) { + + body.push(new RawCodeDOM("// awake handler")); + body.push(new RawCodeDOM("this.scene.events.once(\"scene-awake\", () => this.awake());")); + body.push(new RawCodeDOM("")); + } + } + body.push(new RawCodeDOM("")); body.push(new UserSectionCodeDOM("/* START-USER-CTR-CODE */", "/* END-USER-CTR-CODE */", "\n\t\t// Write your code here.\n\t\t")) From c477ef82e321593620c90dd9eb13cae2dc0746bc Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 01:32:56 -0400 Subject: [PATCH 064/108] Nested prefab: fixes `this` variable name in code generation of prefabs. --- .../src/core/code/SceneCodeDOMBuilder.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index 704c1d230..225d1d784 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -693,11 +693,15 @@ namespace phasereditor2d.scene.core.code { const support = obj.getEditorSupport(); - const varName = formatToValidVarName(support.getLabel()); + const parent = ui.sceneobjects.getObjectParent(obj); + + const varName = support.isScenePrefabObject() + ? "this" + : formatToValidVarName(support.getLabel()); if (support.isNestedPrefabInstance()) { - const parentVarName = this.getPrefabInstanceVarName(ui.sceneobjects.getObjectParent(obj)); + const parentVarName = this.getPrefabInstanceVarName(parent); return parentVarName + "." + varName; } From 69179b0103bc81f436965c43cc64326ceacbc0c0 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 03:01:23 -0400 Subject: [PATCH 065/108] Nested prefab: skip adding objects to a root prefab instance. --- .../editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts index e5d2939fb..0ba6a3e2e 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/SceneMaker.ts @@ -106,7 +106,8 @@ namespace phasereditor2d.scene.ui { if (sprites.length > 0) { - if (prefabObj instanceof sceneobjects.Container || prefabObj instanceof sceneobjects.Layer) { + if (!prefabObj.getEditorSupport().isPrefabInstance() + && (prefabObj instanceof sceneobjects.Container || prefabObj instanceof sceneobjects.Layer)) { parent = prefabObj; From 817469893e982a79d1ad071cf0f0c0cfc9ab1f0f Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 11:28:09 -0400 Subject: [PATCH 066/108] Nested prefab: allow picking nested prefabs in layer prefabs. --- .../phasereditor2d.scene/src/ui/editor/SelectionManager.ts | 2 +- .../src/ui/sceneobjects/container/ContainerEditorSupport.ts | 2 ++ .../src/ui/sceneobjects/layer/LayerEditorSupport.ts | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts index 1c6164f04..ca654fdaf 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/SelectionManager.ts @@ -142,7 +142,7 @@ namespace phasereditor2d.scene.ui.editor { const owner = objSupport.getOwnerPrefabInstance(); - if (owner instanceof sceneobjects.Container + if ((owner instanceof sceneobjects.Container || owner instanceof sceneobjects.Layer) && objSupport.isMutableNestedPrefabInstance() && owner.getEditorSupport().isAllowPickChildren()) { // ok, it can be selected diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index e40a46e50..30273088d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -18,10 +18,12 @@ namespace phasereditor2d.scene.ui.sceneobjects { } isAllowPickChildren() { + return this._allowPickChildren; } setAllowPickChildren(childrenPickable: boolean) { + this._allowPickChildren = childrenPickable; } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts index 9a544b4e1..3e7bbd563 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts @@ -33,7 +33,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { isAllowPickChildren() { - return !this.isPrefabInstance() && this.getObject().visible; + return (!this.isPrefabInstance() || this.getNestedActivePrefabInstances().length > 0) + && this.getObject().visible; } getCellRenderer(): colibri.ui.controls.viewers.ICellRenderer { From d5925bdd0cbb587eec7394472ac3337adaaded14 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 11:58:23 -0400 Subject: [PATCH 067/108] Scene Editor: refactoring container and layer editor support. --- .../ParentGameObjectEditorSupport.ts | 281 ++++++++++++++++++ .../container/ContainerEditorSupport.ts | 277 +---------------- .../container/ContainerExtension.ts | 6 +- .../sceneobjects/layer/LayerEditorSupport.ts | 61 +--- 4 files changed, 286 insertions(+), 339 deletions(-) create mode 100644 source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts new file mode 100644 index 000000000..c837715c2 --- /dev/null +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts @@ -0,0 +1,281 @@ +namespace phasereditor2d.scene.ui.sceneobjects { + + import controls = colibri.ui.controls; + import json = core.json; + + export abstract class ParentGameObjectEditorSupport + extends GameObjectEditorSupport { + + private _allowPickChildren: boolean = true; + + setInteractive() { + // nothing + } + + destroy() { + + for (const obj of this.getObject().getChildren()) { + + obj.getEditorSupport().destroy(); + } + + super.destroy(); + } + + getCellRenderer(): colibri.ui.controls.viewers.ICellRenderer { + + if (this.isPrefabInstance()) { + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + const file = finder.getPrefabFile(this.getPrefabId()); + + if (file) { + + const image = SceneThumbnailCache.getInstance().getContent(file); + + if (image) { + + return new controls.viewers.ImageCellRenderer(image); + } + } + } + + return new controls.viewers.IconImageCellRenderer(ScenePlugin.getInstance().getIcon(ICON_GROUP)); + } + + writeJSON(containerData: json.IObjectData) { + + super.writeJSON(containerData); + + this.writeJSON_children(this.getObject(), containerData); + } + + readJSON(containerData: json.IObjectData) { + + super.readJSON(containerData); + + this.readJSON_children(this.getObject(), containerData); + } + + private writeJSON_children(container: Container | Layer, containerData: json.IObjectData) { + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + const support = container.getEditorSupport(); + + if (support.isPrefabInstance()) { + + containerData.nestedPrefabs = container.getChildren() + + .filter(obj => obj.getEditorSupport().isMutableNestedPrefabInstance()) + + .filter(obj => finder.existsPrefab(obj.getEditorSupport().getPrefabId())) + + .map(obj => { + + const objData = {} as json.IObjectData; + + obj.getEditorSupport().writeJSON(objData); + + return objData as json.IObjectData; + }) + + .filter(data => (data.nestedPrefabs ?? []).length > 0 || (data.unlock ?? []).length > 0); + + } else { + + containerData.list = container.getChildren().map(obj => { + + const objData = {} as json.IObjectData; + + obj.getEditorSupport().writeJSON(objData); + + return objData as json.IObjectData; + }); + } + } + + private readJSON_children(container: Container | Layer, containerData: json.IObjectData) { + + const support = container.getEditorSupport(); + + const ser = support.getSerializer(containerData); + + const originalChildren = ser.read("list", []) as json.IObjectData[]; + + const maker = support.getScene().getMaker(); + + container.removeAll(true); + + const children = containerData.prefabId ? + ParentGameObjectEditorSupport.buildPrefabChildrenData(containerData, originalChildren) : originalChildren; + + let i = 0; + + for (const childData of children) { + + // creates an empty object + const sprite = maker.createObject({ + id: childData.id, + prefabId: childData.prefabId, + type: childData.type, + label: childData.label, + }); + + if (sprite) { + + container.add(sprite); + + const originalData = originalChildren[i]; + + if (originalData.scope === sceneobjects.ObjectScope.NESTED_PREFAB) { + + sprite.getEditorSupport()._setMutableNestedPrefab(true); + } + + // updates the object with the final data + sprite.getEditorSupport().readJSON(childData); + } + + i++; + } + } + + static buildPrefabChildrenData(objData: core.json.IObjectData, originalPrefabChildren: core.json.IObjectData[]) { + + const result: json.IObjectData[] = []; + + const localNestedPrefabs = objData.nestedPrefabs ?? []; + + for (const originalChild of originalPrefabChildren) { + + if (originalChild.scope !== sceneobjects.ObjectScope.NESTED_PREFAB) { + + result.push(originalChild); + + } else { + + + // find a local nested prefab + + let localNestedPrefab: json.IObjectData; + + for (const local of localNestedPrefabs) { + + const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, originalChild.id); + + if (remoteNestedPrefab) { + + localNestedPrefab = colibri.core.json.copy(local) as json.IObjectData; + localNestedPrefab.prefabId = remoteNestedPrefab.id; + + break; + + } else { + + if (local.prefabId === originalChild.id) { + + localNestedPrefab = local; + + break; + } + } + } + + if (localNestedPrefab) { + + result.push(localNestedPrefab); + + } else { + + // we don't have a local prefab, find one remote and create a pointer to it + + const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, originalChild.id); + + if (remoteNestedPrefab) { + + // we found a remote nested prefab, create a link to it + + const nestedPrefab: core.json.IObjectData = { + id: Phaser.Utils.String.UUID(), + prefabId: remoteNestedPrefab.id, + label: remoteNestedPrefab.label, + }; + + result.push(nestedPrefab); + + } else { + + // ok, just create a link with the original child + + const nestedPrefab: core.json.IObjectData = { + id: Phaser.Utils.String.UUID(), + prefabId: originalChild.id, + label: originalChild.label, + }; + + result.push(nestedPrefab); + } + } + } + } + + return result; + } + + private static findRemoteNestedPrefab(parentPrefabId: string, originalNestedPrefabId: string): json.IObjectData { + + const finder = ScenePlugin.getInstance().getSceneFinder(); + + const prefabData = finder.getPrefabData(parentPrefabId); + + if (!prefabData) { + + return null; + } + + const nestedPrefab = (prefabData.nestedPrefabs ?? []).find(obj => { + + const thisOriginalId = finder.getOriginalPrefabId(obj.prefabId); + + return thisOriginalId === originalNestedPrefabId + }); + + if (nestedPrefab) { + + return nestedPrefab; + } + + if (prefabData.prefabId) { + + return this.findRemoteNestedPrefab(prefabData.prefabId, originalNestedPrefabId); + } + + return null; + } + + async buildDependencyHash(args: IBuildDependencyHashArgs) { + + super.buildDependencyHash(args); + + if (!this.isPrefabInstance()) { + + for (const obj of this.getObject().getChildren()) { + + obj.getEditorSupport().buildDependencyHash(args); + } + } + } + + isAllowPickChildren() { + + return this._allowPickChildren; + } + + setAllowPickChildren(childrenPickable: boolean) { + + this._allowPickChildren = childrenPickable; + } + } +} \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index 30273088d..ec68ec15c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -1,292 +1,19 @@ +/// namespace phasereditor2d.scene.ui.sceneobjects { import controls = colibri.ui.controls; import json = core.json; - export class ContainerEditorSupport extends GameObjectEditorSupport { - - private _allowPickChildren: boolean; + export class ContainerEditorSupport extends ParentGameObjectEditorSupport { constructor(obj: Container, scene: Scene) { super(ContainerExtension.getInstance(), obj, scene); - this._allowPickChildren = true; - this.addComponent(new TransformComponent(obj)); this.addComponent(new VisibleComponent(obj)); this.addComponent(new ContainerComponent(obj)); } - isAllowPickChildren() { - - return this._allowPickChildren; - } - - setAllowPickChildren(childrenPickable: boolean) { - - this._allowPickChildren = childrenPickable; - } - - setInteractive() { - // nothing - } - - destroy() { - - for (const obj of this.getObject().getChildren()) { - - obj.getEditorSupport().destroy(); - } - - super.destroy(); - } - - async buildDependencyHash(args: IBuildDependencyHashArgs) { - - super.buildDependencyHash(args); - - if (!this.isPrefabInstance()) { - - for (const obj of this.getObject().getChildren()) { - - obj.getEditorSupport().buildDependencyHash(args); - } - } - } - - getCellRenderer(): colibri.ui.controls.viewers.ICellRenderer { - - if (this.isPrefabInstance()) { - - const finder = ScenePlugin.getInstance().getSceneFinder(); - - const file = finder.getPrefabFile(this.getPrefabId()); - - if (file) { - - const image = SceneThumbnailCache.getInstance().getContent(file); - - if (image) { - - return new controls.viewers.ImageCellRenderer(image); - } - } - } - - return new controls.viewers.IconImageCellRenderer(ScenePlugin.getInstance().getIcon(ICON_GROUP)); - } - - writeJSON(containerData: json.IObjectData) { - - super.writeJSON(containerData); - - ContainerEditorSupport.writeJSON_children(this.getObject(), containerData); - } - - readJSON(containerData: json.IObjectData) { - - super.readJSON(containerData); - - ContainerEditorSupport.readJSON_children(this.getObject(), containerData); - } - - static writeJSON_children(container: Container | Layer, containerData: json.IObjectData) { - - const finder = ScenePlugin.getInstance().getSceneFinder(); - - const support = container.getEditorSupport(); - - if (support.isPrefabInstance()) { - - containerData.nestedPrefabs = container.getChildren() - - .filter(obj => obj.getEditorSupport().isMutableNestedPrefabInstance()) - - .filter(obj => finder.existsPrefab(obj.getEditorSupport().getPrefabId())) - - .map(obj => { - - const objData = {} as json.IObjectData; - - obj.getEditorSupport().writeJSON(objData); - - return objData as json.IObjectData; - }) - - .filter(data => (data.nestedPrefabs ?? []).length > 0 || (data.unlock ?? []).length > 0); - - } else { - - containerData.list = container.getChildren().map(obj => { - - const objData = {} as json.IObjectData; - - obj.getEditorSupport().writeJSON(objData); - - return objData as json.IObjectData; - }); - } - } - - static readJSON_children(container: Container | Layer, containerData: json.IObjectData) { - - const support = container.getEditorSupport(); - - const ser = support.getSerializer(containerData); - - const originalChildren = ser.read("list", []) as json.IObjectData[]; - - const maker = support.getScene().getMaker(); - - container.removeAll(true); - - const children = containerData.prefabId ? - this.buildPrefabChildrenData(containerData, originalChildren) : originalChildren; - - let i = 0; - - for (const childData of children) { - - // creates an empty object - const sprite = maker.createObject({ - id: childData.id, - prefabId: childData.prefabId, - type: childData.type, - label: childData.label, - }); - - if (sprite) { - - container.add(sprite); - - const originalData = originalChildren[i]; - - if (originalData.scope === sceneobjects.ObjectScope.NESTED_PREFAB) { - - sprite.getEditorSupport()._setMutableNestedPrefab(true); - } - - // updates the object with the final data - sprite.getEditorSupport().readJSON(childData); - } - - i++; - } - } - - static buildPrefabChildrenData(objData: core.json.IObjectData, originalPrefabChildren: core.json.IObjectData[]) { - - const result: json.IObjectData[] = []; - - const localNestedPrefabs = objData.nestedPrefabs ?? []; - - for (const originalChild of originalPrefabChildren) { - - if (originalChild.scope !== sceneobjects.ObjectScope.NESTED_PREFAB) { - - result.push(originalChild); - - } else { - - - // find a local nested prefab - - let localNestedPrefab: json.IObjectData; - - for (const local of localNestedPrefabs) { - - const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, originalChild.id); - - if (remoteNestedPrefab) { - - localNestedPrefab = colibri.core.json.copy(local) as json.IObjectData; - localNestedPrefab.prefabId = remoteNestedPrefab.id; - - break; - - } else { - - if (local.prefabId === originalChild.id) { - - localNestedPrefab = local; - - break; - } - } - } - - if (localNestedPrefab) { - - result.push(localNestedPrefab); - - } else { - - // we don't have a local prefab, find one remote and create a pointer to it - - const remoteNestedPrefab = this.findRemoteNestedPrefab(objData.prefabId, originalChild.id); - - if (remoteNestedPrefab) { - - // we found a remote nested prefab, create a link to it - - const nestedPrefab: core.json.IObjectData = { - id: Phaser.Utils.String.UUID(), - prefabId: remoteNestedPrefab.id, - label: remoteNestedPrefab.label, - }; - - result.push(nestedPrefab); - - } else { - - // ok, just create a link with the original child - - const nestedPrefab: core.json.IObjectData = { - id: Phaser.Utils.String.UUID(), - prefabId: originalChild.id, - label: originalChild.label, - }; - - result.push(nestedPrefab); - } - } - } - } - - return result; - } - - private static findRemoteNestedPrefab(parentPrefabId: string, originalNestedPrefabId: string): json.IObjectData { - - const finder = ScenePlugin.getInstance().getSceneFinder(); - - const prefabData = finder.getPrefabData(parentPrefabId); - - if (!prefabData) { - - return null; - } - - const nestedPrefab = (prefabData.nestedPrefabs ?? []).find(obj => { - - const thisOriginalId = finder.getOriginalPrefabId(obj.prefabId); - - return thisOriginalId === originalNestedPrefabId - }); - - if (nestedPrefab) { - - return nestedPrefab; - } - - if (prefabData.prefabId) { - - return this.findRemoteNestedPrefab(prefabData.prefabId, originalNestedPrefabId); - } - - return null; - } - getScreenBounds(camera: Phaser.Cameras.Scene2D.Camera) { const container = this.getObject(); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts index 80e5f8f41..24ff706f8 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerExtension.ts @@ -28,12 +28,10 @@ namespace phasereditor2d.scene.ui.sceneobjects { const list = []; const children = args.serializer.read("list", []) as json.IObjectData[]; - // const nestedPrefabs = (args.serializer.getData().nestedPrefabs ?? []) - // .filter(data => sceneFinder.existsPrefab(data.prefabId)); - const nestedPrefabs = ContainerEditorSupport.buildPrefabChildrenData(args.serializer.getData(), children); + const nestedPrefabs = ParentGameObjectEditorSupport.buildPrefabChildrenData(args.serializer.getData(), children); - for (const objData of [...children, ...nestedPrefabs.values()]) { + for (const objData of [...children, ...nestedPrefabs]) { const ser = args.serializer.getSerializer(objData); diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts index 3e7bbd563..0289dba66 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts @@ -3,7 +3,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { import controls = colibri.ui.controls; import json = phasereditor2d.scene.core.json; - export class LayerEditorSupport extends GameObjectEditorSupport { + export class LayerEditorSupport extends ParentGameObjectEditorSupport { constructor(obj: Layer, scene: Scene) { super(LayerExtension.getInstance(), obj, scene); @@ -14,65 +14,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { ); } - setInteractive(): void { - // nothing - } - - async buildDependencyHash(args: IBuildDependencyHashArgs) { - - super.buildDependencyHash(args); - - if (!this.isPrefabInstance()) { - - for (const obj of this.getObject().getChildren()) { - - obj.getEditorSupport().buildDependencyHash(args); - } - } - } - - isAllowPickChildren() { - - return (!this.isPrefabInstance() || this.getNestedActivePrefabInstances().length > 0) - && this.getObject().visible; - } - - getCellRenderer(): colibri.ui.controls.viewers.ICellRenderer { - - if (this.isPrefabInstance()) { - - const finder = ScenePlugin.getInstance().getSceneFinder(); - - const file = finder.getPrefabFile(this.getPrefabId()); - - if (file) { - - const image = SceneThumbnailCache.getInstance().getContent(file); - - if (image) { - - return new controls.viewers.ImageCellRenderer(image); - } - } - } - - return new controls.viewers.IconImageCellRenderer(ScenePlugin.getInstance().getIcon(ICON_LAYER)); - } - - writeJSON(layerData: json.IObjectData) { - - super.writeJSON(layerData); - - ContainerEditorSupport.writeJSON_children(this.getObject(), layerData); - } - - readJSON(layerData: json.IObjectData) { - - super.readJSON(layerData); - - ContainerEditorSupport.readJSON_children(this.getObject(), layerData); - } - getScreenBounds(camera: Phaser.Cameras.Scene2D.Camera) { const layer = this.getObject(); From 168dcd692e4a4a4c0742cf41add3f19d65bb7fc9 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 12:17:48 -0400 Subject: [PATCH 068/108] Scene editor: unify Container section into Children section. --- .../phasereditor2d.scene/src/ScenePlugin.ts | 2 +- ...ainerComponent.ts => ChildrenComponent.ts} | 9 ++-- .../src/ui/sceneobjects/ChildrenSection.ts | 35 +++++++++++++++ .../container/ContainerEditorSupport.ts | 2 +- .../container/ContainerSection.ts | 44 ------------------- .../sceneobjects/layer/LayerEditorSupport.ts | 3 +- 6 files changed, 44 insertions(+), 51 deletions(-) rename source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/{container/ContainerComponent.ts => ChildrenComponent.ts} (66%) create mode 100644 source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenSection.ts delete mode 100644 source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerSection.ts diff --git a/source/editor/plugins/phasereditor2d.scene/src/ScenePlugin.ts b/source/editor/plugins/phasereditor2d.scene/src/ScenePlugin.ts index 1ee156c32..2b221b57c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ScenePlugin.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ScenePlugin.ts @@ -266,7 +266,7 @@ namespace phasereditor2d.scene { page => new ui.sceneobjects.ListVariableSection(page), page => new ui.sceneobjects.GameObjectListSection(page), page => new ui.sceneobjects.ParentSection(page), - page => new ui.sceneobjects.ContainerSection(page), + page => new ui.sceneobjects.ChildrenSection(page), page => new ui.sceneobjects.TransformSection(page), page => new ui.sceneobjects.OriginSection(page), page => new ui.sceneobjects.FlipSection(page), diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenComponent.ts similarity index 66% rename from source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerComponent.ts rename to source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenComponent.ts index eca96c20d..4a607f780 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenComponent.ts @@ -1,19 +1,20 @@ +/// namespace phasereditor2d.scene.ui.sceneobjects { - export class ContainerComponent extends Component { + export class ChildrenComponent extends Component { static allowPickChildren: IProperty = { name: "allowPickChildren", label: "Allow Pick Children", - tooltip: "If the container children can be pickable in the scene.", + tooltip: "If this object's children can be pickable in the scene.", defValue: true, local: true, getValue: obj => obj.getEditorSupport().isAllowPickChildren(), setValue: (obj, value) => obj.getEditorSupport().setAllowPickChildren(value) }; - constructor(obj: Container) { - super(obj, [ContainerComponent.allowPickChildren]); + constructor(obj: Container | Layer) { + super(obj, [ChildrenComponent.allowPickChildren]); } buildSetObjectPropertiesCodeDOM(args: ISetObjectPropertiesCodeDOMArgs): void { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenSection.ts new file mode 100644 index 000000000..4ebe9303d --- /dev/null +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenSection.ts @@ -0,0 +1,35 @@ +/// + +namespace phasereditor2d.scene.ui.sceneobjects { + + import controls = colibri.ui.controls; + + export class ChildrenSection extends SceneGameObjectSection { + + constructor(page: controls.properties.PropertyPage) { + super(page, "phasereditor2d.scene.ui.sceneobjects.ChildrenSection", "Children", false, true); + } + + getSectionHelpPath() { + + return "scene-editor/container-object.html#container-properties"; + } + + createForm(parent: HTMLDivElement) { + + const comp = this.createGridElement(parent, 2); + + this.createBooleanField(comp, ChildrenComponent.allowPickChildren, false); + } + + canEdit(obj: any, n: number): boolean { + + return GameObjectEditorSupport.hasObjectComponent(obj, ChildrenComponent); + } + + canEditNumber(n: number): boolean { + return n > 0; + } + } + +} \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts index ec68ec15c..269f91975 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerEditorSupport.ts @@ -11,7 +11,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { this.addComponent(new TransformComponent(obj)); this.addComponent(new VisibleComponent(obj)); - this.addComponent(new ContainerComponent(obj)); + this.addComponent(new ChildrenComponent(obj)); } getScreenBounds(camera: Phaser.Cameras.Scene2D.Camera) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerSection.ts deleted file mode 100644 index c6ab3806e..000000000 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/container/ContainerSection.ts +++ /dev/null @@ -1,44 +0,0 @@ -/// - -namespace phasereditor2d.scene.ui.sceneobjects { - - import controls = colibri.ui.controls; - - export class ContainerSection extends SceneGameObjectSection { - - constructor(page: controls.properties.PropertyPage) { - super(page, "phasereditor2d.scene.ui.sceneobjects.ContainerSection", "Container", false, true); - } - - getSectionHelpPath() { - - return "scene-editor/container-object.html#container-properties"; - } - - createMenu(menu: controls.Menu) { - - menu.addCommand(editor.commands.CMD_TRIM_CONTAINER); - menu.addCommand(editor.commands.CMD_BREAK_PARENT); - - menu.addSeparator(); - - super.createMenu(menu); - } - - createForm(parent: HTMLDivElement) { - - const comp = this.createGridElement(parent, 2); - - this.createBooleanField(comp, ContainerComponent.allowPickChildren, false); - } - - canEdit(obj: any, n: number): boolean { - return obj instanceof Container; - } - - canEditNumber(n: number): boolean { - return n > 0; - } - } - -} \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts index 0289dba66..069e47b52 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/layer/LayerEditorSupport.ts @@ -10,7 +10,8 @@ namespace phasereditor2d.scene.ui.sceneobjects { this.addComponent( new VisibleComponent(obj), - new AlphaSingleComponent(obj) + new AlphaSingleComponent(obj), + new ChildrenComponent(obj) ); } From f720fecf56556d4c8a15038516480558d4fb9df2 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 12:19:02 -0400 Subject: [PATCH 069/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 93422fae7..15cbbc02a 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -7,6 +7,7 @@ * Allows unlock the position of prefab instances. This change introduces a new scene format that is not compatible with previous versions of the editor. * Good bye `prefab-awake` & `components-awake` events. Welcome `scene-awake`. * Updates `UserComponent.js` templates. +* Scene Editor: replaces the Container section by the Children section, and applies for Layer objects too. ## v3.16.0-alpha.1 From 3cad9cf6d3ea1c304bb718fdda124cd56910c58d Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 12:46:27 -0400 Subject: [PATCH 070/108] Scene Editor: new Show Children In Outline property. --- .../SceneEditorOutlineContentProvider.ts | 11 +++++-- .../src/ui/sceneobjects/ChildrenComponent.ts | 18 ++++++++-- .../src/ui/sceneobjects/ChildrenSection.ts | 1 + .../ParentGameObjectEditorSupport.ts | 33 ++++++++++++------- 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts index 34ac1c42e..e85890e5b 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineContentProvider.ts @@ -48,9 +48,16 @@ namespace phasereditor2d.scene.ui.editor.outline { } else if (parent instanceof sceneobjects.Container || parent instanceof sceneobjects.Layer) { - if (parent.getEditorSupport().isPrefabInstance()) { + const editorSupport = parent.getEditorSupport(); - return parent.getEditorSupport().getNestedActivePrefabInstances(); + if (!editorSupport.isShowChildrenInOutline()) { + + return []; + } + + if (editorSupport.isPrefabInstance()) { + + return editorSupport.getNestedActivePrefabInstances(); } const list = [...parent.getChildren()]; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenComponent.ts index 4a607f780..7cca77904 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenComponent.ts @@ -5,16 +5,28 @@ namespace phasereditor2d.scene.ui.sceneobjects { static allowPickChildren: IProperty = { name: "allowPickChildren", - label: "Allow Pick Children", - tooltip: "If this object's children can be pickable in the scene.", + label: "Allow Picking Children In Scene", + tooltip: "If this object's children can be pickable (mouse-selected) in the scene.", defValue: true, local: true, getValue: obj => obj.getEditorSupport().isAllowPickChildren(), setValue: (obj, value) => obj.getEditorSupport().setAllowPickChildren(value) }; + static showChildrenInOutline: IProperty = { + name: "showChildrenInOutline", + label: "Show Children In Outline", + tooltip: "If showing the children in the Outline view.", + defValue: true, + local: true, + getValue: obj => obj.getEditorSupport().isShowChildrenInOutline(), + setValue: (obj, value) => obj.getEditorSupport().setShowChildrenInOutline(value) + }; + constructor(obj: Container | Layer) { - super(obj, [ChildrenComponent.allowPickChildren]); + super(obj, [ + ChildrenComponent.allowPickChildren, + ChildrenComponent.showChildrenInOutline]); } buildSetObjectPropertiesCodeDOM(args: ISetObjectPropertiesCodeDOMArgs): void { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenSection.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenSection.ts index 4ebe9303d..5419818ae 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenSection.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ChildrenSection.ts @@ -20,6 +20,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const comp = this.createGridElement(parent, 2); this.createBooleanField(comp, ChildrenComponent.allowPickChildren, false); + this.createBooleanField(comp, ChildrenComponent.showChildrenInOutline, false); } canEdit(obj: any, n: number): boolean { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts index c837715c2..7202d5f24 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts @@ -6,7 +6,28 @@ namespace phasereditor2d.scene.ui.sceneobjects { export abstract class ParentGameObjectEditorSupport extends GameObjectEditorSupport { - private _allowPickChildren: boolean = true; + private _allowPickChildren = true; + private _showChildrenInOutline = true; + + isAllowPickChildren() { + + return this._allowPickChildren; + } + + setAllowPickChildren(childrenPickable: boolean) { + + this._allowPickChildren = childrenPickable; + } + + isShowChildrenInOutline() { + + return this._showChildrenInOutline; + } + + setShowChildrenInOutline(showChildrenInOutline: boolean) { + + this._showChildrenInOutline = showChildrenInOutline; + } setInteractive() { // nothing @@ -267,15 +288,5 @@ namespace phasereditor2d.scene.ui.sceneobjects { } } } - - isAllowPickChildren() { - - return this._allowPickChildren; - } - - setAllowPickChildren(childrenPickable: boolean) { - - this._allowPickChildren = childrenPickable; - } } } \ No newline at end of file From 40517a986fd101e3ca24c01775445db8f4aaf764 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 12:47:02 -0400 Subject: [PATCH 071/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 15cbbc02a..aa9e0f1b8 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -8,6 +8,7 @@ * Good bye `prefab-awake` & `components-awake` events. Welcome `scene-awake`. * Updates `UserComponent.js` templates. * Scene Editor: replaces the Container section by the Children section, and applies for Layer objects too. +* Scene Editor: new Show Children In Outline parameter in the Children section. ## v3.16.0-alpha.1 From 058b030ca3b254396afcb18de8859b4238fc6a57 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 14:44:17 -0400 Subject: [PATCH 072/108] BitmapText: fixes error when not font is available. --- .../ui/sceneobjects/bitmapText/BitmapText.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapText.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapText.ts index ba81b904d..1b655351a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapText.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/bitmapText/BitmapText.ts @@ -4,8 +4,37 @@ namespace phasereditor2d.scene.ui.sceneobjects { private _editorSupport: BitmapTextEditorSupport; + private static getFont(scene: Scene, font: string) { + + let entry = scene.sys.cache.bitmapFont.get(font); + + if (!entry) { + + font = "__missing__"; + + entry = scene.sys.cache.bitmapFont.get(font); + + if (!entry) { + + const data: Phaser.Types.GameObjects.BitmapText.BitmapFontData = { + chars: {}, + font, + lineHeight: 10, + retroFont: false, + size: 10 + }; + + entry = { data }; + + scene.sys.cache.bitmapFont.add(font, entry); + } + } + + return font; + } + constructor(scene: Scene, x: number, y: number, font: string, text: string | string[]) { - super(scene, x, y, font, "New BitmapText"); + super(scene, x, y, BitmapText.getFont(scene, font), "New BitmapText"); this._editorSupport = new BitmapTextEditorSupport(this, scene); } From eeda787ea1dde47289ce06a7b265a39f6c8b0d24 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 14:45:10 -0400 Subject: [PATCH 073/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index aa9e0f1b8..c17728a6b 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -9,6 +9,7 @@ * Updates `UserComponent.js` templates. * Scene Editor: replaces the Container section by the Children section, and applies for Layer objects too. * Scene Editor: new Show Children In Outline parameter in the Children section. +* Scene Editor (BitmapText): fixes error when the font data isn't available in the cache. ## v3.16.0-alpha.1 From 0a1e5c8ef59de51e92c81473f392eef4612d4bec Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 23:11:46 -0400 Subject: [PATCH 074/108] Nested prefabs: using a valid syntax with temporal component vars. --- .../object/properties/UserComponentsEditorComponent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts index 117a46ec3..83d77dfd5 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts @@ -258,7 +258,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const compName = comp.getName(); - const compVarName = args.objectVarName + compName; + const compVarName = (args.objectVarName + compName).replaceAll(".", "_"); const prefabPropsStart = args.lazyStatements.length; From 47f1d35505fc3bf2f351cf8b6bf6ff183b2b7782 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 23:57:35 -0400 Subject: [PATCH 075/108] Delete Parcel project templates. --- .../Parcel/JavaScript/files/.babelrc | 5 - .../Parcel/JavaScript/files/.eslintrc.js | 16 - .../Parcel/JavaScript/files/.gitignore | 5 - .../providers/Parcel/JavaScript/files/.skip | 3 - .../providers/Parcel/JavaScript/files/LICENSE | 21 - .../Parcel/JavaScript/files/jsconfig.json | 9 - .../Parcel/JavaScript/files/package.json | 37 - .../files/public/assets/asset-pack.json | 17 - .../JavaScript/files/public/assets/dino.png | Bin 32631 -> 0 bytes .../Parcel/JavaScript/files/public/publicroot | 0 .../Parcel/JavaScript/files/readme.md | 119 - .../files/src/components/Behaviors.components | 17 - .../files/src/components/PushOnClick.js | 50 - .../files/src/components/UserComponent.js | 65 - .../Parcel/JavaScript/files/src/index.html | 15 - .../Parcel/JavaScript/files/src/main.js | 30 - .../JavaScript/files/src/scenes/Level.js | 49 - .../JavaScript/files/src/scenes/Level.scene | 43 - .../providers/Parcel/JavaScript/template.json | 7 - .../Parcel/TypeScript/files/.eslintignore | 4 - .../Parcel/TypeScript/files/.eslintrc.js | 19 - .../Parcel/TypeScript/files/.gitignore | 4 - .../providers/Parcel/TypeScript/files/.skip | 3 - .../providers/Parcel/TypeScript/files/LICENSE | 21 - .../Parcel/TypeScript/files/package-lock.json | 6082 ----------------- .../Parcel/TypeScript/files/package.json | 38 - .../files/public/assets/asset-pack.json | 17 - .../TypeScript/files/public/assets/dino.png | Bin 32631 -> 0 bytes .../Parcel/TypeScript/files/public/publicroot | 0 .../Parcel/TypeScript/files/readme.md | 111 - .../files/src/comps/Behaviors.components | 18 - .../TypeScript/files/src/comps/PushOnClick.ts | 49 - .../files/src/comps/UserComponent.ts | 64 - .../Parcel/TypeScript/files/src/index.html | 15 - .../Parcel/TypeScript/files/src/main.ts | 29 - .../TypeScript/files/src/scenes/Level.scene | 55 - .../TypeScript/files/src/scenes/Level.ts | 52 - .../Parcel/TypeScript/files/tsconfig.json | 30 - .../providers/Parcel/TypeScript/template.json | 7 - 39 files changed, 7126 deletions(-) delete mode 100644 source/templates/providers/Parcel/JavaScript/files/.babelrc delete mode 100644 source/templates/providers/Parcel/JavaScript/files/.eslintrc.js delete mode 100644 source/templates/providers/Parcel/JavaScript/files/.gitignore delete mode 100644 source/templates/providers/Parcel/JavaScript/files/.skip delete mode 100644 source/templates/providers/Parcel/JavaScript/files/LICENSE delete mode 100644 source/templates/providers/Parcel/JavaScript/files/jsconfig.json delete mode 100644 source/templates/providers/Parcel/JavaScript/files/package.json delete mode 100755 source/templates/providers/Parcel/JavaScript/files/public/assets/asset-pack.json delete mode 100644 source/templates/providers/Parcel/JavaScript/files/public/assets/dino.png delete mode 100755 source/templates/providers/Parcel/JavaScript/files/public/publicroot delete mode 100644 source/templates/providers/Parcel/JavaScript/files/readme.md delete mode 100755 source/templates/providers/Parcel/JavaScript/files/src/components/Behaviors.components delete mode 100755 source/templates/providers/Parcel/JavaScript/files/src/components/PushOnClick.js delete mode 100755 source/templates/providers/Parcel/JavaScript/files/src/components/UserComponent.js delete mode 100644 source/templates/providers/Parcel/JavaScript/files/src/index.html delete mode 100644 source/templates/providers/Parcel/JavaScript/files/src/main.js delete mode 100755 source/templates/providers/Parcel/JavaScript/files/src/scenes/Level.js delete mode 100755 source/templates/providers/Parcel/JavaScript/files/src/scenes/Level.scene delete mode 100644 source/templates/providers/Parcel/JavaScript/template.json delete mode 100644 source/templates/providers/Parcel/TypeScript/files/.eslintignore delete mode 100644 source/templates/providers/Parcel/TypeScript/files/.eslintrc.js delete mode 100644 source/templates/providers/Parcel/TypeScript/files/.gitignore delete mode 100644 source/templates/providers/Parcel/TypeScript/files/.skip delete mode 100644 source/templates/providers/Parcel/TypeScript/files/LICENSE delete mode 100644 source/templates/providers/Parcel/TypeScript/files/package-lock.json delete mode 100644 source/templates/providers/Parcel/TypeScript/files/package.json delete mode 100755 source/templates/providers/Parcel/TypeScript/files/public/assets/asset-pack.json delete mode 100644 source/templates/providers/Parcel/TypeScript/files/public/assets/dino.png delete mode 100755 source/templates/providers/Parcel/TypeScript/files/public/publicroot delete mode 100644 source/templates/providers/Parcel/TypeScript/files/readme.md delete mode 100755 source/templates/providers/Parcel/TypeScript/files/src/comps/Behaviors.components delete mode 100755 source/templates/providers/Parcel/TypeScript/files/src/comps/PushOnClick.ts delete mode 100755 source/templates/providers/Parcel/TypeScript/files/src/comps/UserComponent.ts delete mode 100644 source/templates/providers/Parcel/TypeScript/files/src/index.html delete mode 100644 source/templates/providers/Parcel/TypeScript/files/src/main.ts delete mode 100755 source/templates/providers/Parcel/TypeScript/files/src/scenes/Level.scene delete mode 100755 source/templates/providers/Parcel/TypeScript/files/src/scenes/Level.ts delete mode 100644 source/templates/providers/Parcel/TypeScript/files/tsconfig.json delete mode 100644 source/templates/providers/Parcel/TypeScript/template.json diff --git a/source/templates/providers/Parcel/JavaScript/files/.babelrc b/source/templates/providers/Parcel/JavaScript/files/.babelrc deleted file mode 100644 index 7b5554a63..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/.babelrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "plugins": [ - "@babel/plugin-proposal-class-properties" - ] -} diff --git a/source/templates/providers/Parcel/JavaScript/files/.eslintrc.js b/source/templates/providers/Parcel/JavaScript/files/.eslintrc.js deleted file mode 100644 index ab4c1f75a..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/.eslintrc.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - root: true, - parserOptions: { - ecmaVersion: 6, - sourceType: 'module' - }, - env: { - es6: true, - browser: true - }, - extends: [ - 'eslint:recommended' - ], - parser: "babel-eslint", - rules: {} -} diff --git a/source/templates/providers/Parcel/JavaScript/files/.gitignore b/source/templates/providers/Parcel/JavaScript/files/.gitignore deleted file mode 100644 index f24962f3a..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/.cache -/dist -/node_modules -/package-lock.json -/.DS_Store diff --git a/source/templates/providers/Parcel/JavaScript/files/.skip b/source/templates/providers/Parcel/JavaScript/files/.skip deleted file mode 100644 index a9812ed1f..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/.skip +++ /dev/null @@ -1,3 +0,0 @@ -.cache -dist -node_modules diff --git a/source/templates/providers/Parcel/JavaScript/files/LICENSE b/source/templates/providers/Parcel/JavaScript/files/LICENSE deleted file mode 100644 index 50b01a7d8..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 ourcade - -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. diff --git a/source/templates/providers/Parcel/JavaScript/files/jsconfig.json b/source/templates/providers/Parcel/JavaScript/files/jsconfig.json deleted file mode 100644 index 9bb5d0c7d..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/jsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "module": "es6", - "moduleResolution": "node", - "esModuleInterop": true, - "strict": true - } -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/JavaScript/files/package.json b/source/templates/providers/Parcel/JavaScript/files/package.json deleted file mode 100644 index 8b376f691..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "phaser3-parcel-template", - "version": "1.0.0", - "description": "A template project for Phaser 3 using Parceljs", - "scripts": { - "start": "parcel src/index.html -p 8000", - "build": "parcel build src/index.html --out-dir dist", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "supertommy", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/ourcade/phaser3-parcel-template.git" - }, - "homepage": "https://github.com/ourcade/phaser3-parcel-template", - "devDependencies": { - "@babel/core": "^7.10.5", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "babel-eslint": "^10.1.0", - "cssnano": "^4.1.10", - "eslint": "^6.8.0", - "minimist": ">=1.2.2", - "parcel-plugin-clean-easy": "^1.0.2", - "parcel-plugin-static-files-copy": "^2.4.3" - }, - "parcelCleanPaths": [ - "dist" - ], - "staticFiles": { - "staticPath": "public", - "watcherGlob": "**" - }, - "dependencies": { - "phaser": "^3.55.0" - } -} diff --git a/source/templates/providers/Parcel/JavaScript/files/public/assets/asset-pack.json b/source/templates/providers/Parcel/JavaScript/files/public/assets/asset-pack.json deleted file mode 100755 index 1f95ba47b..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/public/assets/asset-pack.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "section1": { - "files": [ - { - "url": "assets/dino.png", - "type": "image", - "key": "dino" - } - ] - }, - "meta": { - "app": "Phaser Editor 2D - Asset Pack Editor", - "contentType": "phasereditor2d.pack.core.AssetContentType", - "url": "https://phasereditor2d.com", - "version": 2 - } -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/JavaScript/files/public/assets/dino.png b/source/templates/providers/Parcel/JavaScript/files/public/assets/dino.png deleted file mode 100644 index cb4561fb1c4e71e875bf229cf5538f59e8d63f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32631 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 For people who want to spend time making games instead of configuring build tools. - -## Author - -This template is a fork of the [Ourcade's Parcel Template for Phaser 3](https://github.com/ourcade/phaser3-parcel-template). The Phaser Editor 2D team added a couple of files and configurations focused on the Phaser Editor 2D tools. - -## Prerequisites - -You'll need [Node.js](https://nodejs.org/en/), [npm](https://www.npmjs.com/), and [Parcel](https://parceljs.org/) installed. - -It is highly recommended to use [Node Version Manager](https://github.com/nvm-sh/nvm) (nvm) to install Node.js and npm. - -For Windows users there is [Node Version Manager for Windows](https://github.com/coreybutler/nvm-windows). - -Install Node.js and `npm` with `nvm`: - -```bash -nvm install node - -nvm use node -``` - -Replace 'node' with 'latest' for `nvm-windows`. - -Then install Parcel: - -```bash -npm install -g parcel-bundler -``` - -## Getting Started - -Go into your new project folder and install dependencies: - -```bash -npm install -``` - -Start development server: - -``` -npm run start -``` - -To create a production build: - -``` -npm run build -``` - -Production files will be placed in the `dist` folder. Then upload those files to a web server. 🎉 - -## Class Properties Support - -This template includes class property support out of the box using `@babel/plugin-proposal-class-properties`. - -A `.babelrc` is included as well as the use of `babel-eslint` as the parser for ESLint. - -# ESLint - -This template uses a basic `eslint` set up for code linting to help you find and fix common problems in your JavaScript code. - -It does not aim to be opinionated. - -[See here for rules to turn on or off](https://eslint.org/docs/rules/). - -## Dev Server Port - -You can change the dev server's port number by modifying the `start` script in `package.json`. We use Parcel's `-p` option to specify the port number. - -The script looks like this: - -``` -parcel src/index.html -p 8000 -``` - -Change 8000 to whatever you want. - -## Other Notes - -[parcel-plugin-clean-easy](https://github.com/lifuzhao100/parcel-plugin-clean-easy) is used to ensure only the latest files are in the `dist` folder. You can modify this behavior by changing `parcelCleanPaths` in `package.json`. - -[parcel-plugin-static-files](https://github.com/elwin013/parcel-plugin-static-files-copy#readme) is used to copy static files from `public` into the output directory and serve it. You can add additional paths by modifying `staticFiles` in `package.json`. - -## Phaser Editor 2D notes - -We did minor changes to this repo for making it more friendly with Phaser Editor 2D. - -### Excluding files from the project - -There are a lot of files present in the project that are not relevant to Phaser Editor 2D. For example, the whole `node_modules` folder should be excluded from the editor's project. - -The `/.skip` file lists the folders and files to exclude from the editor's project. - -[Learn more about resource filtering in Phaser Editor 2D](https://help.phasereditor2d.com/v3/misc/resources-filtering.html) - -### Setting the root folder for the game's assets - -The `/public` folder contains the assets (images, audio, atlases) used by the game. Parcel copies it to the distribution folder and makes it available as a root path. For example, `http://127.0.0.1:8000/assets` points to the `/public/assets` folder. - -By default, Phaser Editor 2D uses the project's root as the start path for the assets. You can change it by creating an empty `publicroot` file. That is the case of the `/public/publicroot` file, which allows adding files to the Asset Pack file (`/static/assets/asset-pack.json`) using correct URLs. - -### Coding - -The `/src` folder contains all the JavaScript code, including the scene and user component files, in addition to the Phaser Editor 2D compilers output. - -We recommend using Visual Studio Code for editing the code files. - -In many tutorials about Phaser Editor 2D, the JavaScript files are loaded using the Asset Pack editor. When using Parcel this is not needed. Just use the Asset Pack editor for loading the art assets. - -### Scene and User Components configuration - -The Scenes and User Components are configured to compile to JavaScript ES modules. Also, the compilers auto-import the classes used in the generated code. - -## License - -[MIT License](https://github.com/ourcade/phaser3-parcel-template/blob/master/LICENSE) diff --git a/source/templates/providers/Parcel/JavaScript/files/src/components/Behaviors.components b/source/templates/providers/Parcel/JavaScript/files/src/components/Behaviors.components deleted file mode 100755 index cd813f25e..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/src/components/Behaviors.components +++ /dev/null @@ -1,17 +0,0 @@ -{ - "components": [ - { - "name": "PushOnClick", - "baseClass": "UserComponent", - "gameObjectType": "Phaser.GameObjects.Image", - "properties": [] - } - ], - "meta": { - "app": "Phaser Editor 2D - Object Script Editor", - "url": "https://phasereditor2d.com", - "contentType": "phasereditor2d.core.scene.SceneContentType" - }, - "exportClass": true, - "autoImport": true -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/JavaScript/files/src/components/PushOnClick.js b/source/templates/providers/Parcel/JavaScript/files/src/components/PushOnClick.js deleted file mode 100755 index 7dceade50..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/src/components/PushOnClick.js +++ /dev/null @@ -1,50 +0,0 @@ - -// You can write more code here - -/* START OF COMPILED CODE */ - -import UserComponent from "./UserComponent"; - -export default class PushOnClick extends UserComponent { - - constructor(gameObject) { - super(gameObject); - - this.gameObject = gameObject; - gameObject["__PushOnClick"] = this; - - /* START-USER-CTR-CODE */ - // Write your code here. - /* END-USER-CTR-CODE */ - } - - /** @returns {PushOnClick} */ - static getComponent(gameObject) { - return gameObject["__PushOnClick"]; - } - - /** @type {Phaser.GameObjects.Image} */ - gameObject; - - /* START-USER-CODE */ - - awake() { - - this.gameObject.setInteractive().on("pointerdown", () => { - - this.scene.add.tween({ - targets: this.gameObject, - scaleX: "*=0.8", - scaleY: "*=0.8", - duration: 80, - yoyo: true, - }); - }); - } - - /* END-USER-CODE */ -} - -/* END OF COMPILED CODE */ - -// You can write more code here diff --git a/source/templates/providers/Parcel/JavaScript/files/src/components/UserComponent.js b/source/templates/providers/Parcel/JavaScript/files/src/components/UserComponent.js deleted file mode 100755 index d164fbc9b..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/src/components/UserComponent.js +++ /dev/null @@ -1,65 +0,0 @@ -import Phaser from "phaser"; - -export default class UserComponent { - - /** - * @param {Phaser.GameObjects.GameObject} gameObject The entity. - */ - constructor(gameObject) { - - this.scene = gameObject.scene; - - const listenAwake = this.awake !== UserComponent.prototype.awake; - const listenStart = this.start !== UserComponent.prototype.start; - const listenUpdate = this.update !== UserComponent.prototype.update; - const listenDestroy = this.destroy !== UserComponent.prototype.destroy; - - if (listenAwake) { - - gameObject.once("components-awake", this.awake, this); - } - - if (listenStart) { - - this.scene.events.once(Phaser.Scenes.Events.UPDATE, this.start, this); - } - - if (listenUpdate) { - - this.scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); - } - - if (listenStart || listenUpdate || listenDestroy) { - - gameObject.on(Phaser.GameObjects.Events.DESTROY, () => { - - this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.start, this); - this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); - - if (listenDestroy) { - - this.destroy(); - } - }); - } - } - - /** @type {Phaser.Scene} */ - scene; - - awake() { - // override this - } - - start() { - // override this - } - - update() { - // override this - } - - destroy() { - // override this - } -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/JavaScript/files/src/index.html b/source/templates/providers/Parcel/JavaScript/files/src/index.html deleted file mode 100644 index b4b1cc871..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/src/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - Phaser3 + Parceljs Template - - - - - - diff --git a/source/templates/providers/Parcel/JavaScript/files/src/main.js b/source/templates/providers/Parcel/JavaScript/files/src/main.js deleted file mode 100644 index 4241606e5..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/src/main.js +++ /dev/null @@ -1,30 +0,0 @@ -import Phaser from "phaser"; -import Level from "./scenes/Level"; - - -class Boot extends Phaser.Scene { - - preload() { - - this.load.pack("pack", "assets/asset-pack.json"); - } - - create() { - - this.scene.start("Level"); - } -} - -const game = new Phaser.Game({ - type: Phaser.AUTO, - width: 800, - height: 600, - backgroundColor: "#424242", - scale: { - autoCenter: Phaser.Scale.CENTER_BOTH, - mode: Phaser.Scale.ScaleModes.FIT - }, - scene: [Boot, Level] -}); - -game.scene.start("Boot"); \ No newline at end of file diff --git a/source/templates/providers/Parcel/JavaScript/files/src/scenes/Level.js b/source/templates/providers/Parcel/JavaScript/files/src/scenes/Level.js deleted file mode 100755 index 4a67ccf0a..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/src/scenes/Level.js +++ /dev/null @@ -1,49 +0,0 @@ - -// You can write more code here - -/* START OF COMPILED CODE */ - -import Phaser from "phaser"; -import PushOnClick from "../components/PushOnClick"; - -export default class Level extends Phaser.Scene { - - constructor() { - super("Level"); - - /* START-USER-CTR-CODE */ - // Write your code here. - /* END-USER-CTR-CODE */ - } - - editorCreate() { - - // dino - const dino = this.add.image(400, 249, "dino"); - - // text - const text = this.add.text(400, 441, "", {}); - text.setOrigin(0.5, 0.5); - text.text = "Phaser 3 + Phaser Editor 2D + Parcel"; - text.setStyle({"fontFamily":"arial","fontSize":"3em"}); - - // dino (components) - new PushOnClick(dino); - dino.emit("components-awake"); - } - - /* START-USER-CODE */ - - // Write your code here - - create() { - - this.editorCreate(); - } - - /* END-USER-CODE */ -} - -/* END OF COMPILED CODE */ - -// You can write more code here diff --git a/source/templates/providers/Parcel/JavaScript/files/src/scenes/Level.scene b/source/templates/providers/Parcel/JavaScript/files/src/scenes/Level.scene deleted file mode 100755 index eb1b8f96b..000000000 --- a/source/templates/providers/Parcel/JavaScript/files/src/scenes/Level.scene +++ /dev/null @@ -1,43 +0,0 @@ -{ - "id": "a24288db-e4a5-43d2-be02-93cd9829e67f", - "sceneType": "SCENE", - "settings": { - "exportClass": true, - "autoImport": true, - "preloadPackFiles": [], - "createMethodName": "editorCreate", - "sceneKey": "Level" - }, - "displayList": [ - { - "type": "Image", - "id": "0de1ae62-c08c-419c-9cfb-d64ad7c47028", - "label": "dino", - "components": [ - "PushOnClick" - ], - "texture": { - "key": "dino" - }, - "x": 400, - "y": 249 - }, - { - "type": "Text", - "id": "573b93fd-8e91-4f64-8332-98ab39de87a5", - "label": "text", - "components": [], - "x": 400, - "y": 441, - "text": "Phaser 3 + Phaser Editor 2D + Parcel", - "fontFamily": "arial", - "fontSize": "3em" - } - ], - "plainObjects": [], - "meta": { - "app": "Phaser Editor 2D - Scene Editor", - "url": "https://phasereditor2d.com", - "contentType": "phasereditor2d.core.scene.SceneContentType" - } -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/JavaScript/template.json b/source/templates/providers/Parcel/JavaScript/template.json deleted file mode 100644 index af831286f..000000000 --- a/source/templates/providers/Parcel/JavaScript/template.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "openFiles": [ - "src/scenes/Level.scene", - "readme.md" - ], - "skipLibs": true -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/TypeScript/files/.eslintignore b/source/templates/providers/Parcel/TypeScript/files/.eslintignore deleted file mode 100644 index 0051b4b26..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -# don't ever lint node_modules -node_modules -# don't lint build output (make sure it's set to your correct build folder name) -dist diff --git a/source/templates/providers/Parcel/TypeScript/files/.eslintrc.js b/source/templates/providers/Parcel/TypeScript/files/.eslintrc.js deleted file mode 100644 index 7f1a550f3..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/.eslintrc.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - plugins: [ - '@typescript-eslint' - ], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended' - ], - rules: { - '@typescript-eslint/explicit-function-return-type': 0, - '@typescript-eslint/ban-ts-ignore': 0, - '@typescript-eslint/no-namespace': { 'allowDeclarations': true }, - '@typescript-eslint/member-delimiter-style': 0, - '@typescript-eslint/no-explicit-any': 0 - } -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/TypeScript/files/.gitignore b/source/templates/providers/Parcel/TypeScript/files/.gitignore deleted file mode 100644 index 3ec622aee..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/.cache -/dist -/node_modules -/.DS_Store diff --git a/source/templates/providers/Parcel/TypeScript/files/.skip b/source/templates/providers/Parcel/TypeScript/files/.skip deleted file mode 100644 index 964145e81..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/.skip +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -.cache \ No newline at end of file diff --git a/source/templates/providers/Parcel/TypeScript/files/LICENSE b/source/templates/providers/Parcel/TypeScript/files/LICENSE deleted file mode 100644 index 50b01a7d8..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 ourcade - -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. diff --git a/source/templates/providers/Parcel/TypeScript/files/package-lock.json b/source/templates/providers/Parcel/TypeScript/files/package-lock.json deleted file mode 100644 index c7e8cc200..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/package-lock.json +++ /dev/null @@ -1,6082 +0,0 @@ -{ - "name": "phaser3-parcel-template", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "phaser3-parcel-template", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "phaser": "^3.55.0" - }, - "devDependencies": { - "@typescript-eslint/eslint-plugin": "^2.29.0", - "@typescript-eslint/parser": "^2.29.0", - "cssnano": "^4.1.10", - "eslint": "^6.8.0", - "minimist": ">=1.2.2", - "parcel-plugin-clean-easy": "^1.0.2", - "parcel-plugin-static-files-copy": "^2.4.3", - "typescript": "^3.8.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "node_modules/@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^2.0.0", - "eslint": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "dev": true, - "dependencies": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001204", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", - "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", - "dev": true - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "engines": { - "node": ">4" - } - }, - "node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "dependencies": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.3.701", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz", - "integrity": "sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/eslint/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "node_modules/hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "node_modules/hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "node_modules/html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "dependencies": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "dependencies": { - "html-comment-regex": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "node_modules/normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parcel-plugin-clean-easy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parcel-plugin-clean-easy/-/parcel-plugin-clean-easy-1.0.2.tgz", - "integrity": "sha512-k20c17ff+HpN/GwIkDK0UivZxttVci6qM6uQTjTDHnsZoOyvKd8UReUHuksJdBsDrlPjYE3W6vJW4k4nbmhJYA==", - "dev": true, - "dependencies": { - "rimraf": "^2.6.2" - } - }, - "node_modules/parcel-plugin-static-files-copy": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/parcel-plugin-static-files-copy/-/parcel-plugin-static-files-copy-2.6.0.tgz", - "integrity": "sha512-k3YxdnEQWo1aMfCeBfxgUNJWuUE0O730EGiGBcmWEUOto7f1jM/8oxBKXkVZsXDCO1o00dw5X7CsT+yF0JY4qA==", - "dev": true, - "dependencies": { - "minimatch": "3.0.4", - "path": "0.12.7" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/phaser": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.54.0.tgz", - "integrity": "sha512-/1XVI6J2siS0OGwJez7vLbRjars1zb//EvJdYMVyd3wNTUf5DHrvYUj1f6TsEISr4vjnbrNtS66QIuPbGU8x6A==", - "dependencies": { - "eventemitter3": "^4.0.7", - "path": "^0.12.7" - } - }, - "node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-colormin/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "dependencies": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "dependencies": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "dependencies": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "dependencies": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-svgo/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "node_modules/rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/stylehacks/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "node_modules/uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001204", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", - "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - } - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "electron-to-chromium": { - "version": "1.3.701", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz", - "integrity": "sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true - }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "parcel-plugin-clean-easy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parcel-plugin-clean-easy/-/parcel-plugin-clean-easy-1.0.2.tgz", - "integrity": "sha512-k20c17ff+HpN/GwIkDK0UivZxttVci6qM6uQTjTDHnsZoOyvKd8UReUHuksJdBsDrlPjYE3W6vJW4k4nbmhJYA==", - "dev": true, - "requires": { - "rimraf": "^2.6.2" - } - }, - "parcel-plugin-static-files-copy": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/parcel-plugin-static-files-copy/-/parcel-plugin-static-files-copy-2.6.0.tgz", - "integrity": "sha512-k3YxdnEQWo1aMfCeBfxgUNJWuUE0O730EGiGBcmWEUOto7f1jM/8oxBKXkVZsXDCO1o00dw5X7CsT+yF0JY4qA==", - "dev": true, - "requires": { - "minimatch": "3.0.4", - "path": "0.12.7" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "phaser": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.54.0.tgz", - "integrity": "sha512-/1XVI6J2siS0OGwJez7vLbRjars1zb//EvJdYMVyd3wNTUf5DHrvYUj1f6TsEISr4vjnbrNtS66QIuPbGU8x6A==", - "requires": { - "eventemitter3": "^4.0.7", - "path": "^0.12.7" - } - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } -} diff --git a/source/templates/providers/Parcel/TypeScript/files/package.json b/source/templates/providers/Parcel/TypeScript/files/package.json deleted file mode 100644 index 31b7a8191..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "phaser3-parcel-template", - "version": "1.0.0", - "description": "A typescript template project for Phaser 3 using Parceljs", - "scripts": { - "start": "parcel src/index.html -p 8000", - "build": "parcel build src/index.html --out-dir dist", - "test": "echo \"Error: no test specified\" && exit 1", - "lint": "eslint ./src --ext .js,.jsx,.ts,.tsx" - }, - "author": "supertommy", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/ourcade/phaser3-parcel-template.git" - }, - "homepage": "https://github.com/ourcade/phaser3-parcel-template", - "devDependencies": { - "@typescript-eslint/eslint-plugin": "^2.29.0", - "@typescript-eslint/parser": "^2.29.0", - "cssnano": "^4.1.10", - "eslint": "^6.8.0", - "minimist": ">=1.2.2", - "parcel-plugin-clean-easy": "^1.0.2", - "parcel-plugin-static-files-copy": "^2.4.3", - "typescript": "^3.8.3" - }, - "parcelCleanPaths": [ - "dist" - ], - "staticFiles": { - "staticPath": "public", - "watcherGlob": "**" - }, - "dependencies": { - "phaser": "^3.55.0" - } -} diff --git a/source/templates/providers/Parcel/TypeScript/files/public/assets/asset-pack.json b/source/templates/providers/Parcel/TypeScript/files/public/assets/asset-pack.json deleted file mode 100755 index 1f95ba47b..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/public/assets/asset-pack.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "section1": { - "files": [ - { - "url": "assets/dino.png", - "type": "image", - "key": "dino" - } - ] - }, - "meta": { - "app": "Phaser Editor 2D - Asset Pack Editor", - "contentType": "phasereditor2d.pack.core.AssetContentType", - "url": "https://phasereditor2d.com", - "version": 2 - } -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/TypeScript/files/public/assets/dino.png b/source/templates/providers/Parcel/TypeScript/files/public/assets/dino.png deleted file mode 100644 index cb4561fb1c4e71e875bf229cf5538f59e8d63f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32631 zcma%CWmp?s(+*awxVuAfcWZGC5ZtX4clY81E$&d<-QAty?(Xi+$MfU;|K&QHP4-Im z?93TGa}QV%D2arCj{pDwkff!=K%eL5{|>k>pYNfkT7sV^Xh#ug6}Zor7u?U#&+qVd zQksqc0K~ul4v5U_8Q|wdJSTAtCuQ4TPOgRyCIDAgS0-~COGjfvI};{b2h+530ek>} z6d*13L&YuqwB0qCP(7v5JF8@TEzS`{Xksog{Y_(_fdRHF*~~bin<2Ssv1&KS`(f>| zdbDFy@3ep4(h!Ql5Qk-HlaptNM|=8Pgnz;>4)*EYNnTaH4U)OFnQ}bw30(8pMrKXb zxxx})(zE)6W9Ch|<6o&5a`7-sT2S8q??WlV)k?+p82YqwOUn~EvIat3QH_1o@_}Fv>S45k^ zctVL?Lhv8-`Hvt765@ve(J!kF;(|;`{v-2E^AdvsyNk0eDbTK7H+|Ji@ zVuOu!(bIKj%+Z?h4ks0JN zJlsyh)QTgr;9nWPI9l7?S>t6e_qvSZs6*f%N_0`mIEv3af2M9H4-l_w(~ zPN}C@IalCe>_?{eFW+uXm~9i6Ujsvc9pM&=JL{-%2ENVg_Ajfp1c>(kD zI#8W&lBDp!e* zpC)E{z0$U5Kl{*2(bwJZ%MCFVa)p;Ona6su&1ug_o{JRJ-;Lbkm-pFEu&2nXcgrXN2E4euV7 zc6?0udc+=N5e%KdLQ+|6bOb~aG%Bj;0U7XrSy{#Rh9F;W%TB}r4+MgV!pu)s>N=h) z1YZWTeCDudAu)9y++`)T&j!E0vv(cW=UcUQAp9PNkCgP`3N>7$>wHT5=e6&c)yqPD zoB7OIkm5D>Aap-M`Ehjt>-bXX`$pt-x|5ZgSB5}#s*zP(C{5`vHApFceqWA|j4JQ6|2R5~k=Aw?@nt2ie6!sURQ}i}7?X*+4qA$?gT^_g#D4B^|&_@2faI&{{(UH~pw&MG@I-6Fz zFW2DBOxE-6T3xr8{BxbvT}W_+AR{24Me(=(jA!b`iBWt3L`FJ$-QQ$M!VMpFNU}tz zGdujwJV(vVg$K~l(LEgoWc6&_0#Ffxj?VadySi9{Z8q&%e#r4AAmT7>GrwO~7FXI1 z5!12fKUR948+!c79->n6`hAl;z_($9n$|r(6Vp4jYO4QyBAnMy0nYBu=-VkYJR+5R*?vDm(vfer{Uy~`|o zDI~vJ(D%h4eVoIXVBt|oCQJfa3N+vFcHFIz$hS&Z>k>U|eE6+)U~b=VZ|Hm_?8FZf z$r?Q6=XplAgB+?KB|?U^?L4soNJ#3X-+4wwEXo7Kl{A{nXa^P2$$1=Q1ZjZjo5Gz} z-X5NXo|r4P9YF&FR-U>{q0pA+sdpoKqL@KKoiT7vXRlBfUJGZRT7(vUA1n1W<3>!L zo%tmAsLor@ToVsinAR}^#hxge4?10MCzz>m+nqY{b5>PqK5O9KzsHj8*sGyaf&O-% zJK;H9aP6E#{vjN5B-4I&zXC{3Kc)MI6Ml5+;T{^GYy1^ypqc?ZQ>>`8mF?^fW4WL@ zwX9{o?upluU`bpQ7A6ML)s-cWp~ghm8!=BEpokU_5wJnA@!UJSJyoZrDqU!hKSQkE zap>?xOZ(I|USOdTm7FSoqmg5BvI)0W3N?HQY??^r{<`4(`peXJynQ0)1p8B9BqTA~ zE>{7Jh%(JPQT=sH%vo1@VRVX^ekRh>M;yp={i$=78Z|#@qXqAAi&et>{2(&jw!x5F z2UMfGEb?(9*D`c;C2(J80IBn3#qfke0@!K!l8*99n9l-|tVG-^6rinrqBKBgpaN;W zIJwQ`zYhT^TU*1D(wuMc2?-eCl2i4??v%g>$;ZY@l1*oBj;jK0=Kd{I(+rxTqFWZ$ zOiJQtG=!*~%Xt3d`e7JrW{ZgWTA9Nu#1`f~YGq976$XW~15n@P4551s3+`=qRN+xbfUgx4Xj- zH#vB1enO!}$*K0yvt2H%yXi@RX|AlT?JF(g_7(fHQ z3tdU-VcZH8p{1N-Wv5?|4-UKibrhR+Jr#G z_8uMsODpCNmh@pgIPaSZO*f1W+xLk%eCgjxpbAIBnH5u7Ll;hVTzwymz0MtdfA<<{ zzr4SH6ZU#^>;9)!nZkF#Js}WOaTGWJ{7W;a(QI@ydnZ7={&L=UW9s`_?0=(N%yCrr zrE6%2B}S^i63BAvWNT}|MLbk5HHDRWAtmN=7%S==2UNH`q*!Z?v9xs`U1@e7B>HxI zo8_OwXV0^S`>axR8cfiT3kR$Jw9?sA!+?BBVzPAY&|p=+vhn_sLRZ3l8iSySz+C7}euR9Y?E$7 z|NMBTc->!0!Xw5rHe%~LJmjHi^~A%&%WWGAnb9;u2}I@KWZvBDh6)t;t?Dga;N>$%PAMv}#m)VU_fP4RH^H!3E~Lh?z3^2>YpsK>=QOrM~hUY}VW1 zAIt z^kg|r%fG*W!}l~4aI#pF?`J$n4Hn}7RFe0#WXJTm?jOedll@PDqe!`PC^LX)2+Q+J z7bq;OcvK0gybUI}UnT@@z5+U5H!{3-10Iw>=tJI__3PS=HalY}J^+uG9tLgJ1nQMl zot{A-Td0kv%HFRiD-UNUC;63?5B_r%l@C|v4;2N~Qz%`Y=lcEXozvh7ZPMoU-1hwk zK9q>J9dY3h%k-QRp$jzLY??Uun%WTB5>mo+_iM?~8n@HxLAWmgfWwyYEp;Gf{1g)Z zV}o7y_G)!^_mQ+^eZ7#-(-HD{lOroc=Z$|oBfaCzry1Q+&N>?c6aH;k9!%S4`C0OJ z*Ose(uDpE{CLAChE_6{{C9?EhZ^sju11G1PW65We6_;ky0v|otE6dz2Mu|>_9e#C~ z8_mX{!c)WOTU2bK**sRi-15A7Wv7@{jf`B_6Qzw^^|p@<%=~JKAMqHjaM*fql$HRryo)2Xl?3J$qggd z=xFob8=VkFI8TRbI>_96JyXB`BZvQcad}Gb<|+r#*D&l;3kT!LleqW!F;Txn#DPYf)k-o7A;&b>xh{<@My709{s7xjlf_ z`Ts2GwfA2K)OkN6GRMGv0~b#NgTSEhg0ds_&L!!t+^a)o-*H&s#~=9k1<~YCO&@|6 zT_;zh`ILlUOsD?41DJVyd`R|m!B$*}bon$HjjFCVK@}s~>sAo5?cA1(8Rho1&RPtwOm)>W~BcNh_W!Nl3+c5bdo`D*SvpDW0G>T%BCcg6=o>){Br8%_ub0E3g~5RR)m|J1~y_jU*4ot zL_$R#beqWt=XoB1PNZ6DzLB1rf zQSJ8+f{2w4co)**CmZ(OW>F#)XFB)qJ* zB4pW~2im0Ir()Cb6qG<_ZFEnmvr()EE>44#t}dWGM z0H0o|j*0$Y7mT{4h(E)z)c#^Zh@2oEp0vAs$&LmNeA?%Jk4(}_#TR*wYE7y>b!Z)9 zidFIWN?TZXJU`!ZD3n5p&I-{6;{2B#BWB;;Q2Pzxla7x070SRS#J>#{@q6?mN|@cL z^>erBU(vv3Qs!49^dX0G_gfR0|egtjJrFoo1Gz6 zT*s_060-+cZc_@wFd*sZi3k_7Uc9`G9iKXpki-k4`T8DFvSUn??WS_4dR#kSy(F_M2}kGB1k#zXNkBeI-Vn{Z#7IkIPv?KEh<4ihM4GOsMV`j}bN zFxpRF{md99DznlLPExY>1e4jyP^8m$ef_3nvUGh@7G1j0De)69o8S^pBtscs)kpXY+yP#>QO zRnAKClJQ*2Ntcq=PK5<;E@x97twRaTV`L&J_VV{S%5?SyNrvWJdkgMM7;E(!OXEN3 zKx2qsecoQW8?96U6@$YqlCmO85V*=FvIs@pC#>dAEDFBe(#J;y5g`!~5!KG4s--Uz zv+Xpzcu*woC#2ApObklB~6(~Q! zFAZ-n!H{K++aRZd(GYa;!ZUF_BAh%N<}1{7cSfw~MJh7u5%v2qTNf$-Ty<7v95EZz zHy71j!&*Xi9|3R>0Rf`7_ji-t$8a>jc7Gc)fc8A&lG9*!reJjDLyu{;k$}lh5KW6h zaI<}@Gk2t+QCa%45O&UCi*nteI&`q|DWDA?i&L=+^&lLY$Z^Qa0ZEHe znpk#_*(lhht>wZBHH%6=QLDT+ z`>KhT6%F&{|Je1Nf32E7(UZbV&R9#X=f?+%ICkDPnOIQ9^(ODH!a#_UWr&6pL^NS; zb33}!mWF-`IVz>YGNu&zaP=0>5#Jl-FKXqn6Nc=HpGpm(7{wc|v=8p@i*A^1kX<#D zq5%yi@`du-SF#fltr|{@a%{Z*Ch}Q{7F>VOsi`@hpOxhz4$fJ1K&;QR>8qD?xu4P= z7*NPZl6a{H%`D9WX{2ypyCucVob`;yHWOw0O`pp-N2Q{5))W5G+@-aUKbfBxp^!CV z$$5)$v|&3Ho0=db*;-DSjVqHnp<%I=zfzj%X@5q6o!d6CG@?1nzH?}ge4g>>(f@ZR z`HjeW&0~4|%ds?`eJ1a{ZYwHommw{##B}5)Zo#U_^Nc47iIBjK+bI&ku_fjVA*4#7 z^5s@^!Vt# zl`yNa)XYs+SKQcK*F^q9%8nA}4WBrQ3g7arQnYHe=5ND*q)9@C{IAr8Z-SYlXMbXF zJ<^>#AbXQrdGYfD6*XwkIsc%`iC!<}{^0m`F9q#oa^W{6xnBmUjwinGhG6_JmDBIO zpD1g_|5lpT=j-n4E%@+Arx|2>7R0m%VGn!BEOl_yKtr?0pG%8bdQXlX;3hvm+h$wXZpp=0^{C7LTQX=)ws6ocxVw- zYKqKZMsdmq&n{Vri3e&N&d)7I?UA`JUZ+1STwg;vZ``}^`F1PmQq3eFdk$BjGF$NI6L1sV!1Pjkoav=8Wh>WQs2 zmeZD7=@G#Tzp|*0H;sn>wU!Ja~P_cLOSuePjNNgzkp?b5vG5wwe&A}+XaHUHq)Qp&-nIm@>k;`*RJGrs| zyV&Ne6%GNYl+12h1?RMJ3FFDvhDsoTj#APfjdS^;1^H5Jw_4@IH#&TM59gwtGeX7? z!}S{fj*t-E2~5qR^6>Ex3VUy{`@GaKpFa}%cT(KgD&iOY9Ncf5QE9{t^f$y$F8D!? zM?skJjfdNP9{*=)qLbZ9Lu*mFg@_VnAgZ!2fNceNPTJap-J&hR%mZ>w&TsF#{qorg z*ghknw2kLl=T54x?@W#5t2CQ=cFDH?*}b|boeBC^d@VjEC1B4aH!m?X4wLtggVCcTQcYmv4Px@ zQVYYE#K!HLFQ{-j$lP;#&J0#M<0VuCnjKXc)3FHDy}5_MiPfhK1imNEuGKb6zf}6c z{@;JT+kQv_cX>DDWr9N_imvMc{u+D{ikyK)2AY4(V_^^-Eu(8)6$n+a;^RxC;D_Ub z5*zGzpiB7p=hrx>t^%cb@-V{FlINQRFEZn#Gu;H@9T)tJk;k<4g?NOV#^b`qP_m(B z7rq1sZT5C~$X;#@c=#Iim-MZ#uhU!Nt$kV#8}ZPKn4@K@Vr!F?0q#vF9&2+1zgR39 zgfKwTjJ&Eil%*E8(l)cHK@&ma%4o*QMPar_HlvMURygT}!hA{iDN}Ivjn%@0)UhGH zOwyK$pjhlyx+)3Dg1N=jZhw-=Q`k z&L=_djhyo@C`gf%&%UE`P=Bq>wafdiEFnw)&Z>xu4OcEI{j5|{hT#&S5hhG_y)cq3 z{NO^Pwx@!ZVuteJHo~EJB?o5s7}H@#6V%U~zFJvVOnFD;F%372u(v!hN1HX!f@V4r z$?`LVl>D}N_3hCM!SlZF=uBQ&tpo(J_^^^wj+N7-M5ivGRf>1ib{~z+o58*c6sOF= zh{DYSsdbnL(Nq@=SH8Q(Dht9u+4=;{G&z2}UoDYL3ZbNMi@=%{-H`>l$*yO6Z2A>w zee{&@9kA!-9yOEXI1?X_q;=9mrvV^492#s}FhY*U;4p_UEap=`8K@>i@hlkP>hLK< zN~&tyCe=Y~xkHXdA?YVfjDD%#Ousp#D_SJ?C!F9#q?2x1^q}UFQWnPt<-p#z<4x&Tzg@Q(|+6O30Hd1^k>AnHjfj zM*L&<>J~fbi#1k}XhDL#T`H>{;k^l_0rl_2Fvq%6-KIXr=F(m7EMg0Wf3Nz1b^MZc z{OTP*0jB7TY^i5ndqhU{{iQCoRS;>rzk3w$HR_J+k6BCbhBh13YHfLQ)tX~xV|>AK zzdP~wfw>8vxwe{S*gwuEekwW?c&w-*hUDuLZmUu2+KE95aH&NDhaLl`Sp$Rb6e%3E z^p5E>d(nYNnO@{W*#TExr6lN~FZ`_%ALm0cMmWp)EX*wn*GC%aHz;sI5StG0PP*9l zoe0D(Zeu8&uh+Z%%<9(`C$m#qvjJ_83@}AV47tVmnQxL=JL6{;6of0Ye#a4Yg*W32)i0FEMTn1AGRpa|&u|?Z4`g)}E$aw|r zL#L#e?FIX;kFB9~=A7ic5D5(dgvj068*1_c%rJGOcDkWu_JI2GHi3swAY3!H#0bVB-pLszWUL&nnM6m z{kk4m-{25#jq9pv?_+XI7Eb#BTYT#=fuI5s3XOhTj67#%0W7K)psU!!yv%Gb;T^}k zLSM%COyr*M9VxL+qronN@m!#>{qI?YoaPn9n&)Ek3mR8tXJ%^27h?Bgeg+GzsF|a2 zPtEV|tzK57Vhr(=id*^l^@+j9*liL}ktXz)%_EAKSgMH_^PZ?ZdIr^nG~&j&1f3i2 z#Z7Anvf6?iT+Nf5(v)m_Aq2sc88y1T@^QGqj4GW9hDRV2qO>ktR6A_(zxy_6_h*GUFYkXgWWe94tOI-< zTLPK%YSpL<=jY!O4ohr$K|kTJ($MI5uvRJgW9t!Y{53l3m(tF)4o=$HNPxM<*9UoY z6q=aD(%fg+H8^oH0b+_5wm(u{<7@*I7|AlYWTyt255tsx=m{ew#Y?JhKA-y;Yh`*n z*&W^T&h-JQTCfSK$oTlWbqsdZUinG#X^>?bhlS1k37u6UQFfDmPrgSKW+B+`*Ck#Q z$dc{3B8hhx>n}ViW7e+eVSRD{@DJ(T7<8@lJtE@JY8f;o8t118$0!`t=kWt0h{yFpA9tf%FBr^=@Qd$RaH)i#FFq-`9j!?wmq@f zCEHybGnDn1gC6(x$7A$XdW`{C;qwQ96+c@S+5DO))-u`_?|7u7yYwX((0<5-bL;ss zk78Fqk%iLq=5a=Dbx32*1by#TKQ6HO!J8N#fdrjG7_PXY1GHn1VaxoS03<^`EdA{N zB83}AN{KunRT2GWrNb0-tOcvr7&gji*9=_%UNa@;hL^{uj6FD0Kt$|z{WH>eeuU4< zF*?yH73^+4)ooMCJ^Qo*UB)FJzF+VKo7tQUjil>LNuzC1cEJy~03K4S>UBqy0-R)8 zi)<~+UH;=5769y*t#^eNfn(^+scFCrIR=m|I@-~cBQ7YZ>J3gQzg#wX*UdKWmpv_E zw>Ol4_gkpGM%=|p^%qqXnJUd7%rmZp<=S`^TBF3sg8j~}OgU```V}b06_w2si?A5;=*7LlK{XYcktHNlz|L02 z&R4?DYxt0LGVoR2(vNJ@koFM~YOmW{H&>W|5F9w7Q@rno^O_NL*X^^5;@e-+XvbGL9k={Onqh*ihWfCc2 z--pp?Wa@fGg76Z8nF*YID(3`HQROq}H2v1#@K148N6qNYCWmtS6nI$g#xoXouJ9FU^Tf_yh>IIq+&DjwsA zN)KC@kE?>x18ao&Dd*NP6!)H8*R-BUrvp9fF;(rq+Z-ae9OFTX4IIn3Sv)8dF_fC# z#Ui<_`uy?Vs@8KM@`!D?R(1<9PunQP*hmRl8s`8?xb7 z)d%KjrihE!N4ef9AD0;maP&-Skj(8Nm1(ua;N>UdY5SD93e&uxU?_<3OxH%63552M z<7U(ySO^P_hktk`Lru6)V;2ernVaCAhKfe{tyt9UfA3bQ^siS!|$yzjZms} z`3~~O)CCL&ihrnZQ!yopSZAb_SkOd9+F&!-&8(glRIGz%IDe0F*4G@BB&0d6h>V~( zIdMGyx-iG#CArZ%Ea9wIx!meqgOXKiuj3(A~YI@P+y7!1bevRzI3#CNWzDxp-OSPMP-cB?-jR*=uT8{`0 z$w-f5K-26ED5Eu1dE#2ptk@@_Xb5`hc%bDJhmerWfqb{C=8@w2Mmw)l7`f3Znj)6z znPUdI1Lm3)nkbxtWKRM1XuX+wmf=|`n~kk9gA?awuoGQgLHk22iABt)(K_N9nX+W< zN-hOPQ3-5_F&&nk67*=IyW>kD=E|>=^&TUOJ&}|*`Uwfy6pT9AJJ6nXXyWt{KbO=7 z*wEh??d#f@9J(=%fSVDwIb*;7vx%8`26zjuI|h2<^a%$1M^G_8^6;MCD>`xM z^?(v;X$YBFqSNUi68>kFf=87bB(qvV@=xw>iv6G1_{?N3Yvt+74~`ec76s~S8t?B) z(7=T;;e4q_jqZ1O?lq1(FKCjMh(WDgw&VqCr{8(X)w6PK-v}UFcwS)~qqsR*4v%XZ zVT^{$)^y<5OYQziZBNuWongD)e@wr3Vm1o~k}4jP5zDi3;r8sg?APq9YH`B-Sg6*` z3qa1R<6(Ox9@%@l%QmR>9{kInYOM8uYFC-oM>vJN)SBA+szowJ@egO$NnQc@CO!G-CY zXFQu5btS?T7UD-~8){B|5Wz`o4H#R+xN}wo%wRu_D*THND>F#^^JmDTu6XP?8#I#s z7Y1D{a}n)#UQI##NDGKO4t_g^QcG(Beog%Mb8P-sNuYzl<^sSi9YU+L@e|R~r90eG zpe;=RF9IejfkadaO2u0>dWeHvRsH?f(+I~T^NW89gTbhOd}4}{sz0qGg#D=I`PUq9 z7WppM@AVERzezzGm^m_*iDO``X&BPBgZfVrmd4I451-3+eFy{cb=cQoE5RFbcJ>Qh zSD2INnicJavR;<$LyxW4rKdAlGSjORsT6`h!(@DqeVDkjPcX=)=7S*nh@8xTq{!EF zeB+-6u_Y}aItv+xELlp#k!1}~J-DC-OXVq5Q|W;Zb8C#MO^VjOSkFQhI~R_M#*Y3b zWkdBxLT6AQw&6F2hiW6mwTD zS3`BNeCPS80Fe+qQJ6D!86MV;5OnS`SM4TUA!=kVslAq{ev=-qlk84^`=7{A?Ix1H zUrJu|oZYi>Jx|xw1Oz-CWz1Kb!!Y5{I(FJ2W;9`oaMwo=$TL0rG^kE!xr8XgP{P@H zX24`AXdXuV&JX&ml)n}4uw7gfU;o{-PgFcE&h1$VjgK9Ew3FC17=9H|&>~1F~iCi3--KKzE|BRK;tW@at zp4c=+Ztng-2lu!`Gs;e{@M9&%6+FFK&57m^4%wtF=D-bvIAmdKIPktH*fI1Se*bf| zg?goN%>ZHAXp%WHB?Qvy1CfDJ+auzB^-F0fi+1MskGkt0FP-jB zZr;ASW-0Vr)IH$lC!yz=pH1Hgr#&w??3kdv0UaJbcLGiTBlM77uW=;(9C7Kq zZ;N#~f`YW$)e&iQJd^G`JeC;J6+HEid4X`hr4h(Tt*POugA2p0zieqI{`BJMTQsoy zBFl6G&5RhxT>e_~g#CW%{Ss|>93ctokQr=JqM@V+;xL-0QR+^c*9cq$q z9fey`$5Bg0@6Wqe1#-Nb&eK!5bF`X&Q^sbD#ivOp9PA-C4@4}hO7HG($O{th*u2q$ zG=*6mceygPC^Xea&fW4s*TQ6D#$v}XS5KDF6%P%mNlP)Qy!XrKjUzhtN=dp^tOfFtg#p>86X&?M0EBz{6 zw>8I1%ZBrJp({yh`rTf7y2v|fDCD7<0DDnCbu7LysY75g*ZA|MvU%LNpmIeU=Dd0#Rw@jiCtok<`rl~>SwSj7;-qw% z;j}qomR7gj={HvEQ-)EYHIW0@b%*)&n$Wxf9=>M|5vAfg=7Id@(EP!(izIqebh!uz zYPa-w;)!;RKL&DlX%sj6n}0;^v3%&SWLzxS+|HE>K7$#}lni7ICBp}NLT@VH2J7xf z?(&H2mFLASyX+9E6qX9TJ^bY(!O=+Cw}B2*0A%*CRP)J#wXD zXI`aijQxD5ptWS$v`y*Nlt6iKx(^u3cQ42n6ptGkd&vgFGk{1{zZSC+@&dIKur=5eB#N>8~`53XAOj+6KsWePf^O zS06H0mKN;=3tN0y$~y(Z&1H~D!q`}2YBd6~#g<(6TPo;165lEOle(}$T5>smw`2FD z7@W|0L_{~m78rwj*1iS zarRS)xo0lIKKIGGlHee5d|l`ie9j3p$)H!4cURiT7sv2g$y}U9%J!A=Dzg}zH7Rz! zRBp@o+nQf%+oyWYgDoxf>>2vIbM~Al7HG)vwg4=EA zy6T^k_q|UP$J3`4PBmEvV=hPDLzwAnrn zId2r|{i9vT@kmOWRhqU@3}+yn4`fdoygw~38V(Rg+>cWMLj=eEmxD#%pRB{vRqaVs z-@tw%?|SYZD*MtZUYnOt+evlBJ@qER3@rpAh20M4Ca zxDJPUx%ft1#r}?z4eaIf>gzj>Pc#@T7!jH2=`*M@vio@T(~pxG{Mh-9uY&U%Y7phC zR1*eVz?zT(dz3#0ECgWzO4?^7m9@$;KDjeF6qEgQbWp*DtKZtw8-ZP~Fliq(~jvU#NAyZQ`^>_I%bK-d}j;ZZ0E^$~8ZGT*P_| z6goK7ch&VQEi)(HGv8?B{?)@g8r~;Mhhb7Ak8r5-Nvd69^YJP1hv=2?BI0<2N)&!*TQAixHCh`wr(dj#Gi8*@9BMDj&yy9l6boG)y}-jfpoZUP z-VoBB0dzKsKRt*J&U6#gT;)G&Yv!>nc4nZbk%?uyAA+fNOcl$S8}o^( zN>bZuxy^sBG|A!g@aYae5+67C6FFNf)f!mo;vCsG;kaxW#y$DrZ^(PEt#!nhNKCpS z#`zOHfbu8#xyyTVdrnE8$R@zth}FBvEOj#C0#@8F_*cN(83H0Uo?E-Q7PhtFj5GJ- zhGztg?;GUK&QkTxH8$(UN9NBA1OG5V?e@DjfOIP zK)CaZY6ot7r1e}DNB$!{nOx;Da!ylDQ@n-TKS@5pggzr_sPG%p>r z&1BzR!v>&QL-=zT8@FD1SbSsFAA1pgB>oce{PYy7A5fn8mFSm!S; zwWP}6Iua7<%Z3^}y2v1PLBlgEfs&DBgfzjX%8&hCEH0iet{KF+({}Piscf8AZ|`&l zD3?{gNvQM*E6nst3F+))*Ur-<^;w@%yCI>CQ#i0xoS7&e{QjK^o%QAq=+3DdcR838Ld&yOoADCBr{8?+K1oe5oVdNK-J&BacT&B2_+ab+?AWaH~ zbUtG&eE3WuJ1e)e%v^@=2foTvo0XRS3*StQ55lh3;)>127!=7f5hN8>il!|eSOR70 zobab^h?p!QNZQZvcg0ePa|;y^mM0y(aOV95WXE%AzoS{1+#7g~wGZ ztIB3|t?RVkuz%~uCO*5SpsW_nDhXmjv$j6nA$Sm|tPfky39$_y=Qc)}!ZyW$DBs#t zrwkB>O9%S(7H>MxHl;&GOZM-m+O?+h5DGDjc5%ebj7JVW+w(m?9g3Epdex*Cy1JO= zJTgo$7nU5j;^;8J$k!rZdrK8k7r?hS=hHSao_e0<4VBrc!s&Lk)~qa8YfJNRIM!e< z4wyKAdSmas>_S=#{OwAVpH7;~kDiXqDxaWZJ83YiwHw+}gx_Z-Kzd5y=9D~+&#ctc z_i-24^kIJ~H~-f41?4m;sp6nxjXD`f`_*;TQBJc#5Xlx)k70^P5hB|I(dfd$zYmK9 zR^{#l$B?3td>=VtMw`LiDmZIE^}Ws|Gpg=k6WR#kxAhWAuDgmGW08Xf|l#<2)5Yij6pzS%{{T(2i$n(i%d4bnArRSGI5Gox#^D8?D z({CkzH|MhW)+swleOB%aP80K)!J!{fSF24Z4Yk?F7%@ibfp_#X<;gYXQxHV^X{0l_ z2XdhQAkTN+g`=~(^0{EBcGtagk-gUc=?}JTGNvc-J|x2ww`;jT8yIkb`1=i6=Uis> z9Dxw|V{bzdF1-TuIqIDLnAIiKLMgObjb2#!C}QkL1@K0WbW9XA0wq&uc{dspWQ-S@@Z&$Kq< z%cW;R3%|jxsiV#wB;ULWLsj4-d7Eoms32s+m00TF2*LBi%*NfXIP{wiNDuwvRM8Y#L)fE$j!)t*u5ify+4j3Xyg&_@(DN#) zw*!Fza(<;x$*!YUYq%^{@Ff)YJIB}{L+1t0sLF`<TWcs^;_syj)A^#_ zHtDBTC9b38V&C~KNjAG=Ij96dE9vFZqgG$pYHe1}^Fv4V){3isp+ljI$UwpV&iCVy zy-CLgcqbsoFds6pA!cq)FOniUC^O>NFw@;|I=l;abi3;w7hRB%q$y{=a+i_fo6DM?S&x>VIqWk!UK)?styaO7k zw9;Hsan4jW4T_4A$cn$Vt$9K5In^7Xx4^@7^H;ot6Y|B-vt4^)Vx|9VzjY619V6bV z>K=$f$7XDC$~|$R7wa(xJ}BtZ=eGQ^VAY1&e}~Ye_?)oQjolHugs!N>!T#;eWOijqzlO!1XTlf&RU*A)wwkPL?mtG3_mV{+M57mrdgf8kD8R zW(N-zMAOqTr=jzOaUNtY)b}JXJN>Xp^j{PQiotE#x!E_5w1 zTXlM1q>3f zvjki%;zr>0{I13$UJQirb+cwUbIFU;J{w;f0nyeO$x^8TxidVc*KY=!t7A)Ku;%Vw zyktr|PgWftnjc>8^*qZrv`V+$Q;4jPGat|#ejUs=)LX4OAtvehLT)rxms!-IM?P46 zmxwQkfBI*DTuO9E+FG82fUvEk1>H_JIO#gk+G5wR>jbSXK zg@Ya(>?PoO`%s+JbQu(@tO(C&Nd9?uWe{3jspmC)eEc4FOo4Xa4&&>rLgS=L#LK*e z-_=?Me^PmxpFO1A%6%g2kaL7)drM4Y8dsvTeFh_n=jI9}#(@+ya|Eriu9O`iIOA%{ z**iYBk0We8YPt`7$`lSU>yXas5O&huoKEZk?p1EdQG~s?+;Xe^!yFF_>nXWjD|eJJ z%l7SmSb)u=6mrk+ie}VT611ZAPevzdmxO0lOVAGtYLqUY*Njma#8zcizrJEUjB(vs`jz_#!FH{BEME4Y&T-# znN`!7$3TnaLYPEg6G<0~Tth>7VP~a|&P8;x*Z&1=K9a$v3nhKhsmlxvo*ie z$hUFQg+?q|&ShOMG2K~O(Ps(^p6D;XJdjX=R{&gB(Q$e5drv9-knAI1TGgyr8RvcP zZz=Zi7A%)ie{R=~=D*s#z2zOdcGcC4df_!7JntPM_nE$V?=1`tJ~zti?YYC(Wm+rg zlTLRqICz|Fws+RN>a&S_?Y?LGPovui&5lsVle2C=2+A66zy(2D`U6C6&fGq4*9`?9(;> zvb`$Q8!`*mQH{m_;jj%ynRm#p4Je zup$%nssbD9X`Yj)wT|1hF1)NaOE|fZ(ZnmhcHE>-?cejUak7;7pD7Xu_OXYH4rKTfovVaLt*I)VLI`a{ zTwNfgx8ObJ*Mp(qkj&N9p-$d3i`SpZl=v_-X2zkhgvCL00F?M=g!&Y~p+m_j5`-b?@Gefkt#<*{99jjLteLqUUz@SHWr%QKt@n?d5;DrI@dyGx$vXorV z!j{=U{xhtr3k6Jup`&XWp6}DwSCURE)x4Jdx{(ok=*wXFgWXqt)RNP2p*^!C{F^?UU9dGz&q z3=H_lT+gEo8)rv>)fY3>Ov_|wI6)#&w1kAxdPkjL3Dd%&A^PFNT^D!l zXnG2G#P=144<)(tt|>dl3os19FZ|+)g8qFx2%!^?FUK&$47e(wu?f^xNf2c5{WP9C zjPHB=)Bo<~{CS&=o8r?R*Nu+8zM_txv7y+=!7@!!=?p`|C0YPo^|6E*!GaI3l|l(o zXo~pa3yCSk)JLMW*0?6g0jx-Ef#jtSLc=iPM59eqRc{~`tEZ~kAR5)L*;Vw7jH_3} zZHlhztX@^@&Z1Dbj!R#6(R2?q)jj6}yg{+3?#K;`6;*Lr+W{2k&ll2aGlvfKO}^yK5+=l=x+@=l zoIpwbH2?Vd=Y|XW;@N`lXUN(;lRCD#+9Wnjzrh;?SFeOC`ug?j%briA(g-aZ){6^q zmc=CZTi{r9ccrk*uL6AlgM&WDj?R9sM8_E*ow|hYjor>zN{@8vGOJeWB^vrAj6^CG z6#CO|-P%@o-nO%NzK;yb8eyK9^8wz#Sad``aNuf2Aqpj$o_%&G-#uhj;rkiV=?)UZ zXUL>GaI$?k**?;#%On%$@%=PSO(yHsFL~U@!^I25ZP3o0#cs@rWJvH#rdV-CDcOq5}xi_zM)B0R4U5oUH13C?)Z{6xnPa*=!%apC-S`3jw#?Hnn1jZzNp27@F;k zjZLgv8CKZ|0!ca@>S8XOzfd?T(9>*Cyw@W#fXCHlU7_-GW0JUsvWP$B(s z2@4Nra;te&brrYl41029GB#dL43SEfM$*)ab3MKr9gCLe00$2DeOtiyAZ(TVQy<^h7^!yyu)y;=kt~fA72f z3=b`t@CymYkEKv5jGb@Vv>AZmp`xlWlj-8(>p4Z7qVvGfzC&Z3X9?5Cq9-~)Wkb&& z0|x=JS;@cudlp?EtxsRV{2(9xeEZwq0fZs7eC!8n%--RZgWJwV>xf2BNAC^^fBMKbSX=3ugj`ctGVZ%(Az#doG24H?b}y0+ocNrdCmv< z2Ed|8Q@s`r9`8T-rtM9i6oM}T{N` z69lr%31?@naH9QU{^8XPoBN+Rcy!K(IU(BGnku!pcBiJ)1_Ui2;!2TJLR?XSJb3(I z&vCA!N8nuGh9Nq@!DGE&+O?zcArS8ff`HF`_KW=4pZ_r(SHHo~(6MWuU z%x6B$`gI>*#qzh#_t?RJ@0jd`dbk9aqR_h8A^Q&IJ#qZ%M&|x zuh=~Mqn;XWxKyjl{TX-J%E&&Uv=0E0o}OWP`_A&n!yh9WZDx4*#0_0|aXz7Gf^%nW z5CUBjeB&Df{QQSM%I$aD2|#aeKdxJ>Fmw3GQ@r|WQT8gJRw3TIVp-+k&hGTNxfpZX zU90MauYQP7XPTB(AJ2LfPXQkS3gvlq(_rn^4Q$@EosB!UvT^5DRUWV! zoyYT*B(t-DhDM8jdAx^YQn0c0PCoc^9|ppF^TDCwXD)*jfBGk1#`6M%fJj6Tg!6A4 z_)jZaDz&@sOFw(!#O!(C+uGVJO-nr~1iL__giyalu5TVd^Sb5S^WzV5_ahImX5$8| z+9)Eb;h6ziT&KFZjKBd;?`tFs(HuXA5I+fs6DKZ`N?qiR+aIF2<-Rb7Jbi(sNY2bc*9GU#XGtX+`P8RAhY$ka z59sRd8R2RFI!BL&nW$^mMR?@V2D-XjGHD6n%D8v1zv6-AjTJxY?9B{}`DWLNWoxy+ z67bI4!9^Ou}^}moF*a{`PkwrKGd7r=V#ENTn|E7hn84lma0H z_di%ib&bx(jWO&@K!1PX*fm1q7gw}Y{KWF+%9~fMhz?xsvaim>7lN&398#v6i8sOGufTQU{p% zKw{V@vcSt#Nd-^;@G7_6eg}>d;FR=1SIXl{U;dvA^oPp0ZQCo@xH&Aht!aX_>!LI_ zTXb|d_`ZVB5w=1I?ovv8WJOE-(d8`_9i82oX&0v0zI)kY0`)hHa7J&rV>|Es(0e)B zd4Tq-M{t91+?p;hV>(KL^slky7GPFeM3+@ycV$rF@f8B~&gNB>|JHLgJvi|RW(PMs z(E&QU)32^*skjK@F+lI@9p?Mre~N~BMJ(P-EV`W4s~+IOdCB2JJ@ob_u}n!UK64+B zlnOBev&gaIX_}j@Nma0&3Wf%KqOqBoKq8jLbI%TAni1CBR9+kI<(Hn|nSEi0*@_CC z2Oq9Q*UPV^y2hY+S%fpMjn$|{tP=3P<<0T4ojsW;$4qb8-E=F6?*e6AHa6e3jkmt{ z9XxmLhx8=7M!il5ff3Qs3_;*t+nK9JbmGh7*jIC87gP(yW6N92f9UGU&iS7G4MB8( z&hE^SmCGxhM)4R>83dA-Up`7lM?1?`)Zw@$t5&vh=bdjQVy)-7=PvWT?_TEOMVH}0 z2L;6A`ly?7GEgd1h}G7b*FN|faBRhyGZ|K`zW$O`jw8utCF!)}WP6I$Yi6blmTm}M zc_m54cG$D$-oo=&Iu7uqFMSONtMNSeP(8JEV@IyezGidvO1Prlapzs^-gO5Z9hdPu zH}`t6v9mk#<*AJ8)?1e~NsWCV8cUyVS+|_Gedt|0f9`3L&cv04bwfipHGJpV&UDSx ziMGVaTuDQqK+vEx{g&>l>8~-z&Y>GhFmo;JKiu>DEw?o6Hl+3y1P=ooJa~qK2S3M~ z_wMA!f9xkoBv;VT*uuv?_8UYZ7KaWUVBgbE@sI!TD!w1k(h_Caa-EecEtW5j(A;8O zv#QMN7j1$W3bHI)Ve;*7_f5KaMSq{ixpOX^R~!b0dleFt>Zzwe^s##N z3S3Vol}b}z-^ktfyqS0X%)8mXZ9BRi=ggTt_V4fJ;DIF1KR3+D6KOg+9EJvcvQB8C zN26L{zyIQk3D&HMQdxEVAGc|0{NM)zBvS!rPTL$g;&SkS%d4;0oH=bUIM9TlZ=nEJZy)HiIPwsr;8m3359R1t|p349+fS6*2vxci=(8QER{oIhvN+vBok z?M+ly2mJ15{}4MHuEr}@MR@aDCVsEZt6rh2%b|k@a=p|e{NM-Q&mVH6vpe(E$&Tli zUCZ901iud;bb(oEA>Dun-u)O?jSiC8sfAmGCeSS%KRXFCK5C#x4YFPNt%$g9#p?RV4M5wHc6OYFj z8XV;Kv7@w~IL`6o$GLp@Qd#)OFa-4tCUtcN-CZv4eP0VrP2;a%Q^BA7@ns@bEw|lv zI~z7^WW$D5)~&mVNM!QO9rN%!kKy4VKK$Vi@+-f(e8$RE|KQ&Tc>eiewzh5Haz_`* z;c&IAsnvPMI~%dAiTwe?!#>~qw|<;#(ekLOt|FON)+zq{z_H$6ndES^9k;c-f?^jy z!_FoW=M&V`)v^6uw{m6p@|3SnDMgS8@Esp}$U*s_M{;!11e&2isUJnbz=1C8t9i1k zA06G_vzIwC;onfE`$#;0x-SWQ=JuOc{)M!h-%yBO24YewzWuG|`S!P-XZP;SJoeaI zX=>hr9=sMfB@8q`I?;;wDkhL?MK6Q$V7cX+*;(1o)L! z`3Qz?py`5FUwN57_=Dd=pTSL1WrgBI`*Ea{Xxii_5Z@1wG9U;fK@i{v0lw#RwKEJ& zr!ziHT))E*!aaH^YHJN{+f#{Q3LHmHsy|(Ijm~3lYv9z$46nSD!1D@=-+_Zi`+qp; z!6-hG|FvO9BYw)KdU-WYtvjjpG<7+}z~LS;T~lki?V#CIjJn)vgXl>m_EWQ#U z1X4;I$H8&Rd!4`jdbncDWH_v%(jb!==IGI5tXZ=bfFP$IRZ5|9{|7;U3?xC0+~Z+j zAQWxcnVFMimwMB;?TB+zNh|4eI+%1LN+Dp&);L|AZm6RNlu~~(*>T))M}4&&@Ky-p z;WeA;NL@-&y|tD=O{89xKgFlGnedBTWcaj7+Q3k z@@3QW!?50D``c&jfD7jfp=aMz+7Bi>4m&XSLTIK$mQ|ofb)@4{-8w7L)SD~q9q+A7JwI<|hrNmkUYZ3hXwq4C%IewsL zR+D&^h&};ce6hm@z5;w@_m0NRN{OFCi1&h8lRu`bdyubv?R(^k(XwuB3wPYPgY_F) zsjF?Fw>MYDcm`MW%F1vbaQ568?%R9+b(~3|q)j3bjxjZZL^lkmsy0Xr`wR_uK&Zip_!(DZ@zrIXVUGIgCs*T3`l<2*a&0VB}f-kSnW<$lJ)tVB!+zk2ZQ`u6c7Z8OeVOd^Dpoe$Bvb3VWs%Xsf z(VE|go7JHeZPkn&oseF@rEgv!JCH@_0wZQ1JxSn{eJ%|`sjqI|y{!4z{;n^Kd7`Of z)>B!Rh&~M*INEoRuo&g{zNe z0SS)mKi)HGvpsx`T99Nq!XvW8OI3_P7soUO2d}Ref*9d%x3MA4~Wc#xWpXkTw zvvWgHpWn8-`OxwGJ&U3=^%Bvq6S>ww|10;yZQJTs2SU3KP24G@*o{zk&h&fcO?QBU z`%hobsXP#!0u?B@DKiQ2$7E4isngX}OlBDx@JA6{0f~f1ef`)bd|#i(!2`wBTq*tw zQ;j>TVi=*Ia~Nk{so7YIYx}qv4;hrdjah5av}YLu2m8o$Bmsm5U)g+j;Pggn| zzVl>%VQ&uNYX^_^esAg{DZ18WpvIM~2A(86ki|*5qexyj6N1`X8ZoQ$pQ~6E$?Cs3 z^)byomR9sxgr;a!d9lwD%dU!a%_tm%wKz24Do$_fvW^?gkSr+F3sjIgiJ2X70JnkJ^THmB0{u=~80SMtn zz>R?6;r6n%K6j0x4C2-Oaf9dJmhocl+E|QJ6J|?DUhzFeKsd# znh*HujY)o*fciKP{NHX+ymU|J$qHfidoc=DTlg(e84Sg|6)#S5VaxWCUUBUCAxnj%2n zT32`EpWnL|qd%p8UBGSm=cEMJl~W$8718*qcQy0CLq1nJvIG*=tcg-vYjEjuwlEQ0 z?QrSu^{J@|$C|MNoUAI9w&oxR43L`81pLE}-7R}c>!shdYE|sTj*fhXMz(F+uv!M< zRiL0AvMh_e_dmpNa+v)uy%;J76(n9w5p9VeeK{t{y&;GGgWUwF@NYsF=rNN>V~l81 z6stCh7Sk~*En>?Gt9o2S_yq9VlmFD_7E45*9K@|{t#3nW8Ktzdhfkfl#I<9e8gLVU zWomeyoK!N$NId#jBc`cw@Ia{bHVnZ%_tjt;T7l?&{T^%9l^2Z|8uB@HB16Ze5~rAA zZ~oVTWXoqnE+;=9`O~z#k}V(_ow_)`w$`Aww!G(EeVti02FH=~^o;+}>2(pTn`%g( zAI@vUtC0Htf9sa@e=gDP5~zD^#JZhZT9d#@ggPMtZG%G90z{%w9(?$%-2LXaP+3_8 zz*`@C8-MhBpCy$};U@!9r_xkxj*s%b`w5S}7du0JdJZa3_$e1Z<&wS_rm|XfQDQ6O zrRFfZ76qx9`p#6B!r`F$B?&#|6arw@Z19<+Zm9q9t zTi0Gu7@D-zvhYS%poizmSI@C+IW3}(g}VCUEhY?YbjFtuXcY!}T@+(k9IZ0+Xjg7) zAn|HHB4dHnwkY^gIJyEmtAN{4;&xRMar^m?eS)#pwv9Up z)VCF^81bi=Q0fnNY`rNa&@X|gK&e^{RjCk_K!wEHq=h{nF|06StLi!$ylR>#c%>nf zm*z1zSZ;zIKA0{exvm=oL3oVPycH@i5xMq4LKOG+`9!#EHb5zJMha!t)fGd0%9kj! z4xxpuj4(l10-9`uYZv$t1RI)6mdB zO-&7_Pn}}Z&09J9+9{HWa8-7DJ<_LaDz}BQ*x~j8ykvgDR2{+$?mY5h{}q6?H#N2D zn%D#4Q3a0)inR;MAwJF$(H9PO?ATGExo(rxf)-8Dh?0#08kL|KC7OT+G}a2Kwkgm} z)8yWV_t4tbN?%Ve`@Z`O1Kq>Aru5H+XH>a=OPNu;Lt_yg*Of@AW-QEBT~++*k_k!R zgPwaTktmY)bHDoqd>QaNp9;ghng~W@ViYHYytiE{CM8cTMLHunbt1*!fX|wBQ8sLd zarjV@=bkIC!KQ2nsm!wX}O69Rq;D6Kzt$F|#-?>_!Y=l)55aC3w=6w!BV z-FSzl)SuyHZbyJt&|-+~uupx1k$dmrXqGKs zP9zdR2!T=xO^5A!Z$=1>XgosC#SSi>2rDPY;>E2+I_*!2=)MpC@q+>OznaLGXXg3m zhl#~BY&8*99ULr1<%AGy z-F^$FP8?%+Xo$d;xIG@jCrit%t3Nt&p!@0Z#?s#2?h>YuAk$M=8Q=?O2m1P2b_LH9R- zZ?@gFs$O^9pB0+;>9)I8)wjRcF|VCjMq*JAy{)ay(gJ(4rfFLQw4%64A#M_=b!T9W z2Bwmr3Y*H@5-Un_rb_4?tFUNZ)j(BEoLFUqXgoqBZem7FEX$yM|3z-vwi3@wbNa%O zF~=l?ptiZ1+U9E3Ze0mN;A9iOCyUOq%AA?)IC4VKNGYEE(GWlUkMf%|GeKd9 zGq2g~-d#l^5#X1Et3LV3U&Xcyktj^d#4w8F%_NINkB=braKa}V)yLhdE2TJmB)m=` z1h>9v7wgxz^28JWf|qNi_`rh?@$rxS3V-vJzv4UJeiDGLOIKO5Wy9Df)ircOXYkr&B(4*QoCBlAqW)7q+jL)EXBZpkDIeD)~;R0r+)jh09?6znHOIQ_svz6)#$pxLl3^SK=i?` z-ZG-=nn2ey3|*iL4bu<^1bZH8k`nwXOlM_d+u5?`HFaG2YS+~BGn{L{`$~9}K zsjV%mypv8P>Fw>|%H^V3Rpmb}sUzITyA|@?IELD}rS&YR{Yr`bnh^V4%{tiL-abk` zJPsCIL%(??`p&jZx1r=ak=zGrqksk_0$r6X#EOX%LJUKvx;Bm#Gcj}x(=yRCL98-@ z88Hk0n^BYMhDwxn?I~g^BnJor$zXr7kR3JLS6qpsQLRkOlF0;ARu~gXVh4wc1X{Iv z4S)EBKP3{0@TpJzCdZG5tJ=+*x3X>9c6RQ36ED6Pl4>N$^N7TvEN@*+!?G4MUB@)S zQq+lo1gfOOl%16f4f<4783o5)G8Lwhj#Uk&r=<4!>eXutzi+;IOM&QvgM-+1h70G< zVObWg>*6^sF;l}d3=B<-`hJBF)YMk6a&;p&wJyi=1MF0mp3WhX!#0Rqxn)gow*4wY z{UQGb`uiB@@8jUBF9A?jSC4L*IN2WqBQ4rgaGW>K!_|JF*G%cOl zhAQeBDyeI%q`J0(s@gae)iE^7KuSfRLa%lp6@j9x^l~24on~FfBa_M^r9=Um5E!OT zWp!vO4)hKqO9+$bD_VV?C;8Ts{nXbPR8{L?)s-Qi)oWr@RE%vFCrUECR<2x0EEZO0 zsjMu<=khPR?Y27$L>EA$GEQ|vEmd{3R8&`DL=0k)2!<{&bRDB)66;Tw*Cc%Y*`gI; zT7pK%aZ!P?O=+J&X_`&z!mh@k%uB|2> z8M~C4X&E#&)nHlSt!WrKQJ|_SM)UHz!f`T?cz(d9w$&Vd=?v#jcahDMC#DPzPP|QS zTvo$|9m~k1Z7QOb3=gCj?oZR#GhEm*lt2gCK(zrMltM7r)sfwK^M-?lGa*509{vIx~`5Mrw|Z} zX~g4t_*0<~i|M42#ha|Tsb$PDef!%_@b!QBXD*kRp>@lfXx+ILQ`azZKSC*dFF^Vd z&kOLi9N|r!Xl(pC@SdyiT%SaN`_8z>0_=O{hdle-Gb9p;vVCzPQSPXV#$#;T-8SYq zs%zrZ)>V#L;iXgz4kWQ6CRJ6rhK#yKMAwK!Oy2zHPTu?|3=O2X`g%W|m-@N#dLQXj z@q5rTK}A)Jis~r!O;yylR8w6W#?TuYLOo1PT zQ4o7T?GXUF;?^y#mleFE6fX&-Uaob51N$z{zglj_od&mV-n>Ey`7oM#2+4y8#ufV; zhR%w$jjX(>iRP8HRMl3X89Gu)q*5pqe#rq$SjBX{kr+yoN)$^0cVFzF;(P!cHVs}Ez6s*ZI{3gFbo~T(D6JUnX_;-A<%UVD-!w%Ixlr{ z`9cT714HBHVP7wV5Y#u-vtsRXT2{57m*mohU2RONYb%IGuifAxF`U75J#0v-a!o~}ord1W0NcdntjwgNM1p_>|-p`j3Cn%xT- zQcC)|hVcEO$?dxy!@UC}2ZzZdlGrJGMuv#??&x@n+kVt%H@2_U5;lgg5{T|CzxHCZX8@UjlN?~zGmaI+3h z*2Q&QT-(KU!k>xAB!r-%Do)Fa7NQkV;*}LtR96tm?RQPfz_JWX(En^ejsIcSqiWXPni-7Ik| z2th_E@qOSK0f#J49e(-j*@@e+&J$)U-Y0h6eDhj`ze&@?%}S}8g<`W3Yz9`aXu zMonV{HT9KL*Huzc6(v>~AriANqDF2)2;Bj5Z67EFp6BB^9-iytc|N`upp?SUHELoe z<9+nL=i_@`AyqU8B)Xxa>*0^4YiOFlG>wqh5fjTaup-8cm8()JYzR>{0r&xdAK>Q% zEkXlb)6jIS@V}-BG)+U#|DO9l|M!_j5J-OTZwEMkx^v9GTTwIYO5NR)@s+}V@mKDRM^GBG&C&3zz-z8lrz2`k3>ys zo2qgXLX3)<7}0nHD;^R>*EP@uVcceRwhl@`;0Jh~k0BtYY50CHsY%E*bWF=Atk@In zOK&771({TFB~A`y7#_-y7)modkS3kX&d7Hq2q&#@@(ROtnx>&^0#nx+OuP8S&|Fez zyzfx^*>7I=8_yx;O~JFHZNvSV6i)z^0F^O|RZXGyQz;dazU(K!%dI9}5a3H$CQ6w} zL?TvhGBAn8BSb4KV(|#kxK&t1jfjD6>gYze$_h<{{)I`}57jY?xV7N)O4EYx2V^rY zS=%LRd&nTbD_KPy+vD1Hl^~t6NetPf5;mz}n{?8i(xhKs9YZQ`y#UYm@%=Cys_WsZ ztZAWsKocUgG(@#vz+=v27P8#=)^Y?5ulzrtx(^*EB3sCt@0yhECMd%l7^%r@R`uqfsit z%RnHoU7vI|Ckj&ZXolE(@c5aNvwT^zf_c~E<}%8DKyGDksE*TESAkH1AdqCUzFG#8I1I17=4&N&@_8w|Kd*b@8X#OzoLZ+cr4*hk=^QMGeq5!=2adF#f9|?YJkMAVL-Kmh|m$G=TvoNPAS8{)U}*fJ(q-{X&94?)6WGw-^X^wuOB}i z!tWsbejLwdC|#xk{K(;xXa9P}202eyFhmEqWlQUC2>5*dabsnSSY&EN3WN|?5u>mg zC>3heC$q|CJ)ho0hPL%9sEkcvl9>feW}*njnk1w|Ni{BMO+8#Kb!}mjb~=z!k+MfC z2c=S|KoutSP{ItTP+TN)DQr@~VA?4>7J@GxI&pSE*K40F78KC|c5Z3?BJfKPdPkdU zDln%JgVl03uImL%rO(jS!4%aMQ8ukv&}F(OMAr2ttzx^;kVt1C7yFQ2*m*|EYfth@ zLDF$?@{UEtk(AFJXV0FUSmeJ*u;8Zf+Ll$n3gS5kXX5^(UCbGt0%Xp?Hq~ZgG0R{u znISt36L7&`kx7VW0#ZuOcJz@+IoRp&$8o($ksQK=DW@1ca5NQs;6@=iEI^{~+qch` zo_Y_^3*i?qn3=oepLlMoaJ6rE*5dTDjW;0A>F5~_7X&d`B|{P6YF?b!g%F=Sc>2Ql zlG(;!SjbsocZDm4sStV!D=bH`ufi=Z>$HwTL2tCpdw;TDrSDY2$Ul0`NT~N zLlgLJP$<i6!?KGnAWoiO$gFCQ?5E5 zrdLX-@Vo%m4RRS=xe%BdU5H{nVLKjD$r&Aw0-zY9IO!R>hU0h`Q%n&Z38@sG z7itk?ppZd+LJ2FwDiuyFz8}hJvsn)>mmm~=2cd$}n1;hv0SVhJ;CT|6t4r?Z$~L)fn4T&FNq!4B z84_F%28Pq85pf(elAYz%gu7{s1M5*#(6FkLC(g_|uTA7Cv|1$DgLm z*LDM(qA%m{;ge^7nH$)TxgfpnBk?!{fs(%n_yDO=VZ$uJGIexKkS>|^X98hS2Z`tU zWYP{!)|=7W%k_Nx8L0i{x)Qe}(xK}DD-x~?B3A|1^L#vaD&IqKVv|yq=6FvTSdlmR1BwWraMDs zy`WSh@yy|qXP%nYi53wS4bcGt!~Ja(JrI^^%6PL|J3p3-%ckww6-X(murpzv_w|Z& zf}GZU@^2n?WN{rIJ69ah9b;k(JFGgnT=ePfi$e#RKdNlp`Mf79GE)5F7r}K}8)7e>7fkg}xAw-#KYBu5fL6|%4c+=0T4pcE*G!B#uQ!%qy zk5np)opH*14&$CXx7WVb`6qhcyrXWq$YedTo`*HXn0X*2w&RlZ-9pj|O1%0;Sj}O9 zhu6k}7O(m1AT#`{z$RZR(vE{J1cC1p0EWmHBn+DrT#vv;2#A>m8P~%L zRtCBNu_(OmrRePJl*^jyyMcEB_yK4t2v-@UkSg4xdV!DY`Dj8LRf%Lu5MaALG0P-6 z1D@<_LlFdF^NPHOI*iF*`^HvE(a}3ZEMig>FLq&Z9lub-V=?RC6B&oJ<5Cr|3I#4E zh9aHG;s#;vf5b4z zMGnuG45l+-r-BZRIcD@v*b3>3^ zVLJ{3$rMU~h9qrgC*>z7b^7T-kScx_ZeXde%+7chCKfBvX+3%FaRlcf+?Nj7S<-&E zx{pVADJ4leQ|47xQjtt&7*3`cPNhkvZPJ-6S;s9*3Q@}>>-uwI_R2tFXI<>fMBPIa zzAv$DmvqX;9pSuFGF-{0(qC*LA_yd@w2k9>WOEgQv|K}ui9GiT$a)^Wl4!XSV~#A| z69T?*^ys;saZhjqV$to<^Ed&jxvAl00ULpJ5Qc!VIdd&$S%4aooMDjxFPEs|m&Kh` zZlCW50j}ra`97Ku*q%>yEHdSSh0{SksbexwmlNh>2)L3+W)-t%BPujM_ zq?bV9_!3Rz`fLzR+MXBsVRTI|YcXZpVT)_aw8#dK^<|mGrWC*4-8XPVMiAbY5VfqZt-=_*31qQe*mzJXtpBYPL@bl&EGN`l4}w6_ zmq?=vLDd8;k>?XqDYC9dCTrumE`gM2qUdatQj*DLaZ0SNtRE04Ff~<{CZKXZq2txV z^*sE*$22V*Uts&AL_O^&^~ocr&ixy25GPz73nRC3hH&f6t#4LgoPBTU^SUOeidrb? zPg{`UNy5Hq@hFC_1)^o?4bPY{MDM>K0IVFlAJ3yeYw28mFh-H#-!?N5Xa9jyK zd*sB~uk!|Sz?I^LB6=RTw5`8KNbNU(A1{4g*927&6QzPF6J7zn6x2?#1ho(lk4A}D z#pBEN(SYN6IF55o$5PnHz$6}xOgMQc1t&YYu?(G+_04oKUdI+9WBIZ7pO0^o;>%Di=`RjY~h9^ zdLFml-1=sv@jIxnN=+Vl(>7e;CqKalN>DwIWuS!+#G(~ z6iY-0N>18%jYX`o32Q3II?i>4Cev<7{jEmv`j!wNO*xD9-ZID4kMunfykNH znx@e)kU$_<)lfw$lbw_HP!ZF_vdpmDQxFgYGZTsolp>M!(FGVeqFaVRHV7jpCGeC| zUp8FzsRQTF4`2T~-*|XK5j~G<5?+n(jgMK@lpJJpjowri0o28;(lSYl5}uT#oB&HG z3{68bbW+Z!`1!YVonJk0{OlVlTsBoK+&gv-uw(0{dvz&4tpxX%KCg?MmtKuF=_95w zC$aSDqCf2rNJ&j}{3`TZNIlgeykiRdNRdGm%n2=SYY zH0gz)GHQnLE2XB~_;D^VY`ZwVq$av>C!>jA=sLbqq#X};LY%ruFZI)Cf)`5nJw$r3#IP>)uv!O zLTv}p$|SP_g$M;8am&Qg1-hmoP`NPD^d^8XH{Ydlnw>=j{qUcqKPM}xQX?QemQGSkPM5DjqQ@ptR8kPG(g+de=F2dg(|#POSCFMn^f!)f~_dA13~j-&!OvrsA+~R zg7q+!RjJYa%hHa|$ZE(!h@7HN5J-g+NV49P(sq-;YYI*X!~vxR2Yh0Omx#PLutfBE z#;&&YYorowN@?3cZ3ngy?*At(s*e~t5z8c^YZ!XCe^yE$QMjJM@u##(E8x699Z^ag zMW`b|pdUT<+G`hB3T-V~ED?PHV(;F)M*r2TYlJ4-gkUSsCSVt^nVGE$P!f zg3J(1JS`xAj}p+pIez8JyHCq5mF?$s-I6x8 For people who want to spend time making Phaser 3 games in TypeScript instead of configuring build tools. - -## Author - -This template is a fork of the [Ourcade's TypeScript + Parcel Template for Phaser 3](https://github.com/ourcade/phaser3-typescript-parcel-template). We, the Phaser Editor 2D team, added a couple of files and configurations focused on the Phaser Editor 2D tools. - -## Prerequisites - -You'll need [Node.js](https://nodejs.org/en/), [npm](https://www.npmjs.com/), and [Parcel](https://parceljs.org/) installed. - -It is highly recommended to use [Node Version Manager](https://github.com/nvm-sh/nvm) (nvm) to install Node.js and npm. - -For Windows users there is [Node Version Manager for Windows](https://github.com/coreybutler/nvm-windows). - -Install Node.js and `npm` with `nvm`: - -```bash -nvm install node - -nvm use node -``` - -Replace 'node' with 'latest' for `nvm-windows`. - -Then install Parcel: - -```bash -npm install -g parcel-bundler -``` - -## Getting Started - -Go into your new project folder and install dependencies: - -```bash -npm install -``` - -Start development server: - -``` -npm run start -``` - -To create a production build: - -``` -npm run build -``` - -Production files will be placed in the `dist` folder. Then upload those files to a web server. 🎉 - -## TypeScript ESLint - -This template uses a basic `typescript-eslint` set up for code linting. - -It does not aim to be opinionated. - -## Dev Server Port - -You can change the dev server's port number by modifying the `start` script in `package.json`. We use Parcel's `-p` option to specify the port number. - -The script looks like this: - -``` -parcel src/index.html -p 8000 -``` - -Change 8000 to whatever you want. - -## Other Notes - -[parcel-plugin-clean-easy](https://github.com/lifuzhao100/parcel-plugin-clean-easy) is used to ensure only the latest files are in the `dist` folder. You can modify this behavior by changing `parcelCleanPaths` in `package.json`. - -[parcel-plugin-static-files](https://github.com/elwin013/parcel-plugin-static-files-copy#readme) is used to copy static files from `public` into the output directory and serve it. You can add additional paths by modifying `staticFiles` in `package.json`. - -## Phaser Editor 2D notes - -We did minor changes to this repo for making it more friendly with Phaser Editor 2D. - -### Excluding files from the project - -There are a lot of files present in the project that are not relevant to Phaser Editor 2D. For example, the whole `node_modules` folder should be excluded from the editor's project. - -The `/.skip` file lists the folders and files to exclude from the editor's project. - -[Learn more about resource filtering in Phaser Editor 2D](https://help.phasereditor2d.com/v3/misc/resources-filtering.html) - -### Setting the root folder for the game's assets - -The `/public` folder contains the assets (images, audio, atlases) used by the game. Parcel copies it to the distribution folder and makes it available as a root path. For example, `http://127.0.0.1:8000/assets` points to the `/public/assets` folder. - -By default, Phaser Editor 2D uses the project's root as the start path for the assets. You can change it by creating an empty `publicroot` file. That is the case of the `/public/publicroot` file, which allows adding files to the Asset Pack file (`/static/assets/asset-pack.json`) using correct URLs. - -### Coding - -The `/src` folder contains all the JavaScript code, including the scene and user component files, in addition to the Phaser Editor 2D compilers output. - -We recommend using Visual Studio Code for editing the code files. - -In many tutorials about Phaser Editor 2D, the JavaScript files are loaded using the Asset Pack editor. When using Parcel this is not needed. Just use the Asset Pack editor for loading the art assets. - -### Scene and User Components configuration - -The Scenes and User Components are configured to compile to TypeScript ES modules. Also, the compilers auto-import the classes used in the generated code. - -## License - -[MIT License](https://github.com/ourcade/phaser3-typescript-parcel-template/blob/master/LICENSE) diff --git a/source/templates/providers/Parcel/TypeScript/files/src/comps/Behaviors.components b/source/templates/providers/Parcel/TypeScript/files/src/comps/Behaviors.components deleted file mode 100755 index 4396b6c7f..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/src/comps/Behaviors.components +++ /dev/null @@ -1,18 +0,0 @@ -{ - "components": [ - { - "name": "PushOnClick", - "baseClass": "UserComponent", - "gameObjectType": "Phaser.GameObjects.Image", - "properties": [] - } - ], - "meta": { - "app": "Phaser Editor 2D - Object Script Editor", - "url": "https://phasereditor2d.com", - "contentType": "phasereditor2d.core.scene.SceneContentType" - }, - "outputLang": "TYPE_SCRIPT", - "exportClass": true, - "autoImport": true -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/TypeScript/files/src/comps/PushOnClick.ts b/source/templates/providers/Parcel/TypeScript/files/src/comps/PushOnClick.ts deleted file mode 100755 index c1a98fa6e..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/src/comps/PushOnClick.ts +++ /dev/null @@ -1,49 +0,0 @@ - -// You can write more code here - -/* START OF COMPILED CODE */ - -import UserComponent from "./UserComponent"; -import Phaser from "phaser"; - -export default class PushOnClick extends UserComponent { - - constructor(gameObject: Phaser.GameObjects.Image) { - super(gameObject); - - this.gameObject = gameObject; - (gameObject as any)["__PushOnClick"] = this; - - /* START-USER-CTR-CODE */ - // Write your code here. - /* END-USER-CTR-CODE */ - } - - static getComponent(gameObject: Phaser.GameObjects.Image): PushOnClick { - return (gameObject as any)["__PushOnClick"]; - } - - private gameObject: Phaser.GameObjects.Image; - - /* START-USER-CODE */ - - awake() { - - this.gameObject.setInteractive().on("pointerdown", () => { - - this.scene.add.tween({ - targets: this.gameObject, - scaleX: "*=0.8", - scaleY: "*=0.8", - duration: 80, - yoyo: true, - }); - }); - } - - /* END-USER-CODE */ -} - -/* END OF COMPILED CODE */ - -// You can write more code here diff --git a/source/templates/providers/Parcel/TypeScript/files/src/comps/UserComponent.ts b/source/templates/providers/Parcel/TypeScript/files/src/comps/UserComponent.ts deleted file mode 100755 index fbd98e6c0..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/src/comps/UserComponent.ts +++ /dev/null @@ -1,64 +0,0 @@ -import Phaser from "phaser"; - -export default class UserComponent { - - /** - * @param gameObject The entity. - */ - constructor(gameObject: Phaser.GameObjects.GameObject) { - - this.scene = gameObject.scene; - - const listenAwake = this.awake !== UserComponent.prototype.awake; - const listenStart = this.start !== UserComponent.prototype.start; - const listenUpdate = this.update !== UserComponent.prototype.update; - const listenDestroy = this.destroy !== UserComponent.prototype.destroy; - - if (listenAwake) { - - gameObject.once("components-awake", this.awake, this); - } - - if (listenStart) { - - this.scene.events.once(Phaser.Scenes.Events.UPDATE, this.start, this); - } - - if (listenUpdate) { - - this.scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); - } - - if (listenStart || listenUpdate || listenDestroy) { - - gameObject.on(Phaser.GameObjects.Events.DESTROY, () => { - - this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.start, this); - this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); - - if (listenDestroy) { - - this.destroy(); - } - }); - } - } - - scene: Phaser.Scene; - - protected awake() { - // override this - } - - protected start() { - // override this - } - - protected update() { - // override this - } - - protected destroy() { - // override this - } -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/TypeScript/files/src/index.html b/source/templates/providers/Parcel/TypeScript/files/src/index.html deleted file mode 100644 index 6b603a342..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/src/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - Phaser3 + Parceljs Template - - - - - - diff --git a/source/templates/providers/Parcel/TypeScript/files/src/main.ts b/source/templates/providers/Parcel/TypeScript/files/src/main.ts deleted file mode 100644 index 1364596c6..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/src/main.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Phaser from 'phaser' -import Level from './scenes/Level'; - -class Boot extends Phaser.Scene { - - preload() { - - this.load.pack("asset-pack", "assets/asset-pack.json"); - } - - create() { - - this.scene.start("Level"); - } -} - -const game = new Phaser.Game({ - type: Phaser.AUTO, - width: 800, - height: 600, - backgroundColor: "#424242", - scale: { - mode: Phaser.Scale.ScaleModes.FIT, - autoCenter: Phaser.Scale.CENTER_BOTH - }, - scene: [Boot, Level] -}); - -game.scene.start("Boot"); diff --git a/source/templates/providers/Parcel/TypeScript/files/src/scenes/Level.scene b/source/templates/providers/Parcel/TypeScript/files/src/scenes/Level.scene deleted file mode 100755 index 6a2e1338f..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/src/scenes/Level.scene +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "e19341b4-c358-4128-bfcb-b0eb9e6f069d", - "sceneType": "SCENE", - "settings": { - "exportClass": true, - "autoImport": true, - "preloadPackFiles": [], - "createMethodName": "editorCreate", - "sceneKey": "Level", - "compilerOutputLanguage": "TYPE_SCRIPT" - }, - "displayList": [ - { - "type": "Image", - "id": "4c2e5ef7-c405-441a-b940-7937611902ab", - "label": "dino", - "components": [ - "PushOnClick" - ], - "texture": { - "key": "dino" - }, - "x": 400, - "y": 225 - }, - { - "type": "Text", - "id": "4d9977b2-32a3-45b2-a393-7e92a6a6ea24", - "label": "text", - "components": [], - "x": 400, - "y": 410, - "text": "Phaser 3 + Phaser Editor 2D + TypeScript + Parcel", - "fontFamily": "arial", - "fontSize": "3em" - }, - { - "type": "Text", - "id": "975bcdd3-f1db-48a8-a8f4-02abbb1eb02f", - "label": "text_1", - "components": [], - "x": 400, - "y": 496, - "text": "(a fork of the Ourcade.co templates)", - "fontFamily": "arial", - "fontSize": "2em" - } - ], - "plainObjects": [], - "meta": { - "app": "Phaser Editor 2D - Scene Editor", - "url": "https://phasereditor2d.com", - "contentType": "phasereditor2d.core.scene.SceneContentType" - } -} \ No newline at end of file diff --git a/source/templates/providers/Parcel/TypeScript/files/src/scenes/Level.ts b/source/templates/providers/Parcel/TypeScript/files/src/scenes/Level.ts deleted file mode 100755 index 39ca1fe02..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/src/scenes/Level.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* START OF COMPILED CODE */ - -import Phaser from "phaser"; -import PushOnClick from "../comps/PushOnClick"; - -export default class Level extends Phaser.Scene { - - constructor() { - super("Level"); - - /* START-USER-CTR-CODE */ - // Write your code here. - /* END-USER-CTR-CODE */ - } - - editorCreate() { - - // dino - const dino = this.add.image(400, 225, "dino"); - - // text - const text = this.add.text(400, 410, "", {}); - text.setOrigin(0.5, 0.5); - text.text = "Phaser 3 + Phaser Editor 2D + TypeScript + Parcel"; - text.setStyle({"fontFamily":"arial","fontSize":"3em"}); - - // text_1 - const text_1 = this.add.text(400, 496, "", {}); - text_1.setOrigin(0.5, 0.5); - text_1.text = "(a fork of the Ourcade.co templates)"; - text_1.setStyle({"fontFamily":"arial","fontSize":"2em"}); - - // dino (components) - new PushOnClick(dino); - dino.emit("components-awake"); - } - - /* START-USER-CODE */ - - // Write more code here - - create() { - - this.editorCreate(); - } - - /* END-USER-CODE */ -} - -/* END OF COMPILED CODE */ - -// You can write more code here diff --git a/source/templates/providers/Parcel/TypeScript/files/tsconfig.json b/source/templates/providers/Parcel/TypeScript/files/tsconfig.json deleted file mode 100644 index 7b1f2b71a..000000000 --- a/source/templates/providers/Parcel/TypeScript/files/tsconfig.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "compilerOptions": { - "target": "es2016", - "module": "es6", - "strict": true, - "noImplicitAny": false, - "noEmit": true, - "jsx": "preserve", - "importHelpers": true, - "moduleResolution": "node", - "experimentalDecorators": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "sourceMap": true, - "baseUrl": "./src", - "paths": { - "~/*": ["./*"] - }, - "typeRoots": [ - "node_modules/@types", - "node_module/phaser/types" - ], - "types": [ - "phaser" - ] - }, - "include": [ - "src/**/*" - ] -} diff --git a/source/templates/providers/Parcel/TypeScript/template.json b/source/templates/providers/Parcel/TypeScript/template.json deleted file mode 100644 index af831286f..000000000 --- a/source/templates/providers/Parcel/TypeScript/template.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "openFiles": [ - "src/scenes/Level.scene", - "readme.md" - ], - "skipLibs": true -} \ No newline at end of file From 690d4e8105245e4c6791c6087d9876a1b21803ec Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Mon, 9 Aug 2021 23:58:08 -0400 Subject: [PATCH 076/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index c17728a6b..9898fe25c 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -10,6 +10,7 @@ * Scene Editor: replaces the Container section by the Children section, and applies for Layer objects too. * Scene Editor: new Show Children In Outline parameter in the Children section. * Scene Editor (BitmapText): fixes error when the font data isn't available in the cache. +* Removes Parcel templates. ## v3.16.0-alpha.1 From 57d3b4b8f8f7d0c0bdddd2e38cfa3f4b65d7993c Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 00:40:46 -0400 Subject: [PATCH 077/108] Update webpack templates. --- .../files/assets/components/UserComponent.js | 2 +- .../JavaScript/files/assets/scenes/Level.js | 3 +- .../files/components/UserComponent.ts | 2 +- .../providers/Basic/TypeScript/files/game.js | 124 ++++++++++++++++++ .../Basic/TypeScript/files/scenes/Level.ts | 3 +- .../files/src/components/UserComponent.js | 2 +- .../JavaScript/files/src/scenes/Level.js | 3 +- .../files/src/components/UserComponent.ts | 2 +- .../TypeScript/files/src/scenes/Level.ts | 3 +- 9 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 source/templates/providers/Basic/TypeScript/files/game.js diff --git a/source/templates/providers/Basic/JavaScript/files/assets/components/UserComponent.js b/source/templates/providers/Basic/JavaScript/files/assets/components/UserComponent.js index 784945633..25f7dad7b 100755 --- a/source/templates/providers/Basic/JavaScript/files/assets/components/UserComponent.js +++ b/source/templates/providers/Basic/JavaScript/files/assets/components/UserComponent.js @@ -14,7 +14,7 @@ class UserComponent { if (listenAwake) { - gameObject.once("components-awake", this.awake, this); + this.scene.events.once("scene-awake", this.awake, this); } if (listenStart) { diff --git a/source/templates/providers/Basic/JavaScript/files/assets/scenes/Level.js b/source/templates/providers/Basic/JavaScript/files/assets/scenes/Level.js index 0d4339760..0f96315fb 100755 --- a/source/templates/providers/Basic/JavaScript/files/assets/scenes/Level.js +++ b/source/templates/providers/Basic/JavaScript/files/assets/scenes/Level.js @@ -26,7 +26,8 @@ class Level extends Phaser.Scene { // dino (components) new PushOnClick(dino); - dino.emit("components-awake"); + + this.events.emit("scene-awake"); } /* START-USER-CODE */ diff --git a/source/templates/providers/Basic/TypeScript/files/components/UserComponent.ts b/source/templates/providers/Basic/TypeScript/files/components/UserComponent.ts index f6753c63c..98bda5ac3 100755 --- a/source/templates/providers/Basic/TypeScript/files/components/UserComponent.ts +++ b/source/templates/providers/Basic/TypeScript/files/components/UserComponent.ts @@ -14,7 +14,7 @@ class UserComponent { if (listenAwake) { - gameObject.once("components-awake", this.awake, this); + this.scene.events.once("scene-awake", this.awake, this); } if (listenStart) { diff --git a/source/templates/providers/Basic/TypeScript/files/game.js b/source/templates/providers/Basic/TypeScript/files/game.js new file mode 100644 index 000000000..bffe72cf8 --- /dev/null +++ b/source/templates/providers/Basic/TypeScript/files/game.js @@ -0,0 +1,124 @@ +"use strict"; +window.addEventListener('load', function () { + var game = new Phaser.Game({ + width: 800, + height: 600, + type: Phaser.AUTO, + backgroundColor: "#242424", + scale: { + mode: Phaser.Scale.FIT, + autoCenter: Phaser.Scale.CENTER_BOTH + } + }); + game.scene.add("Level", Level); + game.scene.add("Boot", Boot, true); +}); +class Boot extends Phaser.Scene { + preload() { + this.load.pack("pack", "assets/asset-pack.json"); + } + create() { + this.scene.start("Level"); + } +} +class UserComponent { + /** + * @param gameObject The entity. + */ + constructor(gameObject) { + this.scene = gameObject.scene; + const listenAwake = this.awake !== UserComponent.prototype.awake; + const listenStart = this.start !== UserComponent.prototype.start; + const listenUpdate = this.update !== UserComponent.prototype.update; + const listenDestroy = this.destroy !== UserComponent.prototype.destroy; + if (listenAwake) { + this.scene.events.once("scene-awake", this.awake, this); + } + if (listenStart) { + this.scene.events.once(Phaser.Scenes.Events.UPDATE, this.start, this); + } + if (listenUpdate) { + this.scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); + } + if (listenStart || listenUpdate || listenDestroy) { + gameObject.on(Phaser.GameObjects.Events.DESTROY, () => { + this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.start, this); + this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); + if (listenDestroy) { + this.destroy(); + } + }); + } + } + awake() { + // override this + } + start() { + // override this + } + update() { + // override this + } + destroy() { + // override this + } +} +/// +// You can write more code here +/* START OF COMPILED CODE */ +class PushOnClick extends UserComponent { + constructor(gameObject) { + super(gameObject); + this.gameObject = gameObject; + gameObject["__PushOnClick"] = this; + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + static getComponent(gameObject) { + return gameObject["__PushOnClick"]; + } + /* START-USER-CODE */ + awake() { + this.gameObject.setInteractive().on("pointerdown", () => { + this.scene.add.tween({ + targets: this.gameObject, + scaleX: 0.8, + scaleY: 0.8, + duration: 80, + yoyo: true + }); + }); + } +} +/* END OF COMPILED CODE */ +// You can write more code here +// You can write more code here +/* START OF COMPILED CODE */ +class Level extends Phaser.Scene { + constructor() { + super("Level"); + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + editorCreate() { + // dino + const dino = this.add.image(400, 245.50984430371858, "dino"); + // text_1 + const text_1 = this.add.text(400, 406, "", {}); + text_1.setOrigin(0.5, 0); + text_1.text = "Phaser 3 + Phaser Editor 2D + TypeScript"; + text_1.setStyle({ "fontFamily": "arial", "fontSize": "3em" }); + // dino (components) + new PushOnClick(dino); + this.events.emit("scene-awake"); + } + /* START-USER-CODE */ + // Write your code here. + create() { + this.editorCreate(); + } +} +/* END OF COMPILED CODE */ +// You can write more code here diff --git a/source/templates/providers/Basic/TypeScript/files/scenes/Level.ts b/source/templates/providers/Basic/TypeScript/files/scenes/Level.ts index ffbf937ca..d49f2d88b 100755 --- a/source/templates/providers/Basic/TypeScript/files/scenes/Level.ts +++ b/source/templates/providers/Basic/TypeScript/files/scenes/Level.ts @@ -26,7 +26,8 @@ class Level extends Phaser.Scene { // dino (components) new PushOnClick(dino); - dino.emit("components-awake"); + + this.events.emit("scene-awake"); } /* START-USER-CODE */ diff --git a/source/templates/providers/Webpack/JavaScript/files/src/components/UserComponent.js b/source/templates/providers/Webpack/JavaScript/files/src/components/UserComponent.js index d164fbc9b..8c1371e89 100755 --- a/source/templates/providers/Webpack/JavaScript/files/src/components/UserComponent.js +++ b/source/templates/providers/Webpack/JavaScript/files/src/components/UserComponent.js @@ -16,7 +16,7 @@ export default class UserComponent { if (listenAwake) { - gameObject.once("components-awake", this.awake, this); + this.scene.events.once("scene-awake", this.awake, this); } if (listenStart) { diff --git a/source/templates/providers/Webpack/JavaScript/files/src/scenes/Level.js b/source/templates/providers/Webpack/JavaScript/files/src/scenes/Level.js index fd907ac1f..8f09053fb 100755 --- a/source/templates/providers/Webpack/JavaScript/files/src/scenes/Level.js +++ b/source/templates/providers/Webpack/JavaScript/files/src/scenes/Level.js @@ -29,7 +29,8 @@ export default class Level extends Phaser.Scene { // fufuSuperDino (components) new PushOnClick(fufuSuperDino); - fufuSuperDino.emit("components-awake"); + + this.events.emit("scene-awake"); } /* START-USER-CODE */ diff --git a/source/templates/providers/Webpack/TypeScript/files/src/components/UserComponent.ts b/source/templates/providers/Webpack/TypeScript/files/src/components/UserComponent.ts index fbd98e6c0..d23cd9b70 100755 --- a/source/templates/providers/Webpack/TypeScript/files/src/components/UserComponent.ts +++ b/source/templates/providers/Webpack/TypeScript/files/src/components/UserComponent.ts @@ -16,7 +16,7 @@ export default class UserComponent { if (listenAwake) { - gameObject.once("components-awake", this.awake, this); + this.scene.events.once("scene-awake", this.awake, this); } if (listenStart) { diff --git a/source/templates/providers/Webpack/TypeScript/files/src/scenes/Level.ts b/source/templates/providers/Webpack/TypeScript/files/src/scenes/Level.ts index c849ebbce..b8319f759 100755 --- a/source/templates/providers/Webpack/TypeScript/files/src/scenes/Level.ts +++ b/source/templates/providers/Webpack/TypeScript/files/src/scenes/Level.ts @@ -29,7 +29,8 @@ export default class Level extends Phaser.Scene { // fufuSuperDino (components) new PushOnClick(fufuSuperDino); - fufuSuperDino.emit("components-awake"); + + this.events.emit("scene-awake"); } /* START-USER-CODE */ From 93066b67e1ef0c4fd790991a1a267c3e05b5fb93 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 15:16:46 -0400 Subject: [PATCH 078/108] Nested prefab: checks cannot create a layer or container with a nested prefab. --- .../src/ui/editor/commands/SceneEditorCommands.ts | 12 ++++++++++++ .../src/ui/sceneobjects/GameObjectEditorSupport.ts | 5 ----- .../object/properties/MoveToParentOperation.ts | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index ede769007..f4012b24c 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -681,6 +681,13 @@ namespace phasereditor2d.scene.ui.editor.commands { for (const obj of editor.getSelectedGameObjects()) { + const editorSupport = obj.getEditorSupport(); + + if (editorSupport.isNestedPrefabInstance()) { + + return false; + } + if (obj instanceof sceneobjects.Layer) { return false; @@ -717,6 +724,11 @@ namespace phasereditor2d.scene.ui.editor.commands { for (const obj of editor.getSelectedGameObjects()) { + if (obj.getEditorSupport().isNestedPrefabInstance()) { + + return false; + } + if (obj instanceof sceneobjects.Layer) { return false; diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index e733cd9be..d87a22ff6 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -519,11 +519,6 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this.getScene().isPrefabSceneType() && this.getScene().getPrefabObject() === this.getObject(); } - isPrefabInstanceElement() { - - return this.isPrefabInstance() && this.getOwnerPrefabInstance() !== this.getObject(); - } - getNestedActivePrefabInstances(): ISceneGameObject[] { if (this.isPrefabInstance()) { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/MoveToParentOperation.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/MoveToParentOperation.ts index c33ea69da..b7cd31ee2 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/MoveToParentOperation.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/MoveToParentOperation.ts @@ -30,7 +30,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { return false; } - if (targetParent.getEditorSupport().isPrefabInstance() || targetParent.getEditorSupport().isPrefabInstanceElement()) { + if (targetParent.getEditorSupport().isPrefabInstance() || targetParent.getEditorSupport().isNestedPrefabInstance()) { return false; } From 0019b6c4c9a457c01bf5401b1318decc20b2d7cd Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 15:20:51 -0400 Subject: [PATCH 079/108] Nested prefab: disables Break Parent command if a prefab instance is selected. --- .../ui/editor/commands/SceneEditorCommands.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index f4012b24c..4e074b98a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -73,17 +73,6 @@ namespace phasereditor2d.scene.ui.editor.commands { .length === args.activeEditor.getSelection().length; } - function isOnlyContainerOrLayerSelected(args: colibri.ui.ide.commands.HandlerArgs) { - - return isSceneScope(args) && editorHasSelection(args) - - && (args.activeEditor as SceneEditor).getSelectedGameObjects() - - .filter(obj => obj instanceof sceneobjects.Container || obj instanceof sceneobjects.Layer) - - .length === args.activeEditor.getSelection().length; - } - function editorHasSelection(args: colibri.ui.ide.commands.HandlerArgs) { return args.activeEditor && args.activeEditor.getSelection().length > 0; @@ -782,7 +771,18 @@ namespace phasereditor2d.scene.ui.editor.commands { category: CAT_SCENE_EDITOR }, handler: { - testFunc: isOnlyContainerOrLayerSelected, + testFunc: args => { + + return isSceneScope(args) && editorHasSelection(args) + + && (args.activeEditor as SceneEditor).getSelectedGameObjects() + + .filter(obj => obj instanceof sceneobjects.Container || obj instanceof sceneobjects.Layer) + + .filter(obj => !obj.getEditorSupport().isPrefabInstance()) + + .length === args.activeEditor.getSelection().length; + }, executeFunc: args => args.activeEditor.getUndoManager().add( new ui.sceneobjects.BreakParentOperation(args.activeEditor as SceneEditor) From a560ac54facc6a56f632f1b5524cbeb0f58a643c Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 15:23:27 -0400 Subject: [PATCH 080/108] Nested prefabs: disables moving a nested prefab instance to a different parent. --- .../src/ui/editor/commands/SceneEditorCommands.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index 4e074b98a..31cff6318 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -886,6 +886,12 @@ namespace phasereditor2d.scene.ui.editor.commands { if (sceneobjects.isGameObject(obj)) { + if ((obj as sceneobjects.ISceneGameObject) + .getEditorSupport().isNestedPrefabInstance()) { + + return false; + } + if (obj instanceof sceneobjects.Layer) { return false; From 6ae95c630638869af203e34c471b2672e83d2edf Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 15:28:20 -0400 Subject: [PATCH 081/108] Nested refabs: Select Children command doesn't select nested prefabs. --- .../src/ui/editor/commands/SceneEditorCommands.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index 31cff6318..402a935a1 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -858,6 +858,9 @@ namespace phasereditor2d.scene.ui.editor.commands { .flatMap(obj => sceneobjects.GameObjectEditorSupport.getObjectChildren(obj)) + .filter(obj => !obj.getEditorSupport().isPrefabInstance() || + obj.getEditorSupport().isMutableNestedPrefabInstance()) + editor.setSelection(sel); } }, From 61f20ffb0588450b3fadc72ec49c09a696471666 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 15:47:32 -0400 Subject: [PATCH 082/108] Set version to 3.20.0-alpha.1. --- source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts b/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts index 489c10654..a0f5a9ef5 100644 --- a/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts +++ b/source/editor/plugins/phasereditor2d.ide/src/IDEPlugin.ts @@ -308,7 +308,7 @@ namespace phasereditor2d.ide { /* program entry point */ - export const VER = "3.16.0-alpha.1"; + export const VER = "3.20.0-alpha.1"; async function main() { From c09243559808e9b852a442aef497fa495aa72acb Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 15:55:13 -0400 Subject: [PATCH 083/108] Update changelog. --- CHANGELOG.MD | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 9898fe25c..8d95b2845 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,18 +1,28 @@ # Change Log -## dev +## Pre-release v3.20.0-alpha.1 - Aug 10, 2021 + +### Added * Nested prefabs: * Uses nullish operator (`??`) in prefab constructors. * Allows unlock the position of prefab instances. This change introduces a new scene format that is not compatible with previous versions of the editor. * Good bye `prefab-awake` & `components-awake` events. Welcome `scene-awake`. * Updates `UserComponent.js` templates. -* Scene Editor: replaces the Container section by the Children section, and applies for Layer objects too. * Scene Editor: new Show Children In Outline parameter in the Children section. + +### Updated +* Scene Editor: replaces the Container section by the Children section, and applies for Layer objects too. + +### Fixed + * Scene Editor (BitmapText): fixes error when the font data isn't available in the cache. + +### Removed + * Removes Parcel templates. -## v3.16.0-alpha.1 +## Pre-release v3.16.0-alpha.1 ### Added From 9d7f525ef27dc6f9bc8bfde85d2d55d9f1a7c6af Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 16:06:07 -0400 Subject: [PATCH 084/108] Nested prefab: fixes select children command. --- .../ui/editor/commands/SceneEditorCommands.ts | 18 ++++++++++++++++-- .../ui/sceneobjects/GameObjectEditorSupport.ts | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts index 402a935a1..6996b870d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/commands/SceneEditorCommands.ts @@ -858,8 +858,22 @@ namespace phasereditor2d.scene.ui.editor.commands { .flatMap(obj => sceneobjects.GameObjectEditorSupport.getObjectChildren(obj)) - .filter(obj => !obj.getEditorSupport().isPrefabInstance() || - obj.getEditorSupport().isMutableNestedPrefabInstance()) + .filter(obj => { + + const editorSupport = obj.getEditorSupport(); + + if (editorSupport.isMutableNestedPrefabInstance()) { + + return true; + } + + if (editorSupport.isPrefabInstanceElement()) { + + return false; + } + + return true; + }) editor.setSelection(sel); } diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts index d87a22ff6..765c56b4a 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/GameObjectEditorSupport.ts @@ -469,6 +469,23 @@ namespace phasereditor2d.scene.ui.sceneobjects { return this._prefabId !== undefined && this._prefabId !== null; } + /** + * Checks if the object is a child or nested child of prefab instance. + * + * @returns If it is element. + */ + isPrefabInstanceElement() { + + const owner = this.getOwnerPrefabInstance(); + + if (owner) { + + return owner !== this.getObject(); + } + + return false; + } + getAllParents() { const list: Array = []; From 0dc15556d6a5178db4ded178f47b3ed1a5241858 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Tue, 10 Aug 2021 23:32:01 -0400 Subject: [PATCH 085/108] Nested prefab: fixes components seriaization when no unlock is available. --- .../src/ui/sceneobjects/ParentGameObjectEditorSupport.ts | 5 ++++- .../object/properties/UserComponentsEditorComponent.ts | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts index 7202d5f24..f88de69ab 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/ParentGameObjectEditorSupport.ts @@ -102,7 +102,10 @@ namespace phasereditor2d.scene.ui.sceneobjects { return objData as json.IObjectData; }) - .filter(data => (data.nestedPrefabs ?? []).length > 0 || (data.unlock ?? []).length > 0); + .filter(data => + (data.nestedPrefabs ?? []).length > 0 + || (data.unlock ?? []).length > 0 + || (data.components ?? []).length > 0); } else { diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts index 83d77dfd5..526e9e62d 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts @@ -209,6 +209,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { return new Set(properties); } + private formatComponentVarName(name: string) { + + return name.replaceAll(".", "_"); + } + buildSetObjectPropertiesCodeDOM(args: ISetObjectPropertiesCodeDOMArgs): void { const allPropsStart = args.lazyStatements.length; @@ -221,7 +226,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { if (compInfo) { - const compVarName = args.objectVarName + compName; + const compVarName = this.formatComponentVarName(args.objectVarName + compName); const compPropsStart = args.lazyStatements.length; @@ -258,7 +263,7 @@ namespace phasereditor2d.scene.ui.sceneobjects { const compName = comp.getName(); - const compVarName = (args.objectVarName + compName).replaceAll(".", "_"); + const compVarName = this.formatComponentVarName(args.objectVarName + compName); const prefabPropsStart = args.lazyStatements.length; From a4276deddce02bc79a103d6b076db7cd091965aa Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 11 Aug 2021 00:29:51 -0400 Subject: [PATCH 086/108] Nested prefab (compiler): fixes nested prefab field visibility. --- .../phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index 225d1d784..935076977 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -212,7 +212,7 @@ namespace phasereditor2d.scene.core.code { ? support.getPrefabName() : support.getPhaserType(); - const isPublic = support.getScope() === ui.sceneobjects.ObjectScope.PUBLIC; + const isPublic = support.isPublic(); const field = new FieldDeclCodeDOM(varName, type, isPublic); // Allow undefined if the object is part of a scene. From 2aac3b48039414efdc8b5b4a6dde992a520757cf Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 11 Aug 2021 00:30:17 -0400 Subject: [PATCH 087/108] Nested prefabs: fixes getting all prefab's components. --- .../object/properties/UserComponentsEditorComponent.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts index 526e9e62d..ecd44fca5 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/sceneobjects/object/properties/UserComponentsEditorComponent.ts @@ -136,13 +136,15 @@ namespace phasereditor2d.scene.ui.sceneobjects { getPrefabUserComponents() { + const finder = ScenePlugin.getInstance().getSceneFinder(); + const result: IUserComponentAndPrefab[] = []; const support = this.getObject().getEditorSupport(); if (support.isPrefabInstance()) { - const objData = support.getPrefabData(); + const objData = finder.getPrefabData(support.getPrefabId()); if (objData) { @@ -181,6 +183,11 @@ namespace phasereditor2d.scene.ui.sceneobjects { result.push({ prefabFile, components }) } } + + if (objData.prefabId) { + + this.getUserComponentsOfPrefab(objData.prefabId, result); + } } } From 0972571263fe1342b05374541cc0d6b67a8bfb8b Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 11 Aug 2021 00:46:48 -0400 Subject: [PATCH 088/108] Nested prefabs: shows `:prefab` and `:nested ` tags in the Outline view. --- .../SceneEditorOutlineStyledLabelProvider.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineStyledLabelProvider.ts b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineStyledLabelProvider.ts index 28929db48..8e5a2b1f3 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineStyledLabelProvider.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/ui/editor/outline/SceneEditorOutlineStyledLabelProvider.ts @@ -76,6 +76,38 @@ namespace phasereditor2d.scene.ui.editor.outline { } } + if (sceneobjects.isGameObject(obj)) { + + const support = (obj as sceneobjects.ISceneGameObject).getEditorSupport(); + + if (support.isNestedPrefabInstance()) { + + return [ + { + text: baseLabel, + color: theme.viewerForeground + }, + { + text: ":nested", + color: theme.viewerForeground + "90" + } + ]; + + } else if (support.isPrefabInstance()) { + + return [ + { + text: baseLabel, + color: theme.viewerForeground + }, + { + text: ":prefab", + color: theme.viewerForeground + "90" + } + ]; + } + } + return [{ text: baseLabel, color: theme.viewerForeground From fc7cbf57fae945656373db273ca7265a9ae5bc78 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Wed, 11 Aug 2021 02:09:09 -0400 Subject: [PATCH 089/108] Update changelog. --- CHANGELOG.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 8d95b2845..0e4897be3 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -5,6 +5,7 @@ ### Added * Nested prefabs: + * Nested prefabs support. * Uses nullish operator (`??`) in prefab constructors. * Allows unlock the position of prefab instances. This change introduces a new scene format that is not compatible with previous versions of the editor. * Good bye `prefab-awake` & `components-awake` events. Welcome `scene-awake`. From 65d81d6647164cdfcf6bbb33b648002cffc0955c Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Thu, 12 Aug 2021 03:16:38 -0400 Subject: [PATCH 090/108] [Feature Request] add type for method in typescript #139 --- CHANGELOG.MD | 2 ++ .../phasereditor2d.scene/data/UserComponent.module.ts.txt | 8 ++++---- .../phasereditor2d.scene/data/UserComponent.ts.txt | 8 ++++---- .../src/core/code/JavaScriptUnitCodeGenerator.ts | 1 + .../src/core/code/SceneCodeDOMBuilder.ts | 2 ++ 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 0e4897be3..a83ea6ffc 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -13,7 +13,9 @@ * Scene Editor: new Show Children In Outline parameter in the Children section. ### Updated + * Scene Editor: replaces the Container section by the Children section, and applies for Layer objects too. +* [#139](https://github.com/PhaserEditor2D/PhaserEditor2D-v3/issues/139)[Feature Request] add type for method in typescript. ### Fixed diff --git a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.ts.txt b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.ts.txt index d23cd9b70..09200354f 100755 --- a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.ts.txt +++ b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.module.ts.txt @@ -46,19 +46,19 @@ export default class UserComponent { scene: Phaser.Scene; - protected awake() { + protected awake(): void { // override this } - protected start() { + protected start(): void { // override this } - protected update() { + protected update(): void { // override this } - protected destroy() { + protected destroy(): void { // override this } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.ts.txt b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.ts.txt index 98bda5ac3..14117a2e0 100755 --- a/source/editor/plugins/phasereditor2d.scene/data/UserComponent.ts.txt +++ b/source/editor/plugins/phasereditor2d.scene/data/UserComponent.ts.txt @@ -44,19 +44,19 @@ class UserComponent { scene: Phaser.Scene; - protected awake() { + protected awake(): void { // override this } - protected start() { + protected start(): void { // override this } - protected update() { + protected update(): void { // override this } - protected destroy() { + protected destroy(): void { // override this } } \ No newline at end of file diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/JavaScriptUnitCodeGenerator.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/JavaScriptUnitCodeGenerator.ts index 039578471..af0dabbed 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/JavaScriptUnitCodeGenerator.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/JavaScriptUnitCodeGenerator.ts @@ -151,6 +151,7 @@ namespace phasereditor2d.scene.core.code { } if (isFunction) { + this.append("function "); } diff --git a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts index 935076977..b316a71c6 100644 --- a/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts +++ b/source/editor/plugins/phasereditor2d.scene/src/core/code/SceneCodeDOMBuilder.ts @@ -349,6 +349,7 @@ namespace phasereditor2d.scene.core.code { const settings = this._scene.getSettings(); const createMethodDecl = new MethodDeclCodeDOM(settings.createMethodName); + createMethodDecl.setReturnType("void"); if (settings.onlyGenerateMethods && this._scene.isPrefabSceneType()) { @@ -796,6 +797,7 @@ namespace phasereditor2d.scene.core.code { } const preloadDom = new MethodDeclCodeDOM(settings.preloadMethodName); + preloadDom.setReturnType("void"); preloadDom.getBody().push(new RawCodeDOM("")); From 6024f803862656489f49ccf1ca52a5ef19638fc5 Mon Sep 17 00:00:00 2001 From: PhaserEditor2D Date: Thu, 12 Aug 2021 03:24:21 -0400 Subject: [PATCH 091/108] Deletes monaco editor min-map files. --- .../min-maps/vs/base/worker/workerMain.js.map | 1 - .../monaco-editor-0.25.2/min-maps/vs/editor/editor.main.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.de.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.es.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.fr.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.it.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.ja.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.ko.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.ru.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.zh-cn.js.map | 1 - .../min-maps/vs/editor/editor.main.nls.zh-tw.js.map | 1 - .../scripts/monaco-editor-0.25.2/min-maps/vs/loader.js.map | 1 - 13 files changed, 13 deletions(-) delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/base/worker/workerMain.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.de.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.es.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.fr.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.it.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.ja.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.ko.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.ru.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.zh-cn.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/editor/editor.main.nls.zh-tw.js.map delete mode 100644 source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/loader.js.map diff --git a/source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/base/worker/workerMain.js.map b/source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/base/worker/workerMain.js.map deleted file mode 100644 index ef32b7a5b..000000000 --- a/source/editor/plugins/phasereditor2d.code/scripts/monaco-editor-0.25.2/min-maps/vs/base/worker/workerMain.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["out-editor/vs/base/worker/fake","out-editor/vs/base/worker/vs/loader.js","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/diff/diffChange.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/errors.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/iterator.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/keyCodes.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/lifecycle.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/linkedList.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/platform.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/process.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/path.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/stopwatch.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/event.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/cancellation.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/strings.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/hash.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/diff/diff.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/types.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/uint.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/uri.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/common/worker/simpleWorker.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/core/characterClassifier.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/core/position.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/core/range.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/core/selection.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/core/token.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/diff/diffComputer.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/model/wordHelper.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/modes/linkComputer.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/modes/supports/inplaceReplaceSupport.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/standalone/standaloneEnums.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/standalone/standaloneBase.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/viewModel/prefixSumComputer.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/model/mirrorTextModel.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/editor/common/services/editorSimpleWorker.ts","out-editor/vs/base/worker/file:/C:/dev/microsoft/vscode/out-editor-src/vs/base/worker/workerMain.ts"],"sourcesContent":["}).call(this);","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n/*---------------------------------------------------------------------------------------------\n *---------------------------------------------------------------------------------------------\n *---------------------------------------------------------------------------------------------\n *---------------------------------------------------------------------------------------------\n *---------------------------------------------------------------------------------------------\n * Please make sure to make edits in the .ts file at https://github.com/microsoft/vscode-loader/\n *---------------------------------------------------------------------------------------------\n *---------------------------------------------------------------------------------------------\n *---------------------------------------------------------------------------------------------\n *---------------------------------------------------------------------------------------------\n *--------------------------------------------------------------------------------------------*/\nvar _amdLoaderGlobal = this;\nvar _commonjsGlobal = typeof global === 'object' ? global : {};\nvar AMDLoader;\n(function (AMDLoader) {\n AMDLoader.global = _amdLoaderGlobal;\n var Environment = /** @class */ (function () {\n function Environment() {\n this._detected = false;\n this._isWindows = false;\n this._isNode = false;\n this._isElectronRenderer = false;\n this._isWebWorker = false;\n }\n Object.defineProperty(Environment.prototype, \"isWindows\", {\n get: function () {\n this._detect();\n return this._isWindows;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"isNode\", {\n get: function () {\n this._detect();\n return this._isNode;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"isElectronRenderer\", {\n get: function () {\n this._detect();\n return this._isElectronRenderer;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"isWebWorker\", {\n get: function () {\n this._detect();\n return this._isWebWorker;\n },\n enumerable: false,\n configurable: true\n });\n Environment.prototype._detect = function () {\n if (this._detected) {\n return;\n }\n this._detected = true;\n this._isWindows = Environment._isWindows();\n this._isNode = (typeof module !== 'undefined' && !!module.exports);\n this._isElectronRenderer = (typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.electron !== 'undefined' && process.type === 'renderer');\n this._isWebWorker = (typeof AMDLoader.global.importScripts === 'function');\n };\n Environment._isWindows = function () {\n if (typeof navigator !== 'undefined') {\n if (navigator.userAgent && navigator.userAgent.indexOf('Windows') >= 0) {\n return true;\n }\n }\n if (typeof process !== 'undefined') {\n return (process.platform === 'win32');\n }\n return false;\n };\n return Environment;\n }());\n AMDLoader.Environment = Environment;\n})(AMDLoader || (AMDLoader = {}));\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar AMDLoader;\n(function (AMDLoader) {\n var LoaderEvent = /** @class */ (function () {\n function LoaderEvent(type, detail, timestamp) {\n this.type = type;\n this.detail = detail;\n this.timestamp = timestamp;\n }\n return LoaderEvent;\n }());\n AMDLoader.LoaderEvent = LoaderEvent;\n var LoaderEventRecorder = /** @class */ (function () {\n function LoaderEventRecorder(loaderAvailableTimestamp) {\n this._events = [new LoaderEvent(1 /* LoaderAvailable */, '', loaderAvailableTimestamp)];\n }\n LoaderEventRecorder.prototype.record = function (type, detail) {\n this._events.push(new LoaderEvent(type, detail, AMDLoader.Utilities.getHighPerformanceTimestamp()));\n };\n LoaderEventRecorder.prototype.getEvents = function () {\n return this._events;\n };\n return LoaderEventRecorder;\n }());\n AMDLoader.LoaderEventRecorder = LoaderEventRecorder;\n var NullLoaderEventRecorder = /** @class */ (function () {\n function NullLoaderEventRecorder() {\n }\n NullLoaderEventRecorder.prototype.record = function (type, detail) {\n // Nothing to do\n };\n NullLoaderEventRecorder.prototype.getEvents = function () {\n return [];\n };\n NullLoaderEventRecorder.INSTANCE = new NullLoaderEventRecorder();\n return NullLoaderEventRecorder;\n }());\n AMDLoader.NullLoaderEventRecorder = NullLoaderEventRecorder;\n})(AMDLoader || (AMDLoader = {}));\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar AMDLoader;\n(function (AMDLoader) {\n var Utilities = /** @class */ (function () {\n function Utilities() {\n }\n /**\n * This method does not take care of / vs \\\n */\n Utilities.fileUriToFilePath = function (isWindows, uri) {\n uri = decodeURI(uri).replace(/%23/g, '#');\n if (isWindows) {\n if (/^file:\\/\\/\\//.test(uri)) {\n // This is a URI without a hostname => return only the path segment\n return uri.substr(8);\n }\n if (/^file:\\/\\//.test(uri)) {\n return uri.substr(5);\n }\n }\n else {\n if (/^file:\\/\\//.test(uri)) {\n return uri.substr(7);\n }\n }\n // Not sure...\n return uri;\n };\n Utilities.startsWith = function (haystack, needle) {\n return haystack.length >= needle.length && haystack.substr(0, needle.length) === needle;\n };\n Utilities.endsWith = function (haystack, needle) {\n return haystack.length >= needle.length && haystack.substr(haystack.length - needle.length) === needle;\n };\n // only check for \"?\" before \"#\" to ensure that there is a real Query-String\n Utilities.containsQueryString = function (url) {\n return /^[^\\#]*\\?/gi.test(url);\n };\n /**\n * Does `url` start with http:// or https:// or file:// or / ?\n */\n Utilities.isAbsolutePath = function (url) {\n return /^((http:\\/\\/)|(https:\\/\\/)|(file:\\/\\/)|(\\/))/.test(url);\n };\n Utilities.forEachProperty = function (obj, callback) {\n if (obj) {\n var key = void 0;\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n callback(key, obj[key]);\n }\n }\n }\n };\n Utilities.isEmpty = function (obj) {\n var isEmpty = true;\n Utilities.forEachProperty(obj, function () {\n isEmpty = false;\n });\n return isEmpty;\n };\n Utilities.recursiveClone = function (obj) {\n if (!obj || typeof obj !== 'object' || obj instanceof RegExp) {\n return obj;\n }\n if (!Array.isArray(obj) && Object.getPrototypeOf(obj) !== Object.prototype) {\n // only clone \"simple\" objects\n return obj;\n }\n var result = Array.isArray(obj) ? [] : {};\n Utilities.forEachProperty(obj, function (key, value) {\n if (value && typeof value === 'object') {\n result[key] = Utilities.recursiveClone(value);\n }\n else {\n result[key] = value;\n }\n });\n return result;\n };\n Utilities.generateAnonymousModule = function () {\n return '===anonymous' + (Utilities.NEXT_ANONYMOUS_ID++) + '===';\n };\n Utilities.isAnonymousModule = function (id) {\n return Utilities.startsWith(id, '===anonymous');\n };\n Utilities.getHighPerformanceTimestamp = function () {\n if (!this.PERFORMANCE_NOW_PROBED) {\n this.PERFORMANCE_NOW_PROBED = true;\n this.HAS_PERFORMANCE_NOW = (AMDLoader.global.performance && typeof AMDLoader.global.performance.now === 'function');\n }\n return (this.HAS_PERFORMANCE_NOW ? AMDLoader.global.performance.now() : Date.now());\n };\n Utilities.NEXT_ANONYMOUS_ID = 1;\n Utilities.PERFORMANCE_NOW_PROBED = false;\n Utilities.HAS_PERFORMANCE_NOW = false;\n return Utilities;\n }());\n AMDLoader.Utilities = Utilities;\n})(AMDLoader || (AMDLoader = {}));\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar AMDLoader;\n(function (AMDLoader) {\n function ensureError(err) {\n if (err instanceof Error) {\n return err;\n }\n var result = new Error(err.message || String(err) || 'Unknown Error');\n if (err.stack) {\n result.stack = err.stack;\n }\n return result;\n }\n AMDLoader.ensureError = ensureError;\n ;\n var ConfigurationOptionsUtil = /** @class */ (function () {\n function ConfigurationOptionsUtil() {\n }\n /**\n * Ensure configuration options make sense\n */\n ConfigurationOptionsUtil.validateConfigurationOptions = function (options) {\n function defaultOnError(err) {\n if (err.phase === 'loading') {\n console.error('Loading \"' + err.moduleId + '\" failed');\n console.error(err);\n console.error('Here are the modules that depend on it:');\n console.error(err.neededBy);\n return;\n }\n if (err.phase === 'factory') {\n console.error('The factory method of \"' + err.moduleId + '\" has thrown an exception');\n console.error(err);\n return;\n }\n }\n options = options || {};\n if (typeof options.baseUrl !== 'string') {\n options.baseUrl = '';\n }\n if (typeof options.isBuild !== 'boolean') {\n options.isBuild = false;\n }\n if (typeof options.paths !== 'object') {\n options.paths = {};\n }\n if (typeof options.config !== 'object') {\n options.config = {};\n }\n if (typeof options.catchError === 'undefined') {\n options.catchError = false;\n }\n if (typeof options.recordStats === 'undefined') {\n options.recordStats = false;\n }\n if (typeof options.urlArgs !== 'string') {\n options.urlArgs = '';\n }\n if (typeof options.onError !== 'function') {\n options.onError = defaultOnError;\n }\n if (!Array.isArray(options.ignoreDuplicateModules)) {\n options.ignoreDuplicateModules = [];\n }\n if (options.baseUrl.length > 0) {\n if (!AMDLoader.Utilities.endsWith(options.baseUrl, '/')) {\n options.baseUrl += '/';\n }\n }\n if (typeof options.cspNonce !== 'string') {\n options.cspNonce = '';\n }\n if (typeof options.preferScriptTags === 'undefined') {\n options.preferScriptTags = false;\n }\n if (!Array.isArray(options.nodeModules)) {\n options.nodeModules = [];\n }\n if (options.nodeCachedData && typeof options.nodeCachedData === 'object') {\n if (typeof options.nodeCachedData.seed !== 'string') {\n options.nodeCachedData.seed = 'seed';\n }\n if (typeof options.nodeCachedData.writeDelay !== 'number' || options.nodeCachedData.writeDelay < 0) {\n options.nodeCachedData.writeDelay = 1000 * 7;\n }\n if (!options.nodeCachedData.path || typeof options.nodeCachedData.path !== 'string') {\n var err = ensureError(new Error('INVALID cached data configuration, \\'path\\' MUST be set'));\n err.phase = 'configuration';\n options.onError(err);\n options.nodeCachedData = undefined;\n }\n }\n return options;\n };\n ConfigurationOptionsUtil.mergeConfigurationOptions = function (overwrite, base) {\n if (overwrite === void 0) { overwrite = null; }\n if (base === void 0) { base = null; }\n var result = AMDLoader.Utilities.recursiveClone(base || {});\n // Merge known properties and overwrite the unknown ones\n AMDLoader.Utilities.forEachProperty(overwrite, function (key, value) {\n if (key === 'ignoreDuplicateModules' && typeof result.ignoreDuplicateModules !== 'undefined') {\n result.ignoreDuplicateModules = result.ignoreDuplicateModules.concat(value);\n }\n else if (key === 'paths' && typeof result.paths !== 'undefined') {\n AMDLoader.Utilities.forEachProperty(value, function (key2, value2) { return result.paths[key2] = value2; });\n }\n else if (key === 'config' && typeof result.config !== 'undefined') {\n AMDLoader.Utilities.forEachProperty(value, function (key2, value2) { return result.config[key2] = value2; });\n }\n else {\n result[key] = AMDLoader.Utilities.recursiveClone(value);\n }\n });\n return ConfigurationOptionsUtil.validateConfigurationOptions(result);\n };\n return ConfigurationOptionsUtil;\n }());\n AMDLoader.ConfigurationOptionsUtil = ConfigurationOptionsUtil;\n var Configuration = /** @class */ (function () {\n function Configuration(env, options) {\n this._env = env;\n this.options = ConfigurationOptionsUtil.mergeConfigurationOptions(options);\n this._createIgnoreDuplicateModulesMap();\n this._createNodeModulesMap();\n this._createSortedPathsRules();\n if (this.options.baseUrl === '') {\n if (this.options.nodeRequire && this.options.nodeRequire.main && this.options.nodeRequire.main.filename && this._env.isNode) {\n var nodeMain = this.options.nodeRequire.main.filename;\n var dirnameIndex = Math.max(nodeMain.lastIndexOf('/'), nodeMain.lastIndexOf('\\\\'));\n this.options.baseUrl = nodeMain.substring(0, dirnameIndex + 1);\n }\n if (this.options.nodeMain && this._env.isNode) {\n var nodeMain = this.options.nodeMain;\n var dirnameIndex = Math.max(nodeMain.lastIndexOf('/'), nodeMain.lastIndexOf('\\\\'));\n this.options.baseUrl = nodeMain.substring(0, dirnameIndex + 1);\n }\n }\n }\n Configuration.prototype._createIgnoreDuplicateModulesMap = function () {\n // Build a map out of the ignoreDuplicateModules array\n this.ignoreDuplicateModulesMap = {};\n for (var i = 0; i < this.options.ignoreDuplicateModules.length; i++) {\n this.ignoreDuplicateModulesMap[this.options.ignoreDuplicateModules[i]] = true;\n }\n };\n Configuration.prototype._createNodeModulesMap = function () {\n // Build a map out of nodeModules array\n this.nodeModulesMap = Object.create(null);\n for (var _i = 0, _a = this.options.nodeModules; _i < _a.length; _i++) {\n var nodeModule = _a[_i];\n this.nodeModulesMap[nodeModule] = true;\n }\n };\n Configuration.prototype._createSortedPathsRules = function () {\n var _this = this;\n // Create an array our of the paths rules, sorted descending by length to\n // result in a more specific -> less specific order\n this.sortedPathsRules = [];\n AMDLoader.Utilities.forEachProperty(this.options.paths, function (from, to) {\n if (!Array.isArray(to)) {\n _this.sortedPathsRules.push({\n from: from,\n to: [to]\n });\n }\n else {\n _this.sortedPathsRules.push({\n from: from,\n to: to\n });\n }\n });\n this.sortedPathsRules.sort(function (a, b) {\n return b.from.length - a.from.length;\n });\n };\n /**\n * Clone current configuration and overwrite options selectively.\n * @param options The selective options to overwrite with.\n * @result A new configuration\n */\n Configuration.prototype.cloneAndMerge = function (options) {\n return new Configuration(this._env, ConfigurationOptionsUtil.mergeConfigurationOptions(options, this.options));\n };\n /**\n * Get current options bag. Useful for passing it forward to plugins.\n */\n Configuration.prototype.getOptionsLiteral = function () {\n return this.options;\n };\n Configuration.prototype._applyPaths = function (moduleId) {\n var pathRule;\n for (var i = 0, len = this.sortedPathsRules.length; i < len; i++) {\n pathRule = this.sortedPathsRules[i];\n if (AMDLoader.Utilities.startsWith(moduleId, pathRule.from)) {\n var result = [];\n for (var j = 0, lenJ = pathRule.to.length; j < lenJ; j++) {\n result.push(pathRule.to[j] + moduleId.substr(pathRule.from.length));\n }\n return result;\n }\n }\n return [moduleId];\n };\n Configuration.prototype._addUrlArgsToUrl = function (url) {\n if (AMDLoader.Utilities.containsQueryString(url)) {\n return url + '&' + this.options.urlArgs;\n }\n else {\n return url + '?' + this.options.urlArgs;\n }\n };\n Configuration.prototype._addUrlArgsIfNecessaryToUrl = function (url) {\n if (this.options.urlArgs) {\n return this._addUrlArgsToUrl(url);\n }\n return url;\n };\n Configuration.prototype._addUrlArgsIfNecessaryToUrls = function (urls) {\n if (this.options.urlArgs) {\n for (var i = 0, len = urls.length; i < len; i++) {\n urls[i] = this._addUrlArgsToUrl(urls[i]);\n }\n }\n return urls;\n };\n /**\n * Transform a module id to a location. Appends .js to module ids\n */\n Configuration.prototype.moduleIdToPaths = function (moduleId) {\n var isNodeModule = ((this.nodeModulesMap[moduleId] === true)\n || (this.options.amdModulesPattern instanceof RegExp && !this.options.amdModulesPattern.test(moduleId)));\n if (isNodeModule) {\n // This is a node module...\n if (this.isBuild()) {\n // ...and we are at build time, drop it\n return ['empty:'];\n }\n else {\n // ...and at runtime we create a `shortcut`-path\n return ['node|' + moduleId];\n }\n }\n var result = moduleId;\n var results;\n if (!AMDLoader.Utilities.endsWith(result, '.js') && !AMDLoader.Utilities.isAbsolutePath(result)) {\n results = this._applyPaths(result);\n for (var i = 0, len = results.length; i < len; i++) {\n if (this.isBuild() && results[i] === 'empty:') {\n continue;\n }\n if (!AMDLoader.Utilities.isAbsolutePath(results[i])) {\n results[i] = this.options.baseUrl + results[i];\n }\n if (!AMDLoader.Utilities.endsWith(results[i], '.js') && !AMDLoader.Utilities.containsQueryString(results[i])) {\n results[i] = results[i] + '.js';\n }\n }\n }\n else {\n if (!AMDLoader.Utilities.endsWith(result, '.js') && !AMDLoader.Utilities.containsQueryString(result)) {\n result = result + '.js';\n }\n results = [result];\n }\n return this._addUrlArgsIfNecessaryToUrls(results);\n };\n /**\n * Transform a module id or url to a location.\n */\n Configuration.prototype.requireToUrl = function (url) {\n var result = url;\n if (!AMDLoader.Utilities.isAbsolutePath(result)) {\n result = this._applyPaths(result)[0];\n if (!AMDLoader.Utilities.isAbsolutePath(result)) {\n result = this.options.baseUrl + result;\n }\n }\n return this._addUrlArgsIfNecessaryToUrl(result);\n };\n /**\n * Flag to indicate if current execution is as part of a build.\n */\n Configuration.prototype.isBuild = function () {\n return this.options.isBuild;\n };\n /**\n * Test if module `moduleId` is expected to be defined multiple times\n */\n Configuration.prototype.isDuplicateMessageIgnoredFor = function (moduleId) {\n return this.ignoreDuplicateModulesMap.hasOwnProperty(moduleId);\n };\n /**\n * Get the configuration settings for the provided module id\n */\n Configuration.prototype.getConfigForModule = function (moduleId) {\n if (this.options.config) {\n return this.options.config[moduleId];\n }\n };\n /**\n * Should errors be caught when executing module factories?\n */\n Configuration.prototype.shouldCatchError = function () {\n return this.options.catchError;\n };\n /**\n * Should statistics be recorded?\n */\n Configuration.prototype.shouldRecordStats = function () {\n return this.options.recordStats;\n };\n /**\n * Forward an error to the error handler.\n */\n Configuration.prototype.onError = function (err) {\n this.options.onError(err);\n };\n return Configuration;\n }());\n AMDLoader.Configuration = Configuration;\n})(AMDLoader || (AMDLoader = {}));\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar AMDLoader;\n(function (AMDLoader) {\n /**\n * Load `scriptSrc` only once (avoid multiple