diff --git a/doric-h5/.gitignore b/doric-h5/.gitignore new file mode 100644 index 00000000..53fc2543 --- /dev/null +++ b/doric-h5/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +build/ +bundle/ +demo/ +.DS_Store \ No newline at end of file diff --git a/doric-h5/LICENCE b/doric-h5/LICENCE new file mode 100644 index 00000000..97846020 --- /dev/null +++ b/doric-h5/LICENCE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2019] [Doric.Pub] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/doric-h5/dist/Counter.js b/doric-h5/dist/Counter.js new file mode 100644 index 00000000..15dec415 --- /dev/null +++ b/doric-h5/dist/Counter.js @@ -0,0 +1,140 @@ +'use strict'; + +var doric = require('doric'); + +const colors = [ + "#70a1ff", + "#7bed9f", + "#ff6b81", + "#a4b0be", + "#f0932b", + "#eb4d4b", + "#6ab04c", + "#e056fd", + "#686de0", + "#30336b", +].map(e => doric.Color.parse(e)); +function label(str) { + return doric.text({ + text: str, + textSize: 16, + }); +} + +const img_base64 = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4Qm8aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+IDxkYzpjcmVhdG9yPiA8cmRmOlNlcT4gPHJkZjpsaT5WZWN0b3JTdG9jay5jb20vNzMxNTkwPC9yZGY6bGk+IDwvcmRmOlNlcT4gPC9kYzpjcmVhdG9yPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgDDAPoAwERAAIRAQMRAf/EAB0AAQABBAMBAAAAAAAAAAAAAAAHBAUGCAEC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Nbqew6Az6PpwT0NIS/dVFecJJEpxOGVyI1j49XdDy62Zgj15eOT65qP/AAa3J8oAcvHJ9c1H/g1uT5QA5eOT65qP/BrcnygBy8cn1zUf+DW5PlAHKdOSUnPVuekpI+HLDa5Cz/jAGBXNjZZN2z+SE5u12apnrck6dhlcsGZnx74YdQ598CsRvLTJuPB6nMVOgYrVSrMLfJhqiVexqnKQazSo05SJ7rbhFmRFkTq1bcySeRgjZnzLyx3re0aiuGrRJbF1XXWZ9VrDk9lTb63t3U2nMlER5aqNbb0VqPoiLDb8FAAAAAAAAAAAAAAAAAAAAAAAAAHCi2GA0dwcz5qHpC5KMj87tL2kf/6cQVludk501zujFwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmud0YYGTnTXO6MMDJzprndGGBk501zujDAyc6a53RhgZOdNc7owwMnOmu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HSnftZgUbvI6U79rMCjd5HSnftZgUbvI6U79rMCjd5HSnftZgUbvI6U79rMCjd5HSnftZgUbvI6U79rMCjd5HSnftZgUbvI6U79rMCjd5HSnftZgUbvI6U79rMCmpVwrWrzVHDg1pUk/OFL2KIy+jkgN5dYur2jBQlZnwH2gHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8/dMywk4xac2DNgT7ir1BodXoE9cldBnHGd1mt2cSZHkaeFBEeaT2Aksl5l7YPsnYp/CFHyItIop3mUeGVTlRJMrEHEqTIiKNcd16tsrWyo8szQZsGaT2FtLIBUcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38iAcy0w99kzFHv+38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'; + +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +const imageUrl = 'https://img.zcool.cn/community/01e75b5da933daa801209e1ffa4649.jpg@1280w_1l_2o_100sh.jpg'; +let ImageDemo = class ImageDemo extends doric.Panel { + build(rootView) { + let imageView; + doric.scroller(doric.vlayout([ + doric.text({ + text: "Image Demo", + layoutConfig: doric.layoutConfig().configWidth(doric.LayoutSpec.MOST), + textSize: 30, + textColor: doric.Color.WHITE, + backgroundColor: colors[5], + textAlignment: doric.gravity().center(), + height: 50, + }), + label('Gif'), + doric.image({ + imageUrl: "https://misc.aotu.io/ONE-SUNDAY/world-cup_2014_42.gif", + scaleType: doric.ScaleType.ScaleToFill, + loadCallback: function (ret) { + doric.log('this'); + doric.log('loadCallback', ret); + } + }), + label('APNG'), + doric.image({ + imageUrl: "https://misc.aotu.io/ONE-SUNDAY/world_cup_2014_42.png", + loadCallback: (ret) => { + } + }), + label('Animated WebP'), + doric.image({ + imageUrl: "https://p.upyun.com/demo/webp/webp/animated-gif-0.webp", + loadCallback: (ret) => { + } + }), + label('WebP'), + imageView = doric.image({ + imageUrl: "https://p.upyun.com/demo/webp/webp/jpg-0.webp", + loadCallback: (ret) => { + if (ret) { + imageView.width = ret.width; + imageView.height = ret.height; + } + } + }), + label('ScaleToFill'), + doric.image({ + imageUrl, + width: 300, + height: 300, + isBlur: true, + border: { + width: 2, + color: doric.Color.GRAY, + }, + scaleType: doric.ScaleType.ScaleToFill, + layoutConfig: doric.layoutConfig().just(), + loadCallback: (ret) => { + } + }), + label('ScaleAspectFit'), + doric.image({ + imageUrl, + width: 300, + height: 300, + border: { + width: 2, + color: doric.Color.GRAY, + }, + scaleType: doric.ScaleType.ScaleAspectFit, + layoutConfig: doric.layoutConfig().just(), + }), + label('ScaleAspectFill'), + doric.image({ + imageUrl, + width: 300, + height: 300, + border: { + width: 2, + color: doric.Color.GRAY, + }, + scaleType: doric.ScaleType.ScaleAspectFill, + layoutConfig: doric.layoutConfig().just(), + }), + label('ImageBase64'), + doric.image({ + imageBase64: img_base64, + width: 300, + height: 300, + border: { + width: 2, + color: doric.Color.GRAY, + }, + scaleType: doric.ScaleType.ScaleAspectFill, + layoutConfig: doric.layoutConfig().just(), + }), + ]).apply({ + layoutConfig: doric.layoutConfig().most().configHeight(doric.LayoutSpec.FIT), + gravity: doric.gravity().center(), + space: 10, + })).apply({ + layoutConfig: doric.layoutConfig().most(), + }).in(rootView); + } +}; +ImageDemo = __decorate([ + Entry +], ImageDemo); +//# sourceMappingURL=ImageDemo.js.map diff --git a/doric-h5/dist/index.js b/doric-h5/dist/index.js new file mode 100644 index 00000000..6abadb64 --- /dev/null +++ b/doric-h5/dist/index.js @@ -0,0 +1,4665 @@ + +/**++++++++SandBox++++++++*/ +var doric = (function (exports) { + 'use strict'; + + /* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + let __uniqueId__ = 0; + function uniqueId(prefix) { + return `__${prefix}_${__uniqueId__++}__`; + } + + function toString(message) { + if (message instanceof Function) { + return message.toString(); + } + else if (message instanceof Object) { + try { + return JSON.stringify(message); + } + catch (e) { + return message.toString(); + } + } + else if (message === undefined) { + return "undefined"; + } + else { + return message.toString(); + } + } + function loge(...message) { + let out = ""; + for (let i = 0; i < arguments.length; i++) { + if (i > 0) { + out += ','; + } + out += toString(arguments[i]); + } + nativeLog('e', out); + } + + /*! ***************************************************************************** + Copyright (C) Microsoft. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + var Reflect$1; + (function (Reflect) { + // Metadata Proposal + // https://rbuckton.github.io/reflect-metadata/ + (function (factory) { + var root = typeof global === "object" ? global : + typeof self === "object" ? self : + typeof this === "object" ? this : + Function("return this;")(); + var exporter = makeExporter(Reflect); + if (typeof root.Reflect === "undefined") { + root.Reflect = Reflect; + } + else { + exporter = makeExporter(root.Reflect, exporter); + } + factory(exporter); + function makeExporter(target, previous) { + return function (key, value) { + if (typeof target[key] !== "function") { + Object.defineProperty(target, key, { configurable: true, writable: true, value: value }); + } + if (previous) + previous(key, value); + }; + } + })(function (exporter) { + var hasOwn = Object.prototype.hasOwnProperty; + // feature test for Symbol support + var supportsSymbol = typeof Symbol === "function"; + var toPrimitiveSymbol = supportsSymbol && typeof Symbol.toPrimitive !== "undefined" ? Symbol.toPrimitive : "@@toPrimitive"; + var iteratorSymbol = supportsSymbol && typeof Symbol.iterator !== "undefined" ? Symbol.iterator : "@@iterator"; + var supportsCreate = typeof Object.create === "function"; // feature test for Object.create support + var supportsProto = { __proto__: [] } instanceof Array; // feature test for __proto__ support + var downLevel = !supportsCreate && !supportsProto; + var HashMap = { + // create an object in dictionary mode (a.k.a. "slow" mode in v8) + create: supportsCreate + ? function () { return MakeDictionary(Object.create(null)); } + : supportsProto + ? function () { return MakeDictionary({ __proto__: null }); } + : function () { return MakeDictionary({}); }, + has: downLevel + ? function (map, key) { return hasOwn.call(map, key); } + : function (map, key) { return key in map; }, + get: downLevel + ? function (map, key) { return hasOwn.call(map, key) ? map[key] : undefined; } + : function (map, key) { return map[key]; }, + }; + // Load global or shim versions of Map, Set, and WeakMap + var functionPrototype = Object.getPrototypeOf(Function); + var usePolyfill = typeof process === "object" && process.env && process.env["REFLECT_METADATA_USE_MAP_POLYFILL"] === "true"; + var _Map = !usePolyfill && typeof Map === "function" && typeof Map.prototype.entries === "function" ? Map : CreateMapPolyfill(); + var _Set = !usePolyfill && typeof Set === "function" && typeof Set.prototype.entries === "function" ? Set : CreateSetPolyfill(); + var _WeakMap = !usePolyfill && typeof WeakMap === "function" ? WeakMap : CreateWeakMapPolyfill(); + // [[Metadata]] internal slot + // https://rbuckton.github.io/reflect-metadata/#ordinary-object-internal-methods-and-internal-slots + var Metadata = new _WeakMap(); + /** + * Applies a set of decorators to a property of a target object. + * @param decorators An array of decorators. + * @param target The target object. + * @param propertyKey (Optional) The property key to decorate. + * @param attributes (Optional) The property descriptor for the target key. + * @remarks Decorators are applied in reverse order. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * Example = Reflect.decorate(decoratorsArray, Example); + * + * // property (on constructor) + * Reflect.decorate(decoratorsArray, Example, "staticProperty"); + * + * // property (on prototype) + * Reflect.decorate(decoratorsArray, Example.prototype, "property"); + * + * // method (on constructor) + * Object.defineProperty(Example, "staticMethod", + * Reflect.decorate(decoratorsArray, Example, "staticMethod", + * Object.getOwnPropertyDescriptor(Example, "staticMethod"))); + * + * // method (on prototype) + * Object.defineProperty(Example.prototype, "method", + * Reflect.decorate(decoratorsArray, Example.prototype, "method", + * Object.getOwnPropertyDescriptor(Example.prototype, "method"))); + * + */ + function decorate(decorators, target, propertyKey, attributes) { + if (!IsUndefined(propertyKey)) { + if (!IsArray(decorators)) + throw new TypeError(); + if (!IsObject(target)) + throw new TypeError(); + if (!IsObject(attributes) && !IsUndefined(attributes) && !IsNull(attributes)) + throw new TypeError(); + if (IsNull(attributes)) + attributes = undefined; + propertyKey = ToPropertyKey(propertyKey); + return DecorateProperty(decorators, target, propertyKey, attributes); + } + else { + if (!IsArray(decorators)) + throw new TypeError(); + if (!IsConstructor(target)) + throw new TypeError(); + return DecorateConstructor(decorators, target); + } + } + exporter("decorate", decorate); + // 4.1.2 Reflect.metadata(metadataKey, metadataValue) + // https://rbuckton.github.io/reflect-metadata/#reflect.metadata + /** + * A default metadata decorator factory that can be used on a class, class member, or parameter. + * @param metadataKey The key for the metadata entry. + * @param metadataValue The value for the metadata entry. + * @returns A decorator function. + * @remarks + * If `metadataKey` is already defined for the target and target key, the + * metadataValue for that key will be overwritten. + * @example + * + * // constructor + * @Reflect.metadata(key, value) + * class Example { + * } + * + * // property (on constructor, TypeScript only) + * class Example { + * @Reflect.metadata(key, value) + * static staticProperty; + * } + * + * // property (on prototype, TypeScript only) + * class Example { + * @Reflect.metadata(key, value) + * property; + * } + * + * // method (on constructor) + * class Example { + * @Reflect.metadata(key, value) + * static staticMethod() { } + * } + * + * // method (on prototype) + * class Example { + * @Reflect.metadata(key, value) + * method() { } + * } + * + */ + function metadata(metadataKey, metadataValue) { + function decorator(target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey) && !IsPropertyKey(propertyKey)) + throw new TypeError(); + OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey); + } + return decorator; + } + exporter("metadata", metadata); + /** + * Define a unique metadata entry on the target. + * @param metadataKey A key used to store and retrieve metadata. + * @param metadataValue A value that contains attached metadata. + * @param target The target object on which to define metadata. + * @param propertyKey (Optional) The property key for the target. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * Reflect.defineMetadata("custom:annotation", options, Example); + * + * // property (on constructor) + * Reflect.defineMetadata("custom:annotation", options, Example, "staticProperty"); + * + * // property (on prototype) + * Reflect.defineMetadata("custom:annotation", options, Example.prototype, "property"); + * + * // method (on constructor) + * Reflect.defineMetadata("custom:annotation", options, Example, "staticMethod"); + * + * // method (on prototype) + * Reflect.defineMetadata("custom:annotation", options, Example.prototype, "method"); + * + * // decorator factory as metadata-producing annotation. + * function MyAnnotation(options): Decorator { + * return (target, key?) => Reflect.defineMetadata("custom:annotation", options, target, key); + * } + * + */ + function defineMetadata(metadataKey, metadataValue, target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey)) + propertyKey = ToPropertyKey(propertyKey); + return OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey); + } + exporter("defineMetadata", defineMetadata); + /** + * Gets a value indicating whether the target object or its prototype chain has the provided metadata key defined. + * @param metadataKey A key used to store and retrieve metadata. + * @param target The target object on which the metadata is defined. + * @param propertyKey (Optional) The property key for the target. + * @returns `true` if the metadata key was defined on the target object or its prototype chain; otherwise, `false`. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * result = Reflect.hasMetadata("custom:annotation", Example); + * + * // property (on constructor) + * result = Reflect.hasMetadata("custom:annotation", Example, "staticProperty"); + * + * // property (on prototype) + * result = Reflect.hasMetadata("custom:annotation", Example.prototype, "property"); + * + * // method (on constructor) + * result = Reflect.hasMetadata("custom:annotation", Example, "staticMethod"); + * + * // method (on prototype) + * result = Reflect.hasMetadata("custom:annotation", Example.prototype, "method"); + * + */ + function hasMetadata(metadataKey, target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey)) + propertyKey = ToPropertyKey(propertyKey); + return OrdinaryHasMetadata(metadataKey, target, propertyKey); + } + exporter("hasMetadata", hasMetadata); + /** + * Gets a value indicating whether the target object has the provided metadata key defined. + * @param metadataKey A key used to store and retrieve metadata. + * @param target The target object on which the metadata is defined. + * @param propertyKey (Optional) The property key for the target. + * @returns `true` if the metadata key was defined on the target object; otherwise, `false`. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * result = Reflect.hasOwnMetadata("custom:annotation", Example); + * + * // property (on constructor) + * result = Reflect.hasOwnMetadata("custom:annotation", Example, "staticProperty"); + * + * // property (on prototype) + * result = Reflect.hasOwnMetadata("custom:annotation", Example.prototype, "property"); + * + * // method (on constructor) + * result = Reflect.hasOwnMetadata("custom:annotation", Example, "staticMethod"); + * + * // method (on prototype) + * result = Reflect.hasOwnMetadata("custom:annotation", Example.prototype, "method"); + * + */ + function hasOwnMetadata(metadataKey, target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey)) + propertyKey = ToPropertyKey(propertyKey); + return OrdinaryHasOwnMetadata(metadataKey, target, propertyKey); + } + exporter("hasOwnMetadata", hasOwnMetadata); + /** + * Gets the metadata value for the provided metadata key on the target object or its prototype chain. + * @param metadataKey A key used to store and retrieve metadata. + * @param target The target object on which the metadata is defined. + * @param propertyKey (Optional) The property key for the target. + * @returns The metadata value for the metadata key if found; otherwise, `undefined`. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * result = Reflect.getMetadata("custom:annotation", Example); + * + * // property (on constructor) + * result = Reflect.getMetadata("custom:annotation", Example, "staticProperty"); + * + * // property (on prototype) + * result = Reflect.getMetadata("custom:annotation", Example.prototype, "property"); + * + * // method (on constructor) + * result = Reflect.getMetadata("custom:annotation", Example, "staticMethod"); + * + * // method (on prototype) + * result = Reflect.getMetadata("custom:annotation", Example.prototype, "method"); + * + */ + function getMetadata(metadataKey, target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey)) + propertyKey = ToPropertyKey(propertyKey); + return OrdinaryGetMetadata(metadataKey, target, propertyKey); + } + exporter("getMetadata", getMetadata); + /** + * Gets the metadata value for the provided metadata key on the target object. + * @param metadataKey A key used to store and retrieve metadata. + * @param target The target object on which the metadata is defined. + * @param propertyKey (Optional) The property key for the target. + * @returns The metadata value for the metadata key if found; otherwise, `undefined`. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * result = Reflect.getOwnMetadata("custom:annotation", Example); + * + * // property (on constructor) + * result = Reflect.getOwnMetadata("custom:annotation", Example, "staticProperty"); + * + * // property (on prototype) + * result = Reflect.getOwnMetadata("custom:annotation", Example.prototype, "property"); + * + * // method (on constructor) + * result = Reflect.getOwnMetadata("custom:annotation", Example, "staticMethod"); + * + * // method (on prototype) + * result = Reflect.getOwnMetadata("custom:annotation", Example.prototype, "method"); + * + */ + function getOwnMetadata(metadataKey, target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey)) + propertyKey = ToPropertyKey(propertyKey); + return OrdinaryGetOwnMetadata(metadataKey, target, propertyKey); + } + exporter("getOwnMetadata", getOwnMetadata); + /** + * Gets the metadata keys defined on the target object or its prototype chain. + * @param target The target object on which the metadata is defined. + * @param propertyKey (Optional) The property key for the target. + * @returns An array of unique metadata keys. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * result = Reflect.getMetadataKeys(Example); + * + * // property (on constructor) + * result = Reflect.getMetadataKeys(Example, "staticProperty"); + * + * // property (on prototype) + * result = Reflect.getMetadataKeys(Example.prototype, "property"); + * + * // method (on constructor) + * result = Reflect.getMetadataKeys(Example, "staticMethod"); + * + * // method (on prototype) + * result = Reflect.getMetadataKeys(Example.prototype, "method"); + * + */ + function getMetadataKeys(target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey)) + propertyKey = ToPropertyKey(propertyKey); + return OrdinaryMetadataKeys(target, propertyKey); + } + exporter("getMetadataKeys", getMetadataKeys); + /** + * Gets the unique metadata keys defined on the target object. + * @param target The target object on which the metadata is defined. + * @param propertyKey (Optional) The property key for the target. + * @returns An array of unique metadata keys. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * result = Reflect.getOwnMetadataKeys(Example); + * + * // property (on constructor) + * result = Reflect.getOwnMetadataKeys(Example, "staticProperty"); + * + * // property (on prototype) + * result = Reflect.getOwnMetadataKeys(Example.prototype, "property"); + * + * // method (on constructor) + * result = Reflect.getOwnMetadataKeys(Example, "staticMethod"); + * + * // method (on prototype) + * result = Reflect.getOwnMetadataKeys(Example.prototype, "method"); + * + */ + function getOwnMetadataKeys(target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey)) + propertyKey = ToPropertyKey(propertyKey); + return OrdinaryOwnMetadataKeys(target, propertyKey); + } + exporter("getOwnMetadataKeys", getOwnMetadataKeys); + /** + * Deletes the metadata entry from the target object with the provided key. + * @param metadataKey A key used to store and retrieve metadata. + * @param target The target object on which the metadata is defined. + * @param propertyKey (Optional) The property key for the target. + * @returns `true` if the metadata entry was found and deleted; otherwise, false. + * @example + * + * class Example { + * // property declarations are not part of ES6, though they are valid in TypeScript: + * // static staticProperty; + * // property; + * + * constructor(p) { } + * static staticMethod(p) { } + * method(p) { } + * } + * + * // constructor + * result = Reflect.deleteMetadata("custom:annotation", Example); + * + * // property (on constructor) + * result = Reflect.deleteMetadata("custom:annotation", Example, "staticProperty"); + * + * // property (on prototype) + * result = Reflect.deleteMetadata("custom:annotation", Example.prototype, "property"); + * + * // method (on constructor) + * result = Reflect.deleteMetadata("custom:annotation", Example, "staticMethod"); + * + * // method (on prototype) + * result = Reflect.deleteMetadata("custom:annotation", Example.prototype, "method"); + * + */ + function deleteMetadata(metadataKey, target, propertyKey) { + if (!IsObject(target)) + throw new TypeError(); + if (!IsUndefined(propertyKey)) + propertyKey = ToPropertyKey(propertyKey); + var metadataMap = GetOrCreateMetadataMap(target, propertyKey, /*Create*/ false); + if (IsUndefined(metadataMap)) + return false; + if (!metadataMap.delete(metadataKey)) + return false; + if (metadataMap.size > 0) + return true; + var targetMetadata = Metadata.get(target); + targetMetadata.delete(propertyKey); + if (targetMetadata.size > 0) + return true; + Metadata.delete(target); + return true; + } + exporter("deleteMetadata", deleteMetadata); + function DecorateConstructor(decorators, target) { + for (var i = decorators.length - 1; i >= 0; --i) { + var decorator = decorators[i]; + var decorated = decorator(target); + if (!IsUndefined(decorated) && !IsNull(decorated)) { + if (!IsConstructor(decorated)) + throw new TypeError(); + target = decorated; + } + } + return target; + } + function DecorateProperty(decorators, target, propertyKey, descriptor) { + for (var i = decorators.length - 1; i >= 0; --i) { + var decorator = decorators[i]; + var decorated = decorator(target, propertyKey, descriptor); + if (!IsUndefined(decorated) && !IsNull(decorated)) { + if (!IsObject(decorated)) + throw new TypeError(); + descriptor = decorated; + } + } + return descriptor; + } + function GetOrCreateMetadataMap(O, P, Create) { + var targetMetadata = Metadata.get(O); + if (IsUndefined(targetMetadata)) { + if (!Create) + return undefined; + targetMetadata = new _Map(); + Metadata.set(O, targetMetadata); + } + var metadataMap = targetMetadata.get(P); + if (IsUndefined(metadataMap)) { + if (!Create) + return undefined; + metadataMap = new _Map(); + targetMetadata.set(P, metadataMap); + } + return metadataMap; + } + // 3.1.1.1 OrdinaryHasMetadata(MetadataKey, O, P) + // https://rbuckton.github.io/reflect-metadata/#ordinaryhasmetadata + function OrdinaryHasMetadata(MetadataKey, O, P) { + var hasOwn = OrdinaryHasOwnMetadata(MetadataKey, O, P); + if (hasOwn) + return true; + var parent = OrdinaryGetPrototypeOf(O); + if (!IsNull(parent)) + return OrdinaryHasMetadata(MetadataKey, parent, P); + return false; + } + // 3.1.2.1 OrdinaryHasOwnMetadata(MetadataKey, O, P) + // https://rbuckton.github.io/reflect-metadata/#ordinaryhasownmetadata + function OrdinaryHasOwnMetadata(MetadataKey, O, P) { + var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false); + if (IsUndefined(metadataMap)) + return false; + return ToBoolean(metadataMap.has(MetadataKey)); + } + // 3.1.3.1 OrdinaryGetMetadata(MetadataKey, O, P) + // https://rbuckton.github.io/reflect-metadata/#ordinarygetmetadata + function OrdinaryGetMetadata(MetadataKey, O, P) { + var hasOwn = OrdinaryHasOwnMetadata(MetadataKey, O, P); + if (hasOwn) + return OrdinaryGetOwnMetadata(MetadataKey, O, P); + var parent = OrdinaryGetPrototypeOf(O); + if (!IsNull(parent)) + return OrdinaryGetMetadata(MetadataKey, parent, P); + return undefined; + } + // 3.1.4.1 OrdinaryGetOwnMetadata(MetadataKey, O, P) + // https://rbuckton.github.io/reflect-metadata/#ordinarygetownmetadata + function OrdinaryGetOwnMetadata(MetadataKey, O, P) { + var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false); + if (IsUndefined(metadataMap)) + return undefined; + return metadataMap.get(MetadataKey); + } + // 3.1.5.1 OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) + // https://rbuckton.github.io/reflect-metadata/#ordinarydefineownmetadata + function OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) { + var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ true); + metadataMap.set(MetadataKey, MetadataValue); + } + // 3.1.6.1 OrdinaryMetadataKeys(O, P) + // https://rbuckton.github.io/reflect-metadata/#ordinarymetadatakeys + function OrdinaryMetadataKeys(O, P) { + var ownKeys = OrdinaryOwnMetadataKeys(O, P); + var parent = OrdinaryGetPrototypeOf(O); + if (parent === null) + return ownKeys; + var parentKeys = OrdinaryMetadataKeys(parent, P); + if (parentKeys.length <= 0) + return ownKeys; + if (ownKeys.length <= 0) + return parentKeys; + var set = new _Set(); + var keys = []; + for (var _i = 0, ownKeys_1 = ownKeys; _i < ownKeys_1.length; _i++) { + var key = ownKeys_1[_i]; + var hasKey = set.has(key); + if (!hasKey) { + set.add(key); + keys.push(key); + } + } + for (var _a = 0, parentKeys_1 = parentKeys; _a < parentKeys_1.length; _a++) { + var key = parentKeys_1[_a]; + var hasKey = set.has(key); + if (!hasKey) { + set.add(key); + keys.push(key); + } + } + return keys; + } + // 3.1.7.1 OrdinaryOwnMetadataKeys(O, P) + // https://rbuckton.github.io/reflect-metadata/#ordinaryownmetadatakeys + function OrdinaryOwnMetadataKeys(O, P) { + var keys = []; + var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false); + if (IsUndefined(metadataMap)) + return keys; + var keysObj = metadataMap.keys(); + var iterator = GetIterator(keysObj); + var k = 0; + while (true) { + var next = IteratorStep(iterator); + if (!next) { + keys.length = k; + return keys; + } + var nextValue = IteratorValue(next); + try { + keys[k] = nextValue; + } + catch (e) { + try { + IteratorClose(iterator); + } + finally { + throw e; + } + } + k++; + } + } + // 6 ECMAScript Data Typ0es and Values + // https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values + function Type(x) { + if (x === null) + return 1 /* Null */; + switch (typeof x) { + case "undefined": return 0 /* Undefined */; + case "boolean": return 2 /* Boolean */; + case "string": return 3 /* String */; + case "symbol": return 4 /* Symbol */; + case "number": return 5 /* Number */; + case "object": return x === null ? 1 /* Null */ : 6 /* Object */; + default: return 6 /* Object */; + } + } + // 6.1.1 The Undefined Type + // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-undefined-type + function IsUndefined(x) { + return x === undefined; + } + // 6.1.2 The Null Type + // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-null-type + function IsNull(x) { + return x === null; + } + // 6.1.5 The Symbol Type + // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-symbol-type + function IsSymbol(x) { + return typeof x === "symbol"; + } + // 6.1.7 The Object Type + // https://tc39.github.io/ecma262/#sec-object-type + function IsObject(x) { + return typeof x === "object" ? x !== null : typeof x === "function"; + } + // 7.1 Type Conversion + // https://tc39.github.io/ecma262/#sec-type-conversion + // 7.1.1 ToPrimitive(input [, PreferredType]) + // https://tc39.github.io/ecma262/#sec-toprimitive + function ToPrimitive(input, PreferredType) { + switch (Type(input)) { + case 0 /* Undefined */: return input; + case 1 /* Null */: return input; + case 2 /* Boolean */: return input; + case 3 /* String */: return input; + case 4 /* Symbol */: return input; + case 5 /* Number */: return input; + } + var hint = PreferredType === 3 /* String */ ? "string" : PreferredType === 5 /* Number */ ? "number" : "default"; + var exoticToPrim = GetMethod(input, toPrimitiveSymbol); + if (exoticToPrim !== undefined) { + var result = exoticToPrim.call(input, hint); + if (IsObject(result)) + throw new TypeError(); + return result; + } + return OrdinaryToPrimitive(input, hint === "default" ? "number" : hint); + } + // 7.1.1.1 OrdinaryToPrimitive(O, hint) + // https://tc39.github.io/ecma262/#sec-ordinarytoprimitive + function OrdinaryToPrimitive(O, hint) { + if (hint === "string") { + var toString_1 = O.toString; + if (IsCallable(toString_1)) { + var result = toString_1.call(O); + if (!IsObject(result)) + return result; + } + var valueOf = O.valueOf; + if (IsCallable(valueOf)) { + var result = valueOf.call(O); + if (!IsObject(result)) + return result; + } + } + else { + var valueOf = O.valueOf; + if (IsCallable(valueOf)) { + var result = valueOf.call(O); + if (!IsObject(result)) + return result; + } + var toString_2 = O.toString; + if (IsCallable(toString_2)) { + var result = toString_2.call(O); + if (!IsObject(result)) + return result; + } + } + throw new TypeError(); + } + // 7.1.2 ToBoolean(argument) + // https://tc39.github.io/ecma262/2016/#sec-toboolean + function ToBoolean(argument) { + return !!argument; + } + // 7.1.12 ToString(argument) + // https://tc39.github.io/ecma262/#sec-tostring + function ToString(argument) { + return "" + argument; + } + // 7.1.14 ToPropertyKey(argument) + // https://tc39.github.io/ecma262/#sec-topropertykey + function ToPropertyKey(argument) { + var key = ToPrimitive(argument, 3 /* String */); + if (IsSymbol(key)) + return key; + return ToString(key); + } + // 7.2 Testing and Comparison Operations + // https://tc39.github.io/ecma262/#sec-testing-and-comparison-operations + // 7.2.2 IsArray(argument) + // https://tc39.github.io/ecma262/#sec-isarray + function IsArray(argument) { + return Array.isArray + ? Array.isArray(argument) + : argument instanceof Object + ? argument instanceof Array + : Object.prototype.toString.call(argument) === "[object Array]"; + } + // 7.2.3 IsCallable(argument) + // https://tc39.github.io/ecma262/#sec-iscallable + function IsCallable(argument) { + // NOTE: This is an approximation as we cannot check for [[Call]] internal method. + return typeof argument === "function"; + } + // 7.2.4 IsConstructor(argument) + // https://tc39.github.io/ecma262/#sec-isconstructor + function IsConstructor(argument) { + // NOTE: This is an approximation as we cannot check for [[Construct]] internal method. + return typeof argument === "function"; + } + // 7.2.7 IsPropertyKey(argument) + // https://tc39.github.io/ecma262/#sec-ispropertykey + function IsPropertyKey(argument) { + switch (Type(argument)) { + case 3 /* String */: return true; + case 4 /* Symbol */: return true; + default: return false; + } + } + // 7.3 Operations on Objects + // https://tc39.github.io/ecma262/#sec-operations-on-objects + // 7.3.9 GetMethod(V, P) + // https://tc39.github.io/ecma262/#sec-getmethod + function GetMethod(V, P) { + var func = V[P]; + if (func === undefined || func === null) + return undefined; + if (!IsCallable(func)) + throw new TypeError(); + return func; + } + // 7.4 Operations on Iterator Objects + // https://tc39.github.io/ecma262/#sec-operations-on-iterator-objects + function GetIterator(obj) { + var method = GetMethod(obj, iteratorSymbol); + if (!IsCallable(method)) + throw new TypeError(); // from Call + var iterator = method.call(obj); + if (!IsObject(iterator)) + throw new TypeError(); + return iterator; + } + // 7.4.4 IteratorValue(iterResult) + // https://tc39.github.io/ecma262/2016/#sec-iteratorvalue + function IteratorValue(iterResult) { + return iterResult.value; + } + // 7.4.5 IteratorStep(iterator) + // https://tc39.github.io/ecma262/#sec-iteratorstep + function IteratorStep(iterator) { + var result = iterator.next(); + return result.done ? false : result; + } + // 7.4.6 IteratorClose(iterator, completion) + // https://tc39.github.io/ecma262/#sec-iteratorclose + function IteratorClose(iterator) { + var f = iterator["return"]; + if (f) + f.call(iterator); + } + // 9.1 Ordinary Object Internal Methods and Internal Slots + // https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots + // 9.1.1.1 OrdinaryGetPrototypeOf(O) + // https://tc39.github.io/ecma262/#sec-ordinarygetprototypeof + function OrdinaryGetPrototypeOf(O) { + var proto = Object.getPrototypeOf(O); + if (typeof O !== "function" || O === functionPrototype) + return proto; + // TypeScript doesn't set __proto__ in ES5, as it's non-standard. + // Try to determine the superclass constructor. Compatible implementations + // must either set __proto__ on a subclass constructor to the superclass constructor, + // or ensure each class has a valid `constructor` property on its prototype that + // points back to the constructor. + // If this is not the same as Function.[[Prototype]], then this is definately inherited. + // This is the case when in ES6 or when using __proto__ in a compatible browser. + if (proto !== functionPrototype) + return proto; + // If the super prototype is Object.prototype, null, or undefined, then we cannot determine the heritage. + var prototype = O.prototype; + var prototypeProto = prototype && Object.getPrototypeOf(prototype); + if (prototypeProto == null || prototypeProto === Object.prototype) + return proto; + // If the constructor was not a function, then we cannot determine the heritage. + var constructor = prototypeProto.constructor; + if (typeof constructor !== "function") + return proto; + // If we have some kind of self-reference, then we cannot determine the heritage. + if (constructor === O) + return proto; + // we have a pretty good guess at the heritage. + return constructor; + } + // naive Map shim + function CreateMapPolyfill() { + var cacheSentinel = {}; + var arraySentinel = []; + var MapIterator = /** @class */ (function () { + function MapIterator(keys, values, selector) { + this._index = 0; + this._keys = keys; + this._values = values; + this._selector = selector; + } + MapIterator.prototype["@@iterator"] = function () { return this; }; + MapIterator.prototype[iteratorSymbol] = function () { return this; }; + MapIterator.prototype.next = function () { + var index = this._index; + if (index >= 0 && index < this._keys.length) { + var result = this._selector(this._keys[index], this._values[index]); + if (index + 1 >= this._keys.length) { + this._index = -1; + this._keys = arraySentinel; + this._values = arraySentinel; + } + else { + this._index++; + } + return { value: result, done: false }; + } + return { value: undefined, done: true }; + }; + MapIterator.prototype.throw = function (error) { + if (this._index >= 0) { + this._index = -1; + this._keys = arraySentinel; + this._values = arraySentinel; + } + throw error; + }; + MapIterator.prototype.return = function (value) { + if (this._index >= 0) { + this._index = -1; + this._keys = arraySentinel; + this._values = arraySentinel; + } + return { value: value, done: true }; + }; + return MapIterator; + }()); + return /** @class */ (function () { + function Map() { + this._keys = []; + this._values = []; + this._cacheKey = cacheSentinel; + this._cacheIndex = -2; + } + Object.defineProperty(Map.prototype, "size", { + get: function () { return this._keys.length; }, + enumerable: true, + configurable: true + }); + Map.prototype.has = function (key) { return this._find(key, /*insert*/ false) >= 0; }; + Map.prototype.get = function (key) { + var index = this._find(key, /*insert*/ false); + return index >= 0 ? this._values[index] : undefined; + }; + Map.prototype.set = function (key, value) { + var index = this._find(key, /*insert*/ true); + this._values[index] = value; + return this; + }; + Map.prototype.delete = function (key) { + var index = this._find(key, /*insert*/ false); + if (index >= 0) { + var size = this._keys.length; + for (var i = index + 1; i < size; i++) { + this._keys[i - 1] = this._keys[i]; + this._values[i - 1] = this._values[i]; + } + this._keys.length--; + this._values.length--; + if (key === this._cacheKey) { + this._cacheKey = cacheSentinel; + this._cacheIndex = -2; + } + return true; + } + return false; + }; + Map.prototype.clear = function () { + this._keys.length = 0; + this._values.length = 0; + this._cacheKey = cacheSentinel; + this._cacheIndex = -2; + }; + Map.prototype.keys = function () { return new MapIterator(this._keys, this._values, getKey); }; + Map.prototype.values = function () { return new MapIterator(this._keys, this._values, getValue); }; + Map.prototype.entries = function () { return new MapIterator(this._keys, this._values, getEntry); }; + Map.prototype["@@iterator"] = function () { return this.entries(); }; + Map.prototype[iteratorSymbol] = function () { return this.entries(); }; + Map.prototype._find = function (key, insert) { + if (this._cacheKey !== key) { + this._cacheIndex = this._keys.indexOf(this._cacheKey = key); + } + if (this._cacheIndex < 0 && insert) { + this._cacheIndex = this._keys.length; + this._keys.push(key); + this._values.push(undefined); + } + return this._cacheIndex; + }; + return Map; + }()); + function getKey(key, _) { + return key; + } + function getValue(_, value) { + return value; + } + function getEntry(key, value) { + return [key, value]; + } + } + // naive Set shim + function CreateSetPolyfill() { + return /** @class */ (function () { + function Set() { + this._map = new _Map(); + } + Object.defineProperty(Set.prototype, "size", { + get: function () { return this._map.size; }, + enumerable: true, + configurable: true + }); + Set.prototype.has = function (value) { return this._map.has(value); }; + Set.prototype.add = function (value) { return this._map.set(value, value), this; }; + Set.prototype.delete = function (value) { return this._map.delete(value); }; + Set.prototype.clear = function () { this._map.clear(); }; + Set.prototype.keys = function () { return this._map.keys(); }; + Set.prototype.values = function () { return this._map.values(); }; + Set.prototype.entries = function () { return this._map.entries(); }; + Set.prototype["@@iterator"] = function () { return this.keys(); }; + Set.prototype[iteratorSymbol] = function () { return this.keys(); }; + return Set; + }()); + } + // naive WeakMap shim + function CreateWeakMapPolyfill() { + var UUID_SIZE = 16; + var keys = HashMap.create(); + var rootKey = CreateUniqueKey(); + return /** @class */ (function () { + function WeakMap() { + this._key = CreateUniqueKey(); + } + WeakMap.prototype.has = function (target) { + var table = GetOrCreateWeakMapTable(target, /*create*/ false); + return table !== undefined ? HashMap.has(table, this._key) : false; + }; + WeakMap.prototype.get = function (target) { + var table = GetOrCreateWeakMapTable(target, /*create*/ false); + return table !== undefined ? HashMap.get(table, this._key) : undefined; + }; + WeakMap.prototype.set = function (target, value) { + var table = GetOrCreateWeakMapTable(target, /*create*/ true); + table[this._key] = value; + return this; + }; + WeakMap.prototype.delete = function (target) { + var table = GetOrCreateWeakMapTable(target, /*create*/ false); + return table !== undefined ? delete table[this._key] : false; + }; + WeakMap.prototype.clear = function () { + // NOTE: not a real clear, just makes the previous data unreachable + this._key = CreateUniqueKey(); + }; + return WeakMap; + }()); + function CreateUniqueKey() { + var key; + do + key = "@@WeakMap@@" + CreateUUID(); + while (HashMap.has(keys, key)); + keys[key] = true; + return key; + } + function GetOrCreateWeakMapTable(target, create) { + if (!hasOwn.call(target, rootKey)) { + if (!create) + return undefined; + Object.defineProperty(target, rootKey, { value: HashMap.create() }); + } + return target[rootKey]; + } + function FillRandomBytes(buffer, size) { + for (var i = 0; i < size; ++i) + buffer[i] = Math.random() * 0xff | 0; + return buffer; + } + function GenRandomBytes(size) { + if (typeof Uint8Array === "function") { + if (typeof crypto !== "undefined") + return crypto.getRandomValues(new Uint8Array(size)); + if (typeof msCrypto !== "undefined") + return msCrypto.getRandomValues(new Uint8Array(size)); + return FillRandomBytes(new Uint8Array(size), size); + } + return FillRandomBytes(new Array(size), size); + } + function CreateUUID() { + var data = GenRandomBytes(UUID_SIZE); + // mark as random - RFC 4122 § 4.4 + data[6] = data[6] & 0x4f | 0x40; + data[8] = data[8] & 0xbf | 0x80; + var result = ""; + for (var offset = 0; offset < UUID_SIZE; ++offset) { + var byte = data[offset]; + if (offset === 4 || offset === 6 || offset === 8) + result += "-"; + if (byte < 16) + result += "0"; + result += byte.toString(16).toLowerCase(); + } + return result; + } + } + // uses a heuristic used by v8 and chakra to force an object into dictionary mode. + function MakeDictionary(obj) { + obj.__ = undefined; + delete obj.__; + return obj; + } + }); + })(Reflect$1 || (Reflect$1 = {})); + + /* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + function hookBeforeNativeCall(context) { + if (context) { + Reflect.defineMetadata('__doric_context__', context, global$1); + context.hookBeforeNativeCall(); + } + } + function hookAfterNativeCall(context) { + if (context) { + context.hookAfterNativeCall(); + } + } + function getContext() { + return Reflect.getMetadata('__doric_context__', global$1); + } + function setContext(context) { + Reflect.defineMetadata('__doric_context__', context, global$1); + } + function jsCallResolve(contextId, callbackId, args) { + const context = gContexts.get(contextId); + if (context === undefined) { + loge(`Cannot find context for context id:${contextId}`); + return; + } + const callback = context.callbacks.get(callbackId); + if (callback === undefined) { + loge(`Cannot find call for context id:${contextId},callback id:${callbackId}`); + return; + } + const argumentsList = []; + for (let i = 2; i < arguments.length; i++) { + argumentsList.push(arguments[i]); + } + hookBeforeNativeCall(context); + Reflect.apply(callback.resolve, context, argumentsList); + hookAfterNativeCall(context); + } + function jsCallReject(contextId, callbackId, args) { + const context = gContexts.get(contextId); + if (context === undefined) { + loge(`Cannot find context for context id:${contextId}`); + return; + } + const callback = context.callbacks.get(callbackId); + if (callback === undefined) { + loge(`Cannot find call for context id:${contextId},callback id:${callbackId}`); + return; + } + const argumentsList = []; + for (let i = 2; i < arguments.length; i++) { + argumentsList.push(arguments[i]); + } + hookBeforeNativeCall(context); + Reflect.apply(callback.reject, context.entity, argumentsList); + hookAfterNativeCall(context); + } + class Context { + constructor(id) { + this.callbacks = new Map; + this.id = id; + return new Proxy(this, { + get: (target, p) => { + if (Reflect.has(target, p)) { + return Reflect.get(target, p); + } + else { + const namespace = p; + return new Proxy({}, { + get: (target, p) => { + if (Reflect.has(target, p)) { + return Reflect.get(target, p); + } + else { + const context = this; + return function () { + const args = []; + args.push(namespace); + args.push(p); + for (let arg of arguments) { + args.push(arg); + } + return Reflect.apply(context.callNative, context, args); + }; + } + } + }); + } + } + }); + } + hookBeforeNativeCall() { + if (this.entity && Reflect.has(this.entity, 'hookBeforeNativeCall')) { + Reflect.apply(Reflect.get(this.entity, 'hookBeforeNativeCall'), this.entity, []); + } + } + hookAfterNativeCall() { + if (this.entity && Reflect.has(this.entity, 'hookAfterNativeCall')) { + Reflect.apply(Reflect.get(this.entity, 'hookAfterNativeCall'), this.entity, []); + } + } + callNative(namespace, method, args) { + const callbackId = uniqueId('callback'); + nativeBridge(this.id, namespace, method, callbackId, args); + return new Promise((resolve, reject) => { + this.callbacks.set(callbackId, { + resolve, + reject, + }); + }); + } + register(instance) { + this.entity = instance; + } + } + const gContexts = new Map; + const gModules = new Map; + function jsObtainContext(id) { + if (gContexts.has(id)) { + const context = gContexts.get(id); + setContext(context); + return context; + } + else { + const context = new Context(id); + gContexts.set(id, context); + setContext(context); + return context; + } + } + function jsReleaseContext(id) { + const context = gContexts.get(id); + const args = arguments; + if (context) { + timerInfos.forEach((v, k) => { + if (v.context === context) { + if (global$1.nativeClearTimer === undefined) { + return Reflect.apply(_clearTimeout, undefined, args); + } + timerInfos.delete(k); + nativeClearTimer(k); + } + }); + } + gContexts.delete(id); + } + function __require__(name) { + if (gModules.has(name)) { + return gModules.get(name); + } + else { + if (nativeRequire(name)) { + return gModules.get(name); + } + else { + return undefined; + } + } + } + function jsRegisterModule(name, moduleObject) { + gModules.set(name, moduleObject); + } + function jsCallEntityMethod(contextId, methodName, args) { + const context = gContexts.get(contextId); + if (context === undefined) { + loge(`Cannot find context for context id:${contextId}`); + return; + } + if (context.entity === undefined) { + loge(`Cannot find holder for context id:${contextId}`); + return; + } + if (Reflect.has(context.entity, methodName)) { + const argumentsList = []; + for (let i = 2; i < arguments.length; i++) { + argumentsList.push(arguments[i]); + } + hookBeforeNativeCall(context); + const ret = Reflect.apply(Reflect.get(context.entity, methodName), context.entity, argumentsList); + hookAfterNativeCall(context); + return ret; + } + else { + loge(`Cannot find method for context id:${contextId},method name is:${methodName}`); + } + } + function jsObtainEntry(contextId) { + const context = jsObtainContext(contextId); + return (constructor) => { + const ret = class extends constructor { + constructor() { + super(...arguments); + this.context = context; + } + }; + if (context) { + context.register(new ret); + } + return ret; + }; + } + const global$1 = Function('return this')(); + let __timerId__ = 0; + const timerInfos = new Map; + const _setTimeout = global$1.setTimeout; + const _setInterval = global$1.setInterval; + const _clearTimeout = global$1.clearTimeout; + const _clearInterval = global$1.clearInterval; + const doricSetTimeout = function (handler, timeout, ...args) { + if (global$1.nativeSetTimer === undefined) { + return Reflect.apply(_setTimeout, undefined, arguments); + } + const id = __timerId__++; + timerInfos.set(id, { + callback: () => { + Reflect.apply(handler, undefined, args); + timerInfos.delete(id); + }, + context: getContext(), + }); + nativeSetTimer(id, timeout || 0, false); + return id; + }; + const doricSetInterval = function (handler, timeout, ...args) { + if (global$1.nativeSetTimer === undefined) { + return Reflect.apply(_setInterval, undefined, arguments); + } + const id = __timerId__++; + timerInfos.set(id, { + callback: () => { + Reflect.apply(handler, undefined, args); + }, + context: getContext(), + }); + nativeSetTimer(id, timeout || 0, true); + return id; + }; + const doricClearTimeout = function (timerId) { + if (global$1.nativeClearTimer === undefined) { + return Reflect.apply(_clearTimeout, undefined, arguments); + } + timerInfos.delete(timerId); + nativeClearTimer(timerId); + }; + const doricClearInterval = function (timerId) { + if (global$1.nativeClearTimer === undefined) { + return Reflect.apply(_clearInterval, undefined, arguments); + } + timerInfos.delete(timerId); + nativeClearTimer(timerId); + }; + if (!global$1.setTimeout) { + global$1.setTimeout = doricSetTimeout; + } + else { + global$1.doricSetTimeout = doricSetTimeout; + } + if (!global$1.setInterval) { + global$1.setInterval = doricSetInterval; + } + else { + global$1.doricSetInterval = doricSetInterval; + } + if (!global$1.clearTimeout) { + global$1.clearTimeout = doricClearTimeout; + } + else { + global$1.doricClearTimeout = doricClearTimeout; + } + if (!global$1.clearInterval) { + global$1.clearInterval = doricClearInterval; + } + else { + global$1.doricClearInterval = doricClearInterval; + } + function jsCallbackTimer(timerId) { + const timerInfo = timerInfos.get(timerId); + if (timerInfo === undefined) { + return; + } + if (timerInfo.callback instanceof Function) { + hookBeforeNativeCall(timerInfo.context); + Reflect.apply(timerInfo.callback, timerInfo.context, []); + hookAfterNativeCall(timerInfo.context); + } + } + + exports.Context = Context; + exports.__require__ = __require__; + exports.jsCallEntityMethod = jsCallEntityMethod; + exports.jsCallReject = jsCallReject; + exports.jsCallResolve = jsCallResolve; + exports.jsCallbackTimer = jsCallbackTimer; + exports.jsObtainContext = jsObtainContext; + exports.jsObtainEntry = jsObtainEntry; + exports.jsRegisterModule = jsRegisterModule; + exports.jsReleaseContext = jsReleaseContext; + + return exports; + +}({})); + +/**--------SandBox--------*/ + +/**++++++++Lib++++++++*/ +Reflect.apply(doric.jsRegisterModule,this,["doric",Reflect.apply(function(__module){(function(module,exports,require){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function obj2Model(obj) { + if (obj instanceof Array) { + return obj.map(e => obj2Model(e)); + } + else if (obj instanceof Object) { + if (Reflect.has(obj, 'toModel') && Reflect.get(obj, 'toModel') instanceof Function) { + obj = Reflect.apply(Reflect.get(obj, 'toModel'), obj, []); + return obj; + } + else { + for (let key in obj) { + const val = Reflect.get(obj, key); + Reflect.set(obj, key, obj2Model(val)); + } + return obj; + } + } + else { + return obj; + } +} +class Mutable { + constructor(v) { + this.binders = new Set; + this.get = () => { + return this.val; + }; + this.set = (v) => { + this.val = v; + this.binders.forEach(e => { + Reflect.apply(e, undefined, [this.val]); + }); + }; + this.val = v; + } + bind(binder) { + this.binders.add(binder); + Reflect.apply(binder, undefined, [this.val]); + } + static of(v) { + return new Mutable(v); + } +} + +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +let __uniqueId__ = 0; +function uniqueId(prefix) { + return `__${prefix}_${__uniqueId__++}__`; +} + +function toString(message) { + if (message instanceof Function) { + return message.toString(); + } + else if (message instanceof Object) { + try { + return JSON.stringify(message); + } + catch (e) { + return message.toString(); + } + } + else if (message === undefined) { + return "undefined"; + } + else { + return message.toString(); + } +} +function log(...args) { + let out = ""; + for (let i = 0; i < arguments.length; i++) { + if (i > 0) { + out += ','; + } + out += toString(arguments[i]); + } + nativeLog('d', out); +} +function loge(...message) { + let out = ""; + for (let i = 0; i < arguments.length; i++) { + if (i > 0) { + out += ','; + } + out += toString(arguments[i]); + } + nativeLog('e', out); +} +function logw(...message) { + let out = ""; + for (let i = 0; i < arguments.length; i++) { + if (i > 0) { + out += ','; + } + out += toString(arguments[i]); + } + nativeLog('w', out); +} + +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +function Property(target, propKey) { + Reflect.defineMetadata(propKey, true, target); +} +class View { + constructor() { + this.width = 0; + this.height = 0; + this.x = 0; + this.y = 0; + this.viewId = uniqueId('ViewId'); + this.callbacks = new Map; + /** Anchor end*/ + this.__dirty_props__ = {}; + this.nativeViewModel = { + id: this.viewId, + type: this.constructor.name, + props: this.__dirty_props__, + }; + return new Proxy(this, { + get: (target, p, receiver) => { + return Reflect.get(target, p, receiver); + }, + set: (target, p, v, receiver) => { + const oldV = Reflect.get(target, p, receiver); + const ret = Reflect.set(target, p, v, receiver); + if (Reflect.getMetadata(p, target) && oldV !== v) { + receiver.onPropertyChanged(p.toString(), oldV, v); + } + return ret; + } + }); + } + callback2Id(f) { + const id = uniqueId('Function'); + this.callbacks.set(id, f); + return id; + } + id2Callback(id) { + let f = this.callbacks.get(id); + if (f === undefined) { + f = Reflect.get(this, id); + } + return f; + } + /** Anchor start*/ + get left() { + return this.x; + } + set left(v) { + this.x = v; + } + get right() { + return this.x + this.width; + } + set right(v) { + this.x = v - this.width; + } + get top() { + return this.y; + } + set top(v) { + this.y = v; + } + get bottom() { + return this.y + this.height; + } + set bottom(v) { + this.y = v - this.height; + } + get centerX() { + return this.x + this.width / 2; + } + get centerY() { + return this.y + this.height / 2; + } + set centerX(v) { + this.x = v - this.width / 2; + } + set centerY(v) { + this.y = v - this.height / 2; + } + get dirtyProps() { + return this.__dirty_props__; + } + onPropertyChanged(propKey, oldV, newV) { + if (newV instanceof Function) { + newV = this.callback2Id(newV); + } + else { + newV = obj2Model(newV); + } + this.__dirty_props__[propKey] = newV; + } + clean() { + for (const key in this.__dirty_props__) { + if (Reflect.has(this.__dirty_props__, key)) { + Reflect.deleteProperty(this.__dirty_props__, key); + } + } + } + isDirty() { + return Reflect.ownKeys(this.__dirty_props__).length !== 0; + } + responseCallback(id, ...args) { + const f = this.id2Callback(id); + if (f instanceof Function) { + const argumentsList = []; + for (let i = 1; i < arguments.length; i++) { + argumentsList.push(arguments[i]); + } + return Reflect.apply(f, this, argumentsList); + } + else { + loge(`Cannot find callback:${id} for ${JSON.stringify(this.toModel())}`); + } + } + toModel() { + return this.nativeViewModel; + } + let(block) { + block(this); + } + also(block) { + block(this); + return this; + } + apply(config) { + for (let key in config) { + Reflect.set(this, key, Reflect.get(config, key, config), this); + } + return this; + } + in(group) { + group.addChild(this); + return this; + } + nativeChannel(context, name) { + let thisView = this; + return function (args = undefined) { + const func = context.shader.command; + const viewIds = []; + while (thisView != undefined) { + viewIds.push(thisView.viewId); + thisView = thisView.superview; + } + const params = { + viewIds: viewIds.reverse(), + name, + args, + }; + return Reflect.apply(func, undefined, [params]); + }; + } + getWidth(context) { + return this.nativeChannel(context, 'getWidth')(); + } + getHeight(context) { + return this.nativeChannel(context, 'getHeight')(); + } + getLocationOnScreen(context) { + return this.nativeChannel(context, "getLocationOnScreen")(); + } + /**----------transform----------*/ + doAnimation(context, animation) { + return this.nativeChannel(context, "doAnimation")(animation.toModel()).then((args) => { + for (let key in args) { + Reflect.set(this, key, Reflect.get(args, key, args), this); + Reflect.deleteProperty(this.__dirty_props__, key); + } + }); + } +} +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "width", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "height", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "x", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "y", void 0); +__decorate([ + Property, + __metadata("design:type", Object) +], View.prototype, "backgroundColor", void 0); +__decorate([ + Property, + __metadata("design:type", Object) +], View.prototype, "corners", void 0); +__decorate([ + Property, + __metadata("design:type", Object) +], View.prototype, "border", void 0); +__decorate([ + Property, + __metadata("design:type", Object) +], View.prototype, "shadow", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "alpha", void 0); +__decorate([ + Property, + __metadata("design:type", Boolean) +], View.prototype, "hidden", void 0); +__decorate([ + Property, + __metadata("design:type", Object) +], View.prototype, "viewId", void 0); +__decorate([ + Property, + __metadata("design:type", Object) +], View.prototype, "padding", void 0); +__decorate([ + Property, + __metadata("design:type", Object) +], View.prototype, "layoutConfig", void 0); +__decorate([ + Property, + __metadata("design:type", Function) +], View.prototype, "onClick", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "translationX", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "translationY", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "scaleX", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "scaleY", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "pivotX", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "pivotY", void 0); +__decorate([ + Property, + __metadata("design:type", Number) +], View.prototype, "rotation", void 0); +class Superview extends View { + subviewById(id) { + for (let v of this.allSubviews()) { + if (v.viewId === id) { + return v; + } + } + } + isDirty() { + if (super.isDirty()) { + return true; + } + else { + for (const v of this.allSubviews()) { + if (v.isDirty()) { + return true; + } + } + } + return false; + } + clean() { + for (let v of this.allSubviews()) { + v.clean(); + } + super.clean(); + } + toModel() { + const subviews = []; + for (let v of this.allSubviews()) { + if (v != undefined) { + v.superview = this; + if (v.isDirty()) { + subviews.push(v.toModel()); + } + } + } + this.dirtyProps.subviews = subviews; + return super.toModel(); + } +} +class Group extends Superview { + constructor() { + super(...arguments); + this.children = new Proxy([], { + set: (target, index, value) => { + const ret = Reflect.set(target, index, value); + // Let getDirty return true + this.dirtyProps.children = this.children.map(e => e.viewId); + return ret; + } + }); + } + allSubviews() { + return this.children; + } + addChild(view) { + this.children.push(view); + } +} + +const SPECIFIED = 1; +const START = 1 << 1; +const END = 1 << 2; +const SHIFT_X = 0; +const SHIFT_Y = 4; +const LEFT = (START | SPECIFIED) << SHIFT_X; +const RIGHT = (END | SPECIFIED) << SHIFT_X; +const TOP = (START | SPECIFIED) << SHIFT_Y; +const BOTTOM = (END | SPECIFIED) << SHIFT_Y; +const CENTER_X = SPECIFIED << SHIFT_X; +const CENTER_Y = SPECIFIED << SHIFT_Y; +const CENTER = CENTER_X | CENTER_Y; +class Gravity { + constructor() { + this.val = 0; + } + left() { + const val = this.val | LEFT; + const ret = new Gravity; + ret.val = val; + return ret; + } + right() { + const val = this.val | RIGHT; + const ret = new Gravity; + ret.val = val; + return ret; + } + top() { + const val = this.val | TOP; + const ret = new Gravity; + ret.val = val; + return ret; + } + bottom() { + const val = this.val | BOTTOM; + const ret = new Gravity; + ret.val = val; + return ret; + } + center() { + const val = this.val | CENTER; + const ret = new Gravity; + ret.val = val; + return ret; + } + centerX() { + const val = this.val | CENTER_X; + const ret = new Gravity; + ret.val = val; + return ret; + } + centerY() { + const val = this.val | CENTER_Y; + const ret = new Gravity; + ret.val = val; + return ret; + } + toModel() { + return this.val; + } +} +Gravity.origin = new Gravity; +Gravity.Center = Gravity.origin.center(); +Gravity.Left = Gravity.origin.left(); +Gravity.Right = Gravity.origin.right(); +Gravity.Top = Gravity.origin.top(); +Gravity.Bottom = Gravity.origin.bottom(); +function gravity() { + return new Gravity; +} + +(function (LayoutSpec) { + /** + * Depends on what's been set on width or height. + */ + LayoutSpec[LayoutSpec["JUST"] = 0] = "JUST"; + /** + * Depends on it's content. + */ + LayoutSpec[LayoutSpec["FIT"] = 1] = "FIT"; + /** + * Extend as much as parent let it take. + */ + LayoutSpec[LayoutSpec["MOST"] = 2] = "MOST"; +})(exports.LayoutSpec || (exports.LayoutSpec = {})); +class LayoutConfigImpl { + fit() { + this.widthSpec = exports.LayoutSpec.FIT; + this.heightSpec = exports.LayoutSpec.FIT; + return this; + } + most() { + this.widthSpec = exports.LayoutSpec.MOST; + this.heightSpec = exports.LayoutSpec.MOST; + return this; + } + just() { + this.widthSpec = exports.LayoutSpec.JUST; + this.heightSpec = exports.LayoutSpec.JUST; + return this; + } + configWidth(w) { + this.widthSpec = w; + return this; + } + configHeight(h) { + this.heightSpec = h; + return this; + } + configMargin(m) { + this.margin = m; + return this; + } + configAligmnet(a) { + this.alignment = a; + return this; + } + configWeight(w) { + this.weight = w; + return this; + } + toModel() { + return { + widthSpec: this.widthSpec, + heightSpec: this.heightSpec, + margin: this.margin, + alignment: this.alignment ? this.alignment.toModel() : undefined, + weight: this.weight, + }; + } +} +function layoutConfig() { + return new LayoutConfigImpl; +} + +var __decorate$1 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$1 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Stack extends Group { +} +class Root extends Stack { +} +class LinearLayout extends Group { +} +__decorate$1([ + Property, + __metadata$1("design:type", Number) +], LinearLayout.prototype, "space", void 0); +__decorate$1([ + Property, + __metadata$1("design:type", Gravity) +], LinearLayout.prototype, "gravity", void 0); +class VLayout extends LinearLayout { +} +class HLayout extends LinearLayout { +} +function stack(views) { + const ret = new Stack; + ret.layoutConfig = layoutConfig().fit(); + for (let v of views) { + ret.addChild(v); + } + return ret; +} +function hlayout(views) { + const ret = new HLayout; + ret.layoutConfig = layoutConfig().fit(); + for (let v of views) { + ret.addChild(v); + } + return ret; +} +function vlayout(views) { + const ret = new VLayout; + ret.layoutConfig = layoutConfig().fit(); + for (let v of views) { + ret.addChild(v); + } + return ret; +} + +var __decorate$2 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$2 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +function NativeCall(target, propertyKey, descriptor) { + const originVal = descriptor.value; + descriptor.value = function () { + const ret = Reflect.apply(originVal, this, arguments); + return ret; + }; + return descriptor; +} +class Panel { + constructor() { + this.__root__ = new Root; + this.headviews = new Map; + } + onCreate() { } + onDestroy() { } + onShow() { } + onHidden() { } + addHeadView(v) { + this.headviews.set(v.viewId, v); + } + allHeadViews() { + return this.headviews.values(); + } + removeHeadView(v) { + if (v instanceof View) { + this.headviews.delete(v.viewId); + } + else { + this.headviews.delete(v); + } + } + clearHeadViews() { + this.headviews.clear(); + } + getRootView() { + return this.__root__; + } + getInitData() { + return this.__data__; + } + __init__(frame, data) { + if (data) { + this.__data__ = JSON.parse(data); + } + this.__root__.width = frame.width; + this.__root__.height = frame.height; + this.__root__.children.length = 0; + this.build(this.__root__); + } + __onCreate__() { + this.onCreate(); + } + __onDestroy__() { + this.onDestroy(); + } + __onShow__() { + this.onShow(); + } + __onHidden__() { + this.onHidden(); + } + __build__() { + this.build(this.__root__); + } + __response__(viewIds, callbackId) { + const v = this.retrospectView(viewIds); + if (v === undefined) { + loge(`Cannot find view for ${viewIds}`); + } + else { + const argumentsList = [callbackId]; + for (let i = 2; i < arguments.length; i++) { + argumentsList.push(arguments[i]); + } + return Reflect.apply(v.responseCallback, v, argumentsList); + } + } + retrospectView(ids) { + return ids.reduce((acc, cur) => { + if (acc === undefined) { + if (cur === this.__root__.viewId) { + return this.__root__; + } + return this.headviews.get(cur); + } + else { + if (Reflect.has(acc, "subviewById")) { + return Reflect.apply(Reflect.get(acc, "subviewById"), acc, [cur]); + } + return acc; + } + }, undefined); + } + nativeRender(model) { + if (this.context) { + this.context.shader.render(model); + } + } + hookBeforeNativeCall() { + this.__root__.clean(); + for (let v of this.headviews.values()) { + v.clean(); + } + } + hookAfterNativeCall() { + //Here insert a native call to ensure the promise is resolved done. + nativeEmpty(); + if (this.__root__.isDirty()) { + const model = this.__root__.toModel(); + this.nativeRender(model); + } + for (let v of this.headviews.values()) { + if (v.isDirty()) { + const model = v.toModel(); + this.nativeRender(model); + } + } + } +} +__decorate$2([ + NativeCall, + __metadata$2("design:type", Function), + __metadata$2("design:paramtypes", [Object, String]), + __metadata$2("design:returntype", void 0) +], Panel.prototype, "__init__", null); +__decorate$2([ + NativeCall, + __metadata$2("design:type", Function), + __metadata$2("design:paramtypes", []), + __metadata$2("design:returntype", void 0) +], Panel.prototype, "__onCreate__", null); +__decorate$2([ + NativeCall, + __metadata$2("design:type", Function), + __metadata$2("design:paramtypes", []), + __metadata$2("design:returntype", void 0) +], Panel.prototype, "__onDestroy__", null); +__decorate$2([ + NativeCall, + __metadata$2("design:type", Function), + __metadata$2("design:paramtypes", []), + __metadata$2("design:returntype", void 0) +], Panel.prototype, "__onShow__", null); +__decorate$2([ + NativeCall, + __metadata$2("design:type", Function), + __metadata$2("design:paramtypes", []), + __metadata$2("design:returntype", void 0) +], Panel.prototype, "__onHidden__", null); +__decorate$2([ + NativeCall, + __metadata$2("design:type", Function), + __metadata$2("design:paramtypes", []), + __metadata$2("design:returntype", void 0) +], Panel.prototype, "__build__", null); +__decorate$2([ + NativeCall, + __metadata$2("design:type", Function), + __metadata$2("design:paramtypes", [Array, String]), + __metadata$2("design:returntype", void 0) +], Panel.prototype, "__response__", null); + +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +(function (RepeatMode) { + RepeatMode[RepeatMode["RESTART"] = 1] = "RESTART"; + RepeatMode[RepeatMode["REVERSE"] = 2] = "REVERSE"; +})(exports.RepeatMode || (exports.RepeatMode = {})); +(function (FillMode) { + /** + * The receiver is removed from the presentation when the animation is completed. + */ + FillMode[FillMode["Removed"] = 0] = "Removed"; + /** + * The receiver remains visible in its final state when the animation is completed. + */ + FillMode[FillMode["Forward"] = 1] = "Forward"; + /** + * The receiver clamps values before zero to zero when the animation is completed. + */ + FillMode[FillMode["Backward"] = 2] = "Backward"; + /** + * The receiver clamps values at both ends of the object’s time space + */ + FillMode[FillMode["Both"] = 3] = "Both"; +})(exports.FillMode || (exports.FillMode = {})); +(function (TimingFunction) { + /** + * The system default timing function. Use this function to ensure that the timing of your animations matches that of most system animations. + */ + TimingFunction[TimingFunction["Default"] = 0] = "Default"; + /** + * Linear pacing, which causes an animation to occur evenly over its duration. + */ + TimingFunction[TimingFunction["Linear"] = 1] = "Linear"; + /** + * Ease-in pacing, which causes an animation to begin slowly and then speed up as it progresses. + */ + TimingFunction[TimingFunction["EaseIn"] = 2] = "EaseIn"; + /** + * Ease-out pacing, which causes an animation to begin quickly and then slow as it progresses. + */ + TimingFunction[TimingFunction["EaseOut"] = 3] = "EaseOut"; + /** + * Ease-in-ease-out pacing, which causes an animation to begin slowly, accelerate through the middle of its duration, and then slow again before completing. + */ + TimingFunction[TimingFunction["EaseInEaseOut"] = 4] = "EaseInEaseOut"; +})(exports.TimingFunction || (exports.TimingFunction = {})); +class Animation { + constructor() { + this.changeables = new Map; + this.duration = 0; + this.fillMode = exports.FillMode.Forward; + } + toModel() { + const changeables = []; + for (let e of this.changeables.values()) { + changeables.push({ + key: e.key, + fromValue: e.fromValue, + toValue: e.toValue, + }); + } + return { + type: this.constructor.name, + delay: this.delay, + duration: this.duration, + changeables, + repeatCount: this.repeatCount, + repeatMode: this.repeatMode, + fillMode: this.fillMode, + timingFunction: this.timingFunction + }; + } +} +class ScaleAnimation extends Animation { + constructor() { + super(); + this.scaleXChangeable = { + key: "scaleX", + fromValue: 1, + toValue: 1, + }; + this.scaleYChangeable = { + key: "scaleY", + fromValue: 1, + toValue: 1, + }; + this.changeables.set("scaleX", this.scaleXChangeable); + this.changeables.set("scaleY", this.scaleYChangeable); + } + set fromScaleX(v) { + this.scaleXChangeable.fromValue = v; + } + get fromScaleX() { + return this.scaleXChangeable.fromValue; + } + set toScaleX(v) { + this.scaleXChangeable.toValue = v; + } + get toScaleX() { + return this.scaleXChangeable.toValue; + } + set fromScaleY(v) { + this.scaleYChangeable.fromValue = v; + } + get fromScaleY() { + return this.scaleYChangeable.fromValue; + } + set toScaleY(v) { + this.scaleYChangeable.toValue = v; + } + get toScaleY() { + return this.scaleYChangeable.toValue; + } +} +class TranslationAnimation extends Animation { + constructor() { + super(); + this.translationXChangeable = { + key: "translationX", + fromValue: 1, + toValue: 1, + }; + this.translationYChangeable = { + key: "translationY", + fromValue: 1, + toValue: 1, + }; + this.changeables.set("translationX", this.translationXChangeable); + this.changeables.set("translationY", this.translationYChangeable); + } + set fromTranslationX(v) { + this.translationXChangeable.fromValue = v; + } + get fromTranslationX() { + return this.translationXChangeable.fromValue; + } + set toTranslationX(v) { + this.translationXChangeable.toValue = v; + } + get toTranslationX() { + return this.translationXChangeable.toValue; + } + set fromTranslationY(v) { + this.translationYChangeable.fromValue = v; + } + get fromTranslationY() { + return this.translationYChangeable.fromValue; + } + set toTranslationY(v) { + this.translationYChangeable.toValue = v; + } + get toTranslationY() { + return this.translationYChangeable.toValue; + } +} +class RotationAnimation extends Animation { + constructor() { + super(); + this.rotationChaneable = { + key: "rotation", + fromValue: 1, + toValue: 1, + }; + this.changeables.set("rotation", this.rotationChaneable); + } + set fromRotation(v) { + this.rotationChaneable.fromValue = v; + } + get fromRotation() { + return this.rotationChaneable.fromValue; + } + set toRotation(v) { + this.rotationChaneable.toValue = v; + } + get toRotation() { + return this.rotationChaneable.toValue; + } +} +class AnimationSet { + constructor() { + this.animations = []; + this._duration = 0; + } + addAnimation(anim) { + this.animations.push(anim); + } + get duration() { + return this._duration; + } + set duration(v) { + this._duration = v; + this.animations.forEach(e => e.duration = v); + } + toModel() { + return { + animations: this.animations.map(e => { + return e.toModel(); + }), + delay: this.delay, + }; + } +} + +/** + * Store color as format AARRGGBB or RRGGBB + */ +class Color { + constructor(v) { + this._value = 0; + this._value = v | 0x0; + } + static parse(str) { + if (!str.startsWith("#")) { + throw new Error(`Parse color error with ${str}`); + } + const val = parseInt(str.substr(1), 16); + if (str.length === 7) { + return new Color(val | 0xff000000); + } + else if (str.length === 9) { + return new Color(val); + } + else { + throw new Error(`Parse color error with ${str}`); + } + } + static safeParse(str, defVal = Color.TRANSPARENT) { + let color = defVal; + try { + color = Color.parse(str); + } + catch (e) { + } + finally { + return color; + } + } + alpha(v) { + v = v * 255; + return new Color((this._value & 0xffffff) | ((v & 0xff) << 24)); + } + toModel() { + return this._value; + } +} +Color.BLACK = new Color(0xFF000000); +Color.DKGRAY = new Color(0xFF444444); +Color.GRAY = new Color(0xFF888888); +Color.LTGRAY = new Color(0xFFCCCCCC); +Color.WHITE = new Color(0xFFFFFFFF); +Color.RED = new Color(0xFFFF0000); +Color.GREEN = new Color(0xFF00FF00); +Color.BLUE = new Color(0xFF0000FF); +Color.YELLOW = new Color(0xFFFFFF00); +Color.CYAN = new Color(0xFF00FFFF); +Color.MAGENTA = new Color(0xFFFF00FF); +Color.TRANSPARENT = new Color(0); +(function (GradientOrientation) { + /** draw the gradient from the top to the bottom */ + GradientOrientation[GradientOrientation["TOP_BOTTOM"] = 0] = "TOP_BOTTOM"; + /** draw the gradient from the top-right to the bottom-left */ + GradientOrientation[GradientOrientation["TR_BL"] = 1] = "TR_BL"; + /** draw the gradient from the right to the left */ + GradientOrientation[GradientOrientation["RIGHT_LEFT"] = 2] = "RIGHT_LEFT"; + /** draw the gradient from the bottom-right to the top-left */ + GradientOrientation[GradientOrientation["BR_TL"] = 3] = "BR_TL"; + /** draw the gradient from the bottom to the top */ + GradientOrientation[GradientOrientation["BOTTOM_TOP"] = 4] = "BOTTOM_TOP"; + /** draw the gradient from the bottom-left to the top-right */ + GradientOrientation[GradientOrientation["BL_TR"] = 5] = "BL_TR"; + /** draw the gradient from the left to the right */ + GradientOrientation[GradientOrientation["LEFT_RIGHT"] = 6] = "LEFT_RIGHT"; + /** draw the gradient from the top-left to the bottom-right */ + GradientOrientation[GradientOrientation["TL_BR"] = 7] = "TL_BR"; +})(exports.GradientOrientation || (exports.GradientOrientation = {})); + +var __decorate$3 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$3 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Text extends View { +} +__decorate$3([ + Property, + __metadata$3("design:type", String) +], Text.prototype, "text", void 0); +__decorate$3([ + Property, + __metadata$3("design:type", Color) +], Text.prototype, "textColor", void 0); +__decorate$3([ + Property, + __metadata$3("design:type", Number) +], Text.prototype, "textSize", void 0); +__decorate$3([ + Property, + __metadata$3("design:type", Number) +], Text.prototype, "maxLines", void 0); +__decorate$3([ + Property, + __metadata$3("design:type", Gravity) +], Text.prototype, "textAlignment", void 0); +function text(config) { + const ret = new Text; + ret.layoutConfig = layoutConfig().fit(); + for (let key in config) { + Reflect.set(ret, key, Reflect.get(config, key, config), ret); + } + return ret; +} + +var __decorate$4 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$4 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +(function (ScaleType) { + ScaleType[ScaleType["ScaleToFill"] = 0] = "ScaleToFill"; + ScaleType[ScaleType["ScaleAspectFit"] = 1] = "ScaleAspectFit"; + ScaleType[ScaleType["ScaleAspectFill"] = 2] = "ScaleAspectFill"; +})(exports.ScaleType || (exports.ScaleType = {})); +class Image extends View { +} +__decorate$4([ + Property, + __metadata$4("design:type", String) +], Image.prototype, "imageUrl", void 0); +__decorate$4([ + Property, + __metadata$4("design:type", String) +], Image.prototype, "imageBase64", void 0); +__decorate$4([ + Property, + __metadata$4("design:type", Number) +], Image.prototype, "scaleType", void 0); +__decorate$4([ + Property, + __metadata$4("design:type", Boolean) +], Image.prototype, "isBlur", void 0); +__decorate$4([ + Property, + __metadata$4("design:type", Function) +], Image.prototype, "loadCallback", void 0); +function image(config) { + const ret = new Image; + ret.layoutConfig = layoutConfig().fit(); + for (let key in config) { + Reflect.set(ret, key, Reflect.get(config, key, config), ret); + } + return ret; +} + +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$5 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$5 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class ListItem extends Stack { +} +__decorate$5([ + Property, + __metadata$5("design:type", String) +], ListItem.prototype, "identifier", void 0); +class List extends Superview { + constructor() { + super(...arguments); + this.cachedViews = new Map; + this.ignoreDirtyCallOnce = false; + this.itemCount = 0; + this.batchCount = 15; + } + allSubviews() { + if (this.loadMoreView) { + return [...this.cachedViews.values(), this.loadMoreView]; + } + else { + return this.cachedViews.values(); + } + } + reset() { + this.cachedViews.clear(); + this.itemCount = 0; + } + getItem(itemIdx) { + let view = this.cachedViews.get(`${itemIdx}`); + if (view === undefined) { + view = this.renderItem(itemIdx); + view.superview = this; + this.cachedViews.set(`${itemIdx}`, view); + } + return view; + } + isDirty() { + if (this.ignoreDirtyCallOnce) { + this.ignoreDirtyCallOnce = false; + //Ignore the dirty call once. + return false; + } + return super.isDirty(); + } + renderBunchedItems(start, length) { + this.ignoreDirtyCallOnce = true; + return new Array(Math.min(length, this.itemCount - start)).fill(0).map((_, idx) => { + const listItem = this.getItem(start + idx); + return listItem.toModel(); + }); + } + toModel() { + if (this.loadMoreView) { + this.dirtyProps['loadMoreView'] = this.loadMoreView.viewId; + } + return super.toModel(); + } +} +__decorate$5([ + Property, + __metadata$5("design:type", Object) +], List.prototype, "itemCount", void 0); +__decorate$5([ + Property, + __metadata$5("design:type", Function) +], List.prototype, "renderItem", void 0); +__decorate$5([ + Property, + __metadata$5("design:type", Object) +], List.prototype, "batchCount", void 0); +__decorate$5([ + Property, + __metadata$5("design:type", Function) +], List.prototype, "onLoadMore", void 0); +__decorate$5([ + Property, + __metadata$5("design:type", Boolean) +], List.prototype, "loadMore", void 0); +__decorate$5([ + Property, + __metadata$5("design:type", ListItem) +], List.prototype, "loadMoreView", void 0); +function list(config) { + const ret = new List; + for (let key in config) { + Reflect.set(ret, key, Reflect.get(config, key, config), ret); + } + return ret; +} +function listItem(item) { + return (new ListItem).also((it) => { + it.layoutConfig = layoutConfig().most().configHeight(exports.LayoutSpec.FIT); + it.addChild(item); + }); +} + +var __decorate$6 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$6 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class SlideItem extends Stack { +} +__decorate$6([ + Property, + __metadata$6("design:type", String) +], SlideItem.prototype, "identifier", void 0); +class Slider extends Superview { + constructor() { + super(...arguments); + this.cachedViews = new Map; + this.ignoreDirtyCallOnce = false; + this.itemCount = 0; + this.batchCount = 3; + } + allSubviews() { + return this.cachedViews.values(); + } + getItem(itemIdx) { + let view = this.cachedViews.get(`${itemIdx}`); + if (view === undefined) { + view = this.renderPage(itemIdx); + view.superview = this; + this.cachedViews.set(`${itemIdx}`, view); + } + return view; + } + isDirty() { + if (this.ignoreDirtyCallOnce) { + this.ignoreDirtyCallOnce = false; + //Ignore the dirty call once. + return false; + } + return super.isDirty(); + } + renderBunchedItems(start, length) { + this.ignoreDirtyCallOnce = true; + return new Array(Math.min(length, this.itemCount - start)).fill(0).map((_, idx) => { + const slideItem = this.getItem(start + idx); + return slideItem.toModel(); + }); + } + slidePage(context, page, smooth = false) { + return this.nativeChannel(context, "slidePage")({ page, smooth }); + } + getSlidedPage(context) { + return this.nativeChannel(context, "getSlidedPage")(); + } +} +__decorate$6([ + Property, + __metadata$6("design:type", Object) +], Slider.prototype, "itemCount", void 0); +__decorate$6([ + Property, + __metadata$6("design:type", Function) +], Slider.prototype, "renderPage", void 0); +__decorate$6([ + Property, + __metadata$6("design:type", Object) +], Slider.prototype, "batchCount", void 0); +__decorate$6([ + Property, + __metadata$6("design:type", Function) +], Slider.prototype, "onPageSlided", void 0); +function slideItem(item) { + return (new SlideItem).also((it) => { + it.layoutConfig = layoutConfig().fit(); + it.addChild(item); + }); +} +function slider(config) { + const ret = new Slider; + for (let key in config) { + Reflect.set(ret, key, Reflect.get(config, key, config), ret); + } + return ret; +} + +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +function scroller(content) { + return (new Scroller).also(v => { + v.layoutConfig = layoutConfig().fit(); + v.content = content; + }); +} +class Scroller extends Superview { + allSubviews() { + return [this.content]; + } + toModel() { + this.dirtyProps.content = this.content.viewId; + return super.toModel(); + } +} + +var __decorate$7 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$7 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Refreshable extends Superview { + allSubviews() { + const ret = [this.content]; + if (this.header) { + ret.push(this.header); + } + return ret; + } + setRefreshable(context, refreshable) { + return this.nativeChannel(context, 'setRefreshable')(refreshable); + } + setRefreshing(context, refreshing) { + return this.nativeChannel(context, 'setRefreshing')(refreshing); + } + isRefreshable(context) { + return this.nativeChannel(context, 'isRefreshable')(); + } + isRefreshing(context) { + return this.nativeChannel(context, 'isRefreshing')(); + } + toModel() { + this.dirtyProps.content = this.content.viewId; + this.dirtyProps.header = (this.header || {}).viewId; + return super.toModel(); + } +} +__decorate$7([ + Property, + __metadata$7("design:type", Function) +], Refreshable.prototype, "onRefresh", void 0); +function refreshable(config) { + const ret = new Refreshable; + ret.layoutConfig = layoutConfig().fit(); + for (let key in config) { + Reflect.set(ret, key, Reflect.get(config, key, config), ret); + } + return ret; +} +function pullable(v, config) { + Reflect.set(v, 'startAnimation', config.startAnimation); + Reflect.set(v, 'stopAnimation', config.stopAnimation); + Reflect.set(v, 'setPullingDistance', config.setPullingDistance); + return v; +} + +var __decorate$8 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$8 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class FlowLayoutItem extends Stack { +} +__decorate$8([ + Property, + __metadata$8("design:type", String) +], FlowLayoutItem.prototype, "identifier", void 0); +class FlowLayout extends Superview { + constructor() { + super(...arguments); + this.cachedViews = new Map; + this.ignoreDirtyCallOnce = false; + this.columnCount = 2; + this.itemCount = 0; + this.batchCount = 15; + } + allSubviews() { + if (this.loadMoreView) { + return [...this.cachedViews.values(), this.loadMoreView]; + } + else { + return this.cachedViews.values(); + } + } + reset() { + this.cachedViews.clear(); + this.itemCount = 0; + } + getItem(itemIdx) { + let view = this.renderItem(itemIdx); + view.superview = this; + this.cachedViews.set(`${itemIdx}`, view); + return view; + } + isDirty() { + if (this.ignoreDirtyCallOnce) { + this.ignoreDirtyCallOnce = false; + //Ignore the dirty call once. + return false; + } + return super.isDirty(); + } + renderBunchedItems(start, length) { + this.ignoreDirtyCallOnce = true; + return new Array(Math.min(length, this.itemCount - start)).fill(0).map((_, idx) => { + const listItem = this.getItem(start + idx); + return listItem.toModel(); + }); + } + toModel() { + if (this.loadMoreView) { + this.dirtyProps['loadMoreView'] = this.loadMoreView.viewId; + } + return super.toModel(); + } +} +__decorate$8([ + Property, + __metadata$8("design:type", Object) +], FlowLayout.prototype, "columnCount", void 0); +__decorate$8([ + Property, + __metadata$8("design:type", Number) +], FlowLayout.prototype, "columnSpace", void 0); +__decorate$8([ + Property, + __metadata$8("design:type", Number) +], FlowLayout.prototype, "rowSpace", void 0); +__decorate$8([ + Property, + __metadata$8("design:type", Object) +], FlowLayout.prototype, "itemCount", void 0); +__decorate$8([ + Property, + __metadata$8("design:type", Function) +], FlowLayout.prototype, "renderItem", void 0); +__decorate$8([ + Property, + __metadata$8("design:type", Object) +], FlowLayout.prototype, "batchCount", void 0); +__decorate$8([ + Property, + __metadata$8("design:type", Function) +], FlowLayout.prototype, "onLoadMore", void 0); +__decorate$8([ + Property, + __metadata$8("design:type", Boolean) +], FlowLayout.prototype, "loadMore", void 0); +__decorate$8([ + Property, + __metadata$8("design:type", FlowLayoutItem) +], FlowLayout.prototype, "loadMoreView", void 0); +function flowlayout(config) { + const ret = new FlowLayout; + for (let key in config) { + Reflect.set(ret, key, Reflect.get(config, key, config), ret); + } + return ret; +} +function flowItem(item) { + return (new FlowLayoutItem).also((it) => { + it.layoutConfig = layoutConfig().fit(); + it.addChild(item); + }); +} + +var __decorate$9 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$9 = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Input extends View { + getText(context) { + return this.nativeChannel(context, 'getText')(); + } + setSelection(context, start, end = start) { + return this.nativeChannel(context, 'setSelection')({ + start, + end, + }); + } + requestFocus(context) { + return this.nativeChannel(context, 'requestFocus')(); + } + releaseFocus(context) { + return this.nativeChannel(context, 'releaseFocus')(); + } +} +__decorate$9([ + Property, + __metadata$9("design:type", String) +], Input.prototype, "text", void 0); +__decorate$9([ + Property, + __metadata$9("design:type", Color) +], Input.prototype, "textColor", void 0); +__decorate$9([ + Property, + __metadata$9("design:type", Number) +], Input.prototype, "textSize", void 0); +__decorate$9([ + Property, + __metadata$9("design:type", String) +], Input.prototype, "hintText", void 0); +__decorate$9([ + Property, + __metadata$9("design:type", Color) +], Input.prototype, "hintTextColor", void 0); +__decorate$9([ + Property, + __metadata$9("design:type", Boolean) +], Input.prototype, "multiline", void 0); +__decorate$9([ + Property, + __metadata$9("design:type", Gravity) +], Input.prototype, "textAlignment", void 0); +__decorate$9([ + Property, + __metadata$9("design:type", Function) +], Input.prototype, "onTextChange", void 0); +__decorate$9([ + Property, + __metadata$9("design:type", Function) +], Input.prototype, "onFocusChange", void 0); + +var __decorate$a = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata$a = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class NestedSlider extends Group { + addSlideItem(view) { + this.addChild(view); + } + slidePage(context, page, smooth = false) { + return this.nativeChannel(context, "slidePage")({ page, smooth }); + } + getSlidedPage(context) { + return this.nativeChannel(context, "getSlidedPage")(); + } +} +__decorate$a([ + Property, + __metadata$a("design:type", Function) +], NestedSlider.prototype, "onPageSlided", void 0); + +function modal(context) { + return { + toast: (msg, gravity = Gravity.Bottom) => { + context.modal.toast({ + msg, + gravity: gravity.toModel(), + }); + }, + alert: (arg) => { + if (typeof arg === 'string') { + return context.modal.alert({ msg: arg }); + } + else { + return context.modal.alert(arg); + } + }, + confirm: (arg) => { + if (typeof arg === 'string') { + return context.modal.confirm({ msg: arg }); + } + else { + return context.modal.confirm(arg); + } + }, + prompt: (arg) => { + return context.modal.prompt(arg); + }, + }; +} + +function navbar(context) { + const entity = context.entity; + return { + isHidden: () => { + return context.navbar.isHidden(); + }, + setHidden: (hidden) => { + return context.navbar.setHidden({ + hidden, + }); + }, + setTitle: (title) => { + return context.navbar.setTitle({ + title, + }); + }, + setBgColor: (color) => { + return context.navbar.setBgColor({ + color: color.toModel(), + }); + }, + }; +} + +function navigator(context) { + return { + push: (scheme, config) => { + if (config && config.extra) { + config.extra = JSON.stringify(config.extra); + } + return context.navigator.push({ + scheme, config + }); + }, + pop: (animated = true) => { + return context.navigator.pop({ animated }); + }, + }; +} + +function transformRequest(request) { + let url = request.url || ""; + if (request.params !== undefined) { + const queryStrings = []; + for (let key in request.params) { + queryStrings.push(`${key}=${encodeURIComponent(request.params[key])}`); + } + request.url = `${request.url}${url.indexOf('?') >= 0 ? '&' : '?'}${queryStrings.join('&')}`; + } + if (typeof request.data === 'object') { + request.data = JSON.stringify(request.data); + } + return request; +} +function network(context) { + return { + request: (config) => { + return context.network.request(transformRequest(config)); + }, + get: (url, config) => { + let finalConfig = config; + if (finalConfig === undefined) { + finalConfig = {}; + } + finalConfig.url = url; + finalConfig.method = "get"; + return context.network.request(transformRequest(finalConfig)); + }, + post: (url, data, config) => { + let finalConfig = config; + if (finalConfig === undefined) { + finalConfig = {}; + } + finalConfig.url = url; + finalConfig.method = "post"; + if (data !== undefined) { + finalConfig.data = data; + } + return context.network.request(transformRequest(finalConfig)); + }, + put: (url, data, config) => { + let finalConfig = config; + if (finalConfig === undefined) { + finalConfig = {}; + } + finalConfig.url = url; + finalConfig.method = "put"; + if (data !== undefined) { + finalConfig.data = data; + } + return context.network.request(transformRequest(finalConfig)); + }, + delete: (url, data, config) => { + let finalConfig = config; + if (finalConfig === undefined) { + finalConfig = {}; + } + finalConfig.url = url; + finalConfig.method = "delete"; + return context.network.request(transformRequest(finalConfig)); + }, + }; +} + +function storage(context) { + return { + setItem: (key, value, zone) => { + return context.storage.setItem({ key, value, zone }); + }, + getItem: (key, zone) => { + return context.storage.getItem({ key, zone }); + }, + remove: (key, zone) => { + return context.storage.remove({ key, zone }); + }, + clear: (zone) => { + return context.storage.clear({ zone }); + }, + }; +} + +function popover(context) { + const entity = context.entity; + let panel = undefined; + if (entity instanceof Panel) { + panel = entity; + } + return { + show: (view) => { + if (panel) { + panel.addHeadView(view); + } + return context.popover.show(view.toModel()); + }, + dismiss: (view = undefined) => { + if (panel) { + if (view) { + panel.removeHeadView(view); + } + else { + panel.clearHeadViews(); + } + } + return context.popover.dismiss(view ? { id: view.viewId } : undefined); + }, + }; +} + +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +function take(target) { + return (block) => { + block(target); + }; +} +function takeNonNull(target) { + return (block) => { + if (target !== undefined) { + return block(target); + } + }; +} +function takeNull(target) { + return (block) => { + if (target === undefined) { + return block(); + } + }; +} +function takeLet(target) { + return (block) => { + return block(target); + }; +} +function takeAlso(target) { + return (block) => { + block(target); + return target; + }; +} +function takeIf(target) { + return (predicate) => { + return predicate(target) ? target : undefined; + }; +} +function takeUnless(target) { + return (predicate) => { + return predicate(target) ? undefined : target; + }; +} +function repeat(action) { + return (times) => { + for (let i = 0; i < times; i++) { + action(i); + } + }; +} + +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Only supports x,y,width,height,corner(just for four corners),rotation,bgColor, + * @param panel @see Panel + */ +function animate(context) { + const entity = context.entity; + if (entity instanceof Panel) { + let panel = entity; + return (args) => { + return takeLet(panel.context.animate)(it => { + return it.submit().then(() => { + args.animations(); + return takeLet(panel.getRootView())(root => { + if (root.isDirty()) { + const model = root.toModel(); + model.duration = args.duration; + const ret = it.animateRender(model); + root.clean(); + return ret; + } + for (let v of panel.allHeadViews()) { + if (v.isDirty()) { + const model = v.toModel(); + const ret = it.animateRender(model); + it.clean(); + return ret; + } + } + throw new Error('Cannot find any animated elements'); + }); + }); + }); + }; + } + else { + return (args) => { + return Promise.reject(`Cannot find panel in Context:${context.id}`); + }; + } +} + +class Observable { + constructor(provider, clz) { + this.observers = new Set; + this.provider = provider; + this.clz = clz; + } + addObserver(observer) { + this.observers.add(observer); + } + removeObserver(observer) { + this.observers.delete(observer); + } + update(updater) { + const oldV = this.provider.acquire(this.clz); + const newV = updater(oldV); + if (newV !== undefined) { + this.provider.provide(newV); + } + for (let observer of this.observers) { + observer(newV); + } + } +} +class Provider { + constructor() { + this.provision = new Map; + this.observableMap = new Map; + } + provide(obj) { + this.provision.set(obj.constructor, obj); + } + acquire(clz) { + const ret = this.provision.get(clz); + return ret; + } + remove(clz) { + this.provision.delete(clz); + } + clear() { + this.provision.clear(); + } + observe(clz) { + let observable = this.observableMap.get(clz); + if (observable === undefined) { + observable = new Observable(this, clz); + this.observableMap.set(clz, observable); + } + return observable; + } +} + +class ViewHolder { +} +class ViewModel { + constructor(obj, v) { + this.state = obj; + this.viewHolder = v; + } + getState() { + return this.state; + } + updateState(setter) { + setter(this.state); + this.onBind(this.state, this.viewHolder); + } + attach(view) { + this.viewHolder.build(view); + this.onAttached(this.state, this.viewHolder); + this.onBind(this.state, this.viewHolder); + } +} +class VMPanel extends Panel { + getViewModel() { + return this.vm; + } + build(root) { + this.vh = new (this.getViewHolderClass()); + this.vm = new (this.getViewModelClass())(this.getState(), this.vh); + this.vm.attach(root); + } +} + +exports.AnimationSet = AnimationSet; +exports.BOTTOM = BOTTOM; +exports.CENTER = CENTER; +exports.CENTER_X = CENTER_X; +exports.CENTER_Y = CENTER_Y; +exports.Color = Color; +exports.FlowLayout = FlowLayout; +exports.FlowLayoutItem = FlowLayoutItem; +exports.Gravity = Gravity; +exports.Group = Group; +exports.HLayout = HLayout; +exports.Image = Image; +exports.Input = Input; +exports.LEFT = LEFT; +exports.LayoutConfigImpl = LayoutConfigImpl; +exports.List = List; +exports.ListItem = ListItem; +exports.Mutable = Mutable; +exports.NativeCall = NativeCall; +exports.NestedSlider = NestedSlider; +exports.Observable = Observable; +exports.Panel = Panel; +exports.Property = Property; +exports.Provider = Provider; +exports.RIGHT = RIGHT; +exports.Refreshable = Refreshable; +exports.Root = Root; +exports.RotationAnimation = RotationAnimation; +exports.ScaleAnimation = ScaleAnimation; +exports.Scroller = Scroller; +exports.SlideItem = SlideItem; +exports.Slider = Slider; +exports.Stack = Stack; +exports.Superview = Superview; +exports.TOP = TOP; +exports.Text = Text; +exports.TranslationAnimation = TranslationAnimation; +exports.VLayout = VLayout; +exports.VMPanel = VMPanel; +exports.View = View; +exports.ViewHolder = ViewHolder; +exports.ViewModel = ViewModel; +exports.animate = animate; +exports.flowItem = flowItem; +exports.flowlayout = flowlayout; +exports.gravity = gravity; +exports.hlayout = hlayout; +exports.image = image; +exports.layoutConfig = layoutConfig; +exports.list = list; +exports.listItem = listItem; +exports.log = log; +exports.loge = loge; +exports.logw = logw; +exports.modal = modal; +exports.navbar = navbar; +exports.navigator = navigator; +exports.network = network; +exports.obj2Model = obj2Model; +exports.popover = popover; +exports.pullable = pullable; +exports.refreshable = refreshable; +exports.repeat = repeat; +exports.scroller = scroller; +exports.slideItem = slideItem; +exports.slider = slider; +exports.stack = stack; +exports.storage = storage; +exports.take = take; +exports.takeAlso = takeAlso; +exports.takeIf = takeIf; +exports.takeLet = takeLet; +exports.takeNonNull = takeNonNull; +exports.takeNull = takeNull; +exports.takeUnless = takeUnless; +exports.text = text; +exports.uniqueId = uniqueId; +exports.vlayout = vlayout; + +})(__module,__module.exports,doric.__require__); +return __module.exports; +},this,[{exports:{}}])]); +/**--------Lib--------*/ + +(function (axios, sandbox) { + 'use strict'; + + axios = axios && axios.hasOwnProperty('default') ? axios['default'] : axios; + + class DoricPlugin { + constructor(context) { + this.context = context; + } + } + + class ShaderPlugin extends DoricPlugin { + render(ret) { + this.context.rootNode.viewId = ret.id; + this.context.rootNode.blend(ret.props); + } + } + + var LayoutSpec; + (function (LayoutSpec) { + LayoutSpec[LayoutSpec["EXACTLY"] = 0] = "EXACTLY"; + LayoutSpec[LayoutSpec["WRAP_CONTENT"] = 1] = "WRAP_CONTENT"; + LayoutSpec[LayoutSpec["AT_MOST"] = 2] = "AT_MOST"; + })(LayoutSpec || (LayoutSpec = {})); + const SPECIFIED = 1; + const START = 1 << 1; + const END = 1 << 2; + const SHIFT_X = 0; + const SHIFT_Y = 4; + const LEFT = (START | SPECIFIED) << SHIFT_X; + const RIGHT = (END | SPECIFIED) << SHIFT_X; + const TOP = (START | SPECIFIED) << SHIFT_Y; + const BOTTOM = (END | SPECIFIED) << SHIFT_Y; + const CENTER_X = SPECIFIED << SHIFT_X; + const CENTER_Y = SPECIFIED << SHIFT_Y; + function toPixelString(v) { + return `${v}px`; + } + function toRGBAString(color) { + let strs = []; + for (let i = 0; i < 32; i += 8) { + strs.push(((color >> i) & 0xff).toString(16)); + } + strs = strs.map(e => { + if (e.length === 1) { + return '0' + e; + } + return e; + }).reverse(); + /// RGBA + return `#${strs[1]}${strs[2]}${strs[3]}${strs[0]}`; + } + class DoricViewNode { + constructor(context) { + this.viewId = ""; + this.viewType = "View"; + this.layoutConfig = { + widthSpec: LayoutSpec.EXACTLY, + heightSpec: LayoutSpec.EXACTLY, + alignment: 0, + weight: 0, + margin: { + left: 0, + right: 0, + top: 0, + bottom: 0 + } + }; + this.padding = { + left: 0, + right: 0, + top: 0, + bottom: 0, + }; + this.frameWidth = 0; + this.frameHeight = 0; + this.offsetX = 0; + this.offsetY = 0; + this.context = context; + } + init(superNode) { + this.superNode = superNode; + if (this instanceof DoricSuperViewNode) { + this.reusable = superNode.reusable; + } + this.view = this.build(); + } + get paddingLeft() { + return this.padding.left || 0; + } + get paddingRight() { + return this.padding.right || 0; + } + get paddingTop() { + return this.padding.top || 0; + } + get paddingBottom() { + return this.padding.bottom || 0; + } + get borderWidth() { + var _a; + return ((_a = this.border) === null || _a === void 0 ? void 0 : _a.width) || 0; + } + blend(props) { + for (let key in props) { + this.blendProps(this.view, key, props[key]); + } + this.onBlended(); + this.layout(); + } + onBlended() { + } + configBorder() { + if (this.border) { + this.view.style.borderStyle = "solid"; + this.view.style.borderWidth = toPixelString(this.border.width); + this.view.style.borderColor = toRGBAString(this.border.color); + } + } + configWidth() { + switch (this.layoutConfig.widthSpec) { + case LayoutSpec.WRAP_CONTENT: + this.view.style.width = "fit-content"; + break; + case LayoutSpec.AT_MOST: + this.view.style.width = "100%"; + break; + case LayoutSpec.EXACTLY: + default: + this.view.style.width = toPixelString(this.frameWidth + - this.paddingLeft - this.paddingRight + - this.borderWidth * 2); + break; + } + } + configHeight() { + switch (this.layoutConfig.heightSpec) { + case LayoutSpec.WRAP_CONTENT: + this.view.style.height = "fit-content"; + break; + case LayoutSpec.AT_MOST: + this.view.style.height = "100%"; + break; + case LayoutSpec.EXACTLY: + default: + this.view.style.height = toPixelString(this.frameHeight + - this.paddingTop - this.paddingBottom + - this.borderWidth * 2); + break; + } + } + configMargin() { + if (this.layoutConfig.margin) { + this.view.style.marginLeft = toPixelString(this.layoutConfig.margin.left || 0); + this.view.style.marginRight = toPixelString(this.layoutConfig.margin.right || 0); + this.view.style.marginTop = toPixelString(this.layoutConfig.margin.top || 0); + this.view.style.marginBottom = toPixelString(this.layoutConfig.margin.bottom || 0); + } + } + configPadding() { + if (this.padding) { + this.view.style.paddingLeft = toPixelString(this.paddingLeft); + this.view.style.paddingRight = toPixelString(this.paddingRight); + this.view.style.paddingTop = toPixelString(this.paddingTop); + this.view.style.paddingBottom = toPixelString(this.paddingBottom); + } + } + layout() { + this.configMargin(); + this.configBorder(); + this.configPadding(); + this.configWidth(); + this.configHeight(); + } + blendProps(v, propName, prop) { + switch (propName) { + case "border": + this.border = prop; + break; + case "padding": + this.padding = prop; + break; + case 'width': + this.frameWidth = prop; + break; + case 'height': + this.frameHeight = prop; + break; + case 'backgroundColor': + this.backgroundColor = prop; + break; + case 'layoutConfig': + const layoutConfig = prop; + for (let key in layoutConfig) { + Reflect.set(this.layoutConfig, key, Reflect.get(layoutConfig, key, layoutConfig)); + } + break; + case 'x': + this.offsetX = prop; + break; + case 'y': + this.offsetY = prop; + break; + case 'onClick': + this.view.onclick = () => { + this.callJSResponse(prop); + }; + break; + case 'corners': + if (typeof prop === 'object') { + this.view.style.borderTopLeftRadius = toPixelString(prop.leftTop); + this.view.style.borderTopRightRadius = toPixelString(prop.rightTop); + this.view.style.borderBottomRightRadius = toPixelString(prop.rightBottom); + this.view.style.borderBottomLeftRadius = toPixelString(prop.leftBottom); + } + else { + this.view.style.borderRadius = toPixelString(prop); + } + break; + case 'shadow': + const opacity = prop.opacity || 0; + if (opacity > 0) { + const offsetX = prop.offsetX || 0; + const offsetY = prop.offsetY || 0; + const shadowColor = prop.color || 0xff000000; + const shadowRadius = prop.radius; + const alpha = opacity * 255; + this.view.style.boxShadow = `${toPixelString(offsetX)} ${toPixelString(offsetY)} ${toPixelString(shadowRadius)} ${toRGBAString((shadowColor & 0xffffff) | ((alpha & 0xff) << 24))} `; + } + else { + this.view.style.boxShadow = ""; + } + break; + } + } + set backgroundColor(v) { + this.view.style.backgroundColor = toRGBAString(v); + } + static create(context, type) { + const viewNodeClass = acquireViewNode(type); + if (viewNodeClass === undefined) { + console.error(`Cannot find ViewNode for ${type}`); + return undefined; + } + const ret = new viewNodeClass(context); + ret.viewType = type; + return ret; + } + getIdList() { + const ids = []; + let viewNode = this; + do { + ids.push(viewNode.viewId); + viewNode = viewNode.superNode; + } while (viewNode); + return ids.reverse(); + } + callJSResponse(funcId, ...args) { + const argumentsList = ['__response__', this.getIdList(), funcId]; + for (let i = 1; i < arguments.length; i++) { + argumentsList.push(arguments[i]); + } + Reflect.apply(this.context.invokeEntityMethod, this.context, argumentsList); + } + } + class DoricSuperViewNode extends DoricViewNode { + constructor() { + super(...arguments); + this.reusable = false; + this.subModels = new Map; + } + blendProps(v, propName, prop) { + if (propName === 'subviews') { + if (prop instanceof Array) { + prop.forEach((e) => { + this.mixinSubModel(e); + this.blendSubNode(e); + }); + } + } + else { + super.blendProps(v, propName, prop); + } + } + mixinSubModel(subNode) { + const oldValue = this.getSubModel(subNode.id); + if (oldValue) { + this.mixin(subNode, oldValue); + } + else { + this.subModels.set(subNode.id, subNode); + } + } + getSubModel(id) { + return this.subModels.get(id); + } + mixin(src, target) { + for (let key in src.props) { + if (key === "subviews") { + continue; + } + Reflect.set(target.props, key, Reflect.get(src.props, key)); + } + } + clearSubModels() { + this.subModels.clear(); + } + removeSubModel(id) { + this.subModels.delete(id); + } + } + class DoricGroupViewNode extends DoricSuperViewNode { + constructor() { + super(...arguments); + this.childNodes = []; + this.childViewIds = []; + } + blendProps(v, propName, prop) { + if (propName === 'children') { + if (prop instanceof Array) { + this.childViewIds = prop; + } + } + else { + super.blendProps(v, propName, prop); + } + } + blend(props) { + super.blend(props); + } + onBlended() { + super.onBlended(); + this.configChildNode(); + } + configChildNode() { + this.childViewIds.forEach((childViewId, index) => { + const model = this.getSubModel(childViewId); + if (model === undefined) { + return; + } + if (index < this.childNodes.length) { + const oldNode = this.childNodes[index]; + if (oldNode.viewId === childViewId) ; + else { + if (this.reusable) { + if (oldNode.viewType === model.type) { + //Same type,can be reused + oldNode.viewId = childViewId; + oldNode.blend(model.props); + } + else { + //Replace this view + this.view.removeChild(oldNode.view); + const newNode = DoricViewNode.create(this.context, model.type); + if (newNode === undefined) { + return; + } + newNode.viewId = childViewId; + newNode.init(this); + newNode.blend(model.props); + this.childNodes[index] = newNode; + this.view.replaceChild(newNode.view, oldNode.view); + } + } + else { + //Find in remain nodes + let position = -1; + for (let start = index + 1; start < this.childNodes.length; start++) { + if (childViewId === this.childNodes[start].viewId) { + //Found + position = start; + break; + } + } + if (position >= 0) { + //Found swap idx,position + const reused = this.childNodes[position]; + const abandoned = this.childNodes[index]; + this.childNodes[index] = reused; + this.childNodes[position] = abandoned; + this.view.removeChild(reused.view); + this.view.insertBefore(reused.view, abandoned.view); + this.view.removeChild(abandoned.view); + if (position === this.view.childElementCount - 1) { + this.view.appendChild(abandoned.view); + } + else { + this.view.insertBefore(abandoned.view, this.view.children[position]); + } + } + else { + //Not found,insert + const newNode = DoricViewNode.create(this.context, model.type); + if (newNode === undefined) { + return; + } + newNode.viewId = childViewId; + newNode.init(this); + newNode.blend(model.props); + this.childNodes[index] = newNode; + this.view.insertBefore(newNode.view, this.view.children[index]); + } + } + } + } + else { + //Insert + const newNode = DoricViewNode.create(this.context, model.type); + if (newNode === undefined) { + return; + } + newNode.viewId = childViewId; + newNode.init(this); + newNode.blend(model.props); + this.childNodes.push(newNode); + this.view.appendChild(newNode.view); + } + }); + let size = this.childNodes.length; + for (let idx = this.childViewIds.length; idx < size; idx++) { + this.view.removeChild(this.childNodes[idx].view); + } + this.childNodes = this.childNodes.slice(0, this.childViewIds.length); + } + blendSubNode(model) { + var _a; + (_a = this.getSubNodeById(model.id)) === null || _a === void 0 ? void 0 : _a.blend(model.props); + } + getSubNodeById(viewId) { + return this.childNodes.filter(e => e.viewId === viewId)[0]; + } + } + + class DoricStackNode extends DoricGroupViewNode { + build() { + const ret = document.createElement('div'); + ret.style.position = "relative"; + return ret; + } + layout() { + super.layout(); + this.configOffset(); + } + configOffset() { + this.childNodes.forEach(e => { + e.view.style.position = "absolute"; + e.view.style.left = toPixelString(e.offsetX + this.paddingLeft); + e.view.style.top = toPixelString(e.offsetY + this.paddingTop); + const gravity = e.layoutConfig.alignment; + if ((gravity & LEFT) === LEFT) { + e.view.style.left = toPixelString(0); + } + else if ((gravity & RIGHT) === RIGHT) { + e.view.style.left = toPixelString(this.view.offsetWidth - e.view.offsetWidth); + } + else if ((gravity & CENTER_X) === CENTER_X) { + e.view.style.left = toPixelString(this.view.offsetWidth / 2 - e.view.offsetWidth / 2); + } + if ((gravity & TOP) === TOP) { + e.view.style.top = toPixelString(0); + } + else if ((gravity & BOTTOM) === BOTTOM) { + e.view.style.top = toPixelString(this.view.offsetHeight - e.view.offsetHeight); + } + else if ((gravity & CENTER_Y) === CENTER_Y) { + e.view.style.top = toPixelString(this.view.offsetHeight / 2 - e.view.offsetHeight / 2); + } + }); + } + } + + class DoricVLayoutNode extends DoricGroupViewNode { + constructor() { + super(...arguments); + this.space = 0; + this.gravity = 0; + } + build() { + const ret = document.createElement('div'); + ret.style.display = "flex"; + ret.style.flexDirection = "column"; + ret.style.flexWrap = "nowrap"; + return ret; + } + blendProps(v, propName, prop) { + if (propName === 'space') { + this.space = prop; + } + else if (propName === 'gravity') { + this.gravity = prop; + if ((this.gravity & LEFT) === LEFT) { + this.view.style.alignItems = "flex-start"; + } + else if ((this.gravity & RIGHT) === RIGHT) { + this.view.style.alignItems = "flex-end"; + } + else if ((this.gravity & CENTER_X) === CENTER_X) { + this.view.style.alignItems = "center"; + } + if ((this.gravity & TOP) === TOP) { + this.view.style.justifyContent = "flex-start"; + } + else if ((this.gravity & BOTTOM) === BOTTOM) { + this.view.style.justifyContent = "flex-end"; + } + else if ((this.gravity & CENTER_Y) === CENTER_Y) { + this.view.style.justifyContent = "center"; + } + } + else { + super.blendProps(v, propName, prop); + } + } + layout() { + super.layout(); + this.childNodes.forEach((e, idx) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; + e.view.style.flexShrink = "0"; + if ((_a = e.layoutConfig) === null || _a === void 0 ? void 0 : _a.weight) { + e.view.style.flex = `${(_b = e.layoutConfig) === null || _b === void 0 ? void 0 : _b.weight}`; + } + e.view.style.marginTop = toPixelString(((_d = (_c = e.layoutConfig) === null || _c === void 0 ? void 0 : _c.margin) === null || _d === void 0 ? void 0 : _d.top) || 0); + e.view.style.marginBottom = toPixelString((idx === this.childNodes.length - 1) ? 0 : this.space + + (((_f = (_e = e.layoutConfig) === null || _e === void 0 ? void 0 : _e.margin) === null || _f === void 0 ? void 0 : _f.bottom) || 0)); + e.view.style.marginLeft = toPixelString(((_h = (_g = e.layoutConfig) === null || _g === void 0 ? void 0 : _g.margin) === null || _h === void 0 ? void 0 : _h.left) || 0); + e.view.style.marginRight = toPixelString(((_k = (_j = e.layoutConfig) === null || _j === void 0 ? void 0 : _j.margin) === null || _k === void 0 ? void 0 : _k.right) || 0); + }); + } + } + + class DoricHLayoutNode extends DoricGroupViewNode { + constructor() { + super(...arguments); + this.space = 0; + this.gravity = 0; + } + build() { + const ret = document.createElement('div'); + ret.style.display = "flex"; + ret.style.flexDirection = "row"; + ret.style.flexWrap = "nowrap"; + return ret; + } + blendProps(v, propName, prop) { + if (propName === 'space') { + this.space = prop; + } + else if (propName === 'gravity') { + this.gravity = prop; + this.gravity = prop; + if ((this.gravity & LEFT) === LEFT) { + this.view.style.justifyContent = "flex-start"; + } + else if ((this.gravity & RIGHT) === RIGHT) { + this.view.style.justifyContent = "flex-end"; + } + else if ((this.gravity & CENTER_X) === CENTER_X) { + this.view.style.justifyContent = "center"; + } + if ((this.gravity & TOP) === TOP) { + this.view.style.alignItems = "flex-start"; + } + else if ((this.gravity & BOTTOM) === BOTTOM) { + this.view.style.alignItems = "flex-end"; + } + else if ((this.gravity & CENTER_Y) === CENTER_Y) { + this.view.style.alignItems = "center"; + } + } + else { + super.blendProps(v, propName, prop); + } + } + layout() { + super.layout(); + this.childNodes.forEach((e, idx) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; + e.view.style.flexShrink = "0"; + if ((_a = e.layoutConfig) === null || _a === void 0 ? void 0 : _a.weight) { + e.view.style.flex = `${(_b = e.layoutConfig) === null || _b === void 0 ? void 0 : _b.weight}`; + } + e.view.style.marginLeft = toPixelString(((_d = (_c = e.layoutConfig) === null || _c === void 0 ? void 0 : _c.margin) === null || _d === void 0 ? void 0 : _d.left) || 0); + e.view.style.marginRight = toPixelString((idx === this.childNodes.length - 1) ? 0 : this.space + + (((_f = (_e = e.layoutConfig) === null || _e === void 0 ? void 0 : _e.margin) === null || _f === void 0 ? void 0 : _f.right) || 0)); + e.view.style.marginTop = toPixelString(((_h = (_g = e.layoutConfig) === null || _g === void 0 ? void 0 : _g.margin) === null || _h === void 0 ? void 0 : _h.top) || 0); + e.view.style.marginBottom = toPixelString(((_k = (_j = e.layoutConfig) === null || _j === void 0 ? void 0 : _j.margin) === null || _k === void 0 ? void 0 : _k.bottom) || 0); + }); + } + } + + class DoricTextNode extends DoricViewNode { + build() { + const div = document.createElement('div'); + div.style.display = "flex"; + this.textElement = document.createElement('span'); + div.appendChild(this.textElement); + div.style.justifyContent = "center"; + div.style.alignItems = "center"; + return div; + } + blendProps(v, propName, prop) { + switch (propName) { + case 'text': + this.textElement.innerText = prop; + break; + case 'textSize': + v.style.fontSize = toPixelString(prop); + break; + case 'textColor': + v.style.color = toRGBAString(prop); + break; + case 'textAlignment': + const gravity = prop; + if ((gravity & LEFT) === LEFT) { + v.style.justifyContent = "flex-start"; + } + else if ((gravity & RIGHT) === RIGHT) { + v.style.justifyContent = "flex-end"; + } + else if ((gravity & CENTER_X) === CENTER_X) { + v.style.justifyContent = "center"; + } + if ((gravity & TOP) === TOP) { + v.style.alignItems = "flex-start"; + } + else if ((gravity & BOTTOM) === BOTTOM) { + v.style.alignItems = "flex-end"; + } + else if ((gravity & CENTER_Y) === CENTER_Y) { + v.style.alignItems = "center"; + } + break; + default: + super.blendProps(v, propName, prop); + break; + } + } + } + + var ScaleType; + (function (ScaleType) { + ScaleType[ScaleType["ScaleToFill"] = 0] = "ScaleToFill"; + ScaleType[ScaleType["ScaleAspectFit"] = 1] = "ScaleAspectFit"; + ScaleType[ScaleType["ScaleAspectFill"] = 2] = "ScaleAspectFill"; + })(ScaleType || (ScaleType = {})); + class DoricImageNode extends DoricViewNode { + build() { + const ret = document.createElement('img'); + ret.style.objectFit = "fill"; + return ret; + } + blendProps(v, propName, prop) { + switch (propName) { + case 'imageUrl': + v.setAttribute('src', prop); + break; + case 'imageBase64': + v.setAttribute('src', prop); + break; + case 'loadCallback': + v.onload = () => { + this.callJSResponse(prop, { + width: v.width, + height: v.height + }); + }; + break; + case 'scaleType': + switch (prop) { + case ScaleType.ScaleToFill: + v.style.objectFit = "fill"; + break; + case ScaleType.ScaleAspectFit: + v.style.objectFit = "contain"; + break; + case ScaleType.ScaleAspectFill: + v.style.objectFit = "cover"; + break; + } + break; + case 'isBlur': + if (prop) { + v.style.filter = 'blur(10px)'; + } + else { + v.style.filter = ''; + } + break; + default: + super.blendProps(v, propName, prop); + break; + } + } + } + + class DoricScrollerNode extends DoricSuperViewNode { + constructor() { + super(...arguments); + this.childViewId = ""; + } + build() { + const ret = document.createElement('div'); + ret.style.overflow = "scroll"; + return ret; + } + blendProps(v, propName, prop) { + if (propName === 'content') { + this.childViewId = prop; + } + else { + super.blendProps(v, propName, prop); + } + } + blendSubNode(model) { + var _a; + (_a = this.childNode) === null || _a === void 0 ? void 0 : _a.blend(model.props); + } + getSubNodeById(viewId) { + return viewId === this.childViewId ? this.childNode : undefined; + } + onBlended() { + super.onBlended(); + const model = this.getSubModel(this.childViewId); + if (model === undefined) { + return; + } + if (this.childNode) { + if (this.childNode.viewId === this.childViewId) ; + else { + if (this.reusable && this.childNode.viewType === model.type) { + this.childNode.viewId = model.id; + this.childNode.blend(model.props); + } + else { + this.view.removeChild(this.childNode.view); + const childNode = DoricViewNode.create(this.context, model.type); + if (childNode === undefined) { + return; + } + childNode.viewId = model.id; + childNode.init(this); + childNode.blend(model.props); + this.view.appendChild(childNode.view); + this.childNode = childNode; + } + } + } + else { + const childNode = DoricViewNode.create(this.context, model.type); + if (childNode === undefined) { + return; + } + childNode.viewId = model.id; + childNode.init(this); + childNode.blend(model.props); + this.view.appendChild(childNode.view); + this.childNode = childNode; + } + } + layout() { + super.layout(); + } + } + + class ModalPlugin extends DoricPlugin { + toast(args) { + const toastElement = document.createElement('div'); + toastElement.style.position = "absolute"; + toastElement.style.textAlign = "center"; + toastElement.style.width = "100%"; + const textElement = document.createElement('span'); + textElement.innerText = args.msg || ""; + textElement.style.backgroundColor = "#777777"; + textElement.style.color = "white"; + textElement.style.paddingLeft = '20px'; + textElement.style.paddingRight = '20px'; + textElement.style.paddingTop = '10px'; + textElement.style.paddingBottom = '10px'; + toastElement.appendChild(textElement); + document.body.appendChild(toastElement); + const gravity = args.gravity || BOTTOM; + if ((gravity & TOP) == TOP) { + toastElement.style.top = toPixelString(30); + } + else if ((gravity & BOTTOM) == BOTTOM) { + toastElement.style.bottom = toPixelString(30); + } + else if ((gravity & CENTER_Y) == CENTER_Y) { + toastElement.style.top = toPixelString(document.body.offsetHeight / 2 - toastElement.offsetHeight / 2); + } + setTimeout(() => { + document.body.removeChild(toastElement); + }, 2000); + return Promise.resolve(); + } + alert(args) { + window.alert(args.msg || ""); + return Promise.resolve(); + } + confirm(args) { + if (window.confirm(args.msg || "")) { + return Promise.resolve(); + } + else { + return Promise.reject(); + } + } + prompt(args) { + const result = window.prompt(args.msg || "", args.defaultText); + if (result) { + return Promise.resolve(result); + } + else { + return Promise.reject(result); + } + } + } + + const bundles = new Map; + const plugins = new Map; + const nodes = new Map; + function acquireJSBundle(name) { + return bundles.get(name); + } + function registerPlugin(name, plugin) { + plugins.set(name, plugin); + } + function acquirePlugin(name) { + return plugins.get(name); + } + function registerViewNode(name, node) { + nodes.set(name, node); + } + function acquireViewNode(name) { + return nodes.get(name); + } + registerPlugin('shader', ShaderPlugin); + registerPlugin('modal', ModalPlugin); + registerViewNode('Stack', DoricStackNode); + registerViewNode('VLayout', DoricVLayoutNode); + registerViewNode('HLayout', DoricHLayoutNode); + registerViewNode('Text', DoricTextNode); + registerViewNode('Image', DoricImageNode); + registerViewNode('Scroller', DoricScrollerNode); + + let __scriptId__ = 0; + function getScriptId() { + return `script_${__scriptId__++}`; + } + const originSetTimeout = window.setTimeout; + const originClearTimeout = window.clearTimeout; + const originSetInterval = window.setInterval; + const originClearInterval = window.clearInterval; + const timers = new Map; + function injectGlobalObject(name, value) { + Reflect.set(window, name, value, window); + } + function loadJS(script) { + const scriptElement = document.createElement('script'); + scriptElement.text = script; + scriptElement.id = getScriptId(); + document.body.appendChild(scriptElement); + } + function packageModuleScript(name, content) { + return `Reflect.apply(doric.jsRegisterModule,this,[${name},Reflect.apply(function(__module){(function(module,exports,require,setTimeout,setInterval,clearTimeout,clearInterval){ +${content} +})(__module,__module.exports,doric.__require__,doricSetTimeout,doricSetInterval,doricClearTimeout,doricClearInterval); +return __module.exports;},this,[{exports:{}}])])`; + } + function packageCreateContext(contextId, content) { + return `Reflect.apply(function(doric,context,Entry,require,exports,setTimeout,setInterval,clearTimeout,clearInterval){ +${content} +},doric.jsObtainContext("${contextId}"),[undefined,doric.jsObtainContext("${contextId}"),doric.jsObtainEntry("${contextId}"),doric.__require__,{},doricSetTimeout,doricSetInterval,doricClearTimeout,doricClearInterval])`; + } + function initDoric() { + injectGlobalObject("nativeEmpty", () => undefined); + injectGlobalObject('nativeLog', (type, message) => { + switch (type) { + case 'd': + console.log(message); + break; + case 'w': + console.warn(message); + break; + case 'e': + console.error(message); + break; + } + }); + injectGlobalObject('nativeRequire', (moduleName) => { + const bundle = acquireJSBundle(moduleName); + if (bundle === undefined || bundle.length === 0) { + console.log(`Cannot require JS Bundle :${moduleName}`); + return false; + } + else { + loadJS(packageModuleScript(moduleName, packageModuleScript(name, bundle))); + return true; + } + }); + injectGlobalObject('nativeBridge', (contextId, namespace, method, callbackId, args) => { + const pluginClass = acquirePlugin(namespace); + const doricContext = getDoricContext(contextId); + if (pluginClass === undefined) { + console.error(`Cannot find Plugin:${namespace}`); + return false; + } + if (doricContext === undefined) { + console.error(`Cannot find Doric Context:${contextId}`); + return false; + } + let plugin = doricContext.pluginInstances.get(namespace); + if (plugin === undefined) { + plugin = new pluginClass(doricContext); + doricContext.pluginInstances.set(namespace, plugin); + } + if (!Reflect.has(plugin, method)) { + console.error(`Cannot find Method:${method} in plugin ${namespace}`); + return false; + } + const pluginMethod = Reflect.get(plugin, method, plugin); + if (typeof pluginMethod !== 'function') { + console.error(`Plugin ${namespace}'s property ${method}'s type is ${typeof pluginMethod} not function,`); + } + const ret = Reflect.apply(pluginMethod, plugin, [args]); + if (ret instanceof Promise) { + ret.then(e => { + sandbox.jsCallResolve(contextId, callbackId, e); + }, e => { + sandbox.jsCallReject(contextId, callbackId, e); + }); + } + else if (ret !== undefined) { + sandbox.jsCallResolve(contextId, callbackId, ret); + } + return true; + }); + injectGlobalObject('nativeSetTimer', (timerId, time, repeat) => { + if (repeat) { + const handleId = originSetInterval(() => { + sandbox.jsCallbackTimer(timerId); + }, time); + timers.set(timerId, { handleId, repeat }); + } + else { + const handleId = originSetTimeout(() => { + sandbox.jsCallbackTimer(timerId); + }, time); + timers.set(timerId, { handleId, repeat }); + } + }); + injectGlobalObject('nativeClearTimer', (timerId) => { + const timerInfo = timers.get(timerId); + if (timerInfo) { + if (timerInfo.repeat) { + originClearInterval(timerInfo.handleId); + } + else { + originClearTimeout(timerInfo.handleId); + } + } + }); + } + function createContext(contextId, content) { + loadJS(packageCreateContext(contextId, content)); + } + initDoric(); + + const doricContexts = new Map; + let __contextId__ = 0; + function getContextId() { + return `context_${__contextId__++}`; + } + function getDoricContext(contextId) { + return doricContexts.get(contextId); + } + class DoricContext { + constructor(content) { + this.contextId = getContextId(); + this.pluginInstances = new Map; + createContext(this.contextId, content); + doricContexts.set(this.contextId, this); + this.rootNode = new DoricStackNode(this); + } + get panel() { + var _a; + return (_a = sandbox.jsObtainContext(this.contextId)) === null || _a === void 0 ? void 0 : _a.entity; + } + invokeEntityMethod(method, ...otherArgs) { + const argumentsList = [this.contextId]; + for (let i = 0; i < arguments.length; i++) { + argumentsList.push(arguments[i]); + } + Reflect.apply(sandbox.jsCallEntityMethod, this.panel, argumentsList); + } + init(frame, extra) { + this.invokeEntityMethod("__init__", frame, extra ? JSON.stringify(extra) : undefined); + } + } + + class DoricElement extends HTMLElement { + constructor() { + super(); + this.source = this.getAttribute('src') || ""; + this.alias = this.getAttribute('alias') || this.source; + axios.get(this.source).then(result => { + this.load(result.data); + }); + } + load(content) { + this.context = new DoricContext(content); + const divElement = document.createElement('div'); + divElement.style.height = '100%'; + this.append(divElement); + this.context.rootNode.view = divElement; + this.context.init({ + width: divElement.offsetWidth, + height: divElement.offsetHeight, + }); + } + } + + window.customElements.define('doric-div', DoricElement); + +}(axios, doric)); +//# sourceMappingURL=index.js.map diff --git a/doric-h5/dist/index.js.map b/doric-h5/dist/index.js.map new file mode 100644 index 00000000..7e7d25d7 --- /dev/null +++ b/doric-h5/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":["../build/src/DoricPlugin.js","../build/src/plugins/ShaderPlugin.js","../build/src/shader/DoricViewNode.js","../build/src/shader/DoricStackNode.js","../build/src/shader/DoricVLayoutNode.js","../build/src/shader/DoricHLayoutNode.js","../build/src/shader/DoricTextNode.js","../build/src/shader/DoricImageNode.js","../build/src/shader/DoricScrollerNode.js","../build/src/plugins/ModalPlugin.js","../build/src/DoricRegistry.js","../build/src/DoricDriver.js","../build/src/DoricContext.js","../build/src/DoricElement.js","../build/index.js"],"sourcesContent":["export class DoricPlugin {\n constructor(context) {\n this.context = context;\n }\n}\n","import { DoricPlugin } from \"../DoricPlugin\";\nexport class ShaderPlugin extends DoricPlugin {\n render(ret) {\n this.context.rootNode.viewId = ret.id;\n this.context.rootNode.blend(ret.props);\n }\n}\n","import { acquireViewNode } from \"../DoricRegistry\";\nexport var LayoutSpec;\n(function (LayoutSpec) {\n LayoutSpec[LayoutSpec[\"EXACTLY\"] = 0] = \"EXACTLY\";\n LayoutSpec[LayoutSpec[\"WRAP_CONTENT\"] = 1] = \"WRAP_CONTENT\";\n LayoutSpec[LayoutSpec[\"AT_MOST\"] = 2] = \"AT_MOST\";\n})(LayoutSpec || (LayoutSpec = {}));\nconst SPECIFIED = 1;\nconst START = 1 << 1;\nconst END = 1 << 2;\nconst SHIFT_X = 0;\nconst SHIFT_Y = 4;\nexport const LEFT = (START | SPECIFIED) << SHIFT_X;\nexport const RIGHT = (END | SPECIFIED) << SHIFT_X;\nexport const TOP = (START | SPECIFIED) << SHIFT_Y;\nexport const BOTTOM = (END | SPECIFIED) << SHIFT_Y;\nexport const CENTER_X = SPECIFIED << SHIFT_X;\nexport const CENTER_Y = SPECIFIED << SHIFT_Y;\nexport const CENTER = CENTER_X | CENTER_Y;\nexport function toPixelString(v) {\n return `${v}px`;\n}\nexport function toRGBAString(color) {\n let strs = [];\n for (let i = 0; i < 32; i += 8) {\n strs.push(((color >> i) & 0xff).toString(16));\n }\n strs = strs.map(e => {\n if (e.length === 1) {\n return '0' + e;\n }\n return e;\n }).reverse();\n /// RGBA\n return `#${strs[1]}${strs[2]}${strs[3]}${strs[0]}`;\n}\nexport class DoricViewNode {\n constructor(context) {\n this.viewId = \"\";\n this.viewType = \"View\";\n this.layoutConfig = {\n widthSpec: LayoutSpec.EXACTLY,\n heightSpec: LayoutSpec.EXACTLY,\n alignment: 0,\n weight: 0,\n margin: {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }\n };\n this.padding = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n };\n this.frameWidth = 0;\n this.frameHeight = 0;\n this.offsetX = 0;\n this.offsetY = 0;\n this.context = context;\n }\n init(superNode) {\n this.superNode = superNode;\n if (this instanceof DoricSuperViewNode) {\n this.reusable = superNode.reusable;\n }\n this.view = this.build();\n }\n get paddingLeft() {\n return this.padding.left || 0;\n }\n get paddingRight() {\n return this.padding.right || 0;\n }\n get paddingTop() {\n return this.padding.top || 0;\n }\n get paddingBottom() {\n return this.padding.bottom || 0;\n }\n get borderWidth() {\n var _a;\n return ((_a = this.border) === null || _a === void 0 ? void 0 : _a.width) || 0;\n }\n blend(props) {\n for (let key in props) {\n this.blendProps(this.view, key, props[key]);\n }\n this.onBlended();\n this.layout();\n }\n onBlended() {\n }\n configBorder() {\n if (this.border) {\n this.view.style.borderStyle = \"solid\";\n this.view.style.borderWidth = toPixelString(this.border.width);\n this.view.style.borderColor = toRGBAString(this.border.color);\n }\n }\n configWidth() {\n switch (this.layoutConfig.widthSpec) {\n case LayoutSpec.WRAP_CONTENT:\n this.view.style.width = \"fit-content\";\n break;\n case LayoutSpec.AT_MOST:\n this.view.style.width = \"100%\";\n break;\n case LayoutSpec.EXACTLY:\n default:\n this.view.style.width = toPixelString(this.frameWidth\n - this.paddingLeft - this.paddingRight\n - this.borderWidth * 2);\n break;\n }\n }\n configHeight() {\n switch (this.layoutConfig.heightSpec) {\n case LayoutSpec.WRAP_CONTENT:\n this.view.style.height = \"fit-content\";\n break;\n case LayoutSpec.AT_MOST:\n this.view.style.height = \"100%\";\n break;\n case LayoutSpec.EXACTLY:\n default:\n this.view.style.height = toPixelString(this.frameHeight\n - this.paddingTop - this.paddingBottom\n - this.borderWidth * 2);\n break;\n }\n }\n configMargin() {\n if (this.layoutConfig.margin) {\n this.view.style.marginLeft = toPixelString(this.layoutConfig.margin.left || 0);\n this.view.style.marginRight = toPixelString(this.layoutConfig.margin.right || 0);\n this.view.style.marginTop = toPixelString(this.layoutConfig.margin.top || 0);\n this.view.style.marginBottom = toPixelString(this.layoutConfig.margin.bottom || 0);\n }\n }\n configPadding() {\n if (this.padding) {\n this.view.style.paddingLeft = toPixelString(this.paddingLeft);\n this.view.style.paddingRight = toPixelString(this.paddingRight);\n this.view.style.paddingTop = toPixelString(this.paddingTop);\n this.view.style.paddingBottom = toPixelString(this.paddingBottom);\n }\n }\n layout() {\n this.configMargin();\n this.configBorder();\n this.configPadding();\n this.configWidth();\n this.configHeight();\n }\n blendProps(v, propName, prop) {\n switch (propName) {\n case \"border\":\n this.border = prop;\n break;\n case \"padding\":\n this.padding = prop;\n break;\n case 'width':\n this.frameWidth = prop;\n break;\n case 'height':\n this.frameHeight = prop;\n break;\n case 'backgroundColor':\n this.backgroundColor = prop;\n break;\n case 'layoutConfig':\n const layoutConfig = prop;\n for (let key in layoutConfig) {\n Reflect.set(this.layoutConfig, key, Reflect.get(layoutConfig, key, layoutConfig));\n }\n break;\n case 'x':\n this.offsetX = prop;\n break;\n case 'y':\n this.offsetY = prop;\n break;\n case 'onClick':\n this.view.onclick = () => {\n this.callJSResponse(prop);\n };\n break;\n case 'corners':\n if (typeof prop === 'object') {\n this.view.style.borderTopLeftRadius = toPixelString(prop.leftTop);\n this.view.style.borderTopRightRadius = toPixelString(prop.rightTop);\n this.view.style.borderBottomRightRadius = toPixelString(prop.rightBottom);\n this.view.style.borderBottomLeftRadius = toPixelString(prop.leftBottom);\n }\n else {\n this.view.style.borderRadius = toPixelString(prop);\n }\n break;\n case 'shadow':\n const opacity = prop.opacity || 0;\n if (opacity > 0) {\n const offsetX = prop.offsetX || 0;\n const offsetY = prop.offsetY || 0;\n const shadowColor = prop.color || 0xff000000;\n const shadowRadius = prop.radius;\n const alpha = opacity * 255;\n this.view.style.boxShadow = `${toPixelString(offsetX)} ${toPixelString(offsetY)} ${toPixelString(shadowRadius)} ${toRGBAString((shadowColor & 0xffffff) | ((alpha & 0xff) << 24))} `;\n }\n else {\n this.view.style.boxShadow = \"\";\n }\n break;\n }\n }\n set backgroundColor(v) {\n this.view.style.backgroundColor = toRGBAString(v);\n }\n static create(context, type) {\n const viewNodeClass = acquireViewNode(type);\n if (viewNodeClass === undefined) {\n console.error(`Cannot find ViewNode for ${type}`);\n return undefined;\n }\n const ret = new viewNodeClass(context);\n ret.viewType = type;\n return ret;\n }\n getIdList() {\n const ids = [];\n let viewNode = this;\n do {\n ids.push(viewNode.viewId);\n viewNode = viewNode.superNode;\n } while (viewNode);\n return ids.reverse();\n }\n callJSResponse(funcId, ...args) {\n const argumentsList = ['__response__', this.getIdList(), funcId];\n for (let i = 1; i < arguments.length; i++) {\n argumentsList.push(arguments[i]);\n }\n Reflect.apply(this.context.invokeEntityMethod, this.context, argumentsList);\n }\n}\nexport class DoricSuperViewNode extends DoricViewNode {\n constructor() {\n super(...arguments);\n this.reusable = false;\n this.subModels = new Map;\n }\n blendProps(v, propName, prop) {\n if (propName === 'subviews') {\n if (prop instanceof Array) {\n prop.forEach((e) => {\n this.mixinSubModel(e);\n this.blendSubNode(e);\n });\n }\n }\n else {\n super.blendProps(v, propName, prop);\n }\n }\n mixinSubModel(subNode) {\n const oldValue = this.getSubModel(subNode.id);\n if (oldValue) {\n this.mixin(subNode, oldValue);\n }\n else {\n this.subModels.set(subNode.id, subNode);\n }\n }\n getSubModel(id) {\n return this.subModels.get(id);\n }\n mixin(src, target) {\n for (let key in src.props) {\n if (key === \"subviews\") {\n continue;\n }\n Reflect.set(target.props, key, Reflect.get(src.props, key));\n }\n }\n clearSubModels() {\n this.subModels.clear();\n }\n removeSubModel(id) {\n this.subModels.delete(id);\n }\n}\nexport class DoricGroupViewNode extends DoricSuperViewNode {\n constructor() {\n super(...arguments);\n this.childNodes = [];\n this.childViewIds = [];\n }\n blendProps(v, propName, prop) {\n if (propName === 'children') {\n if (prop instanceof Array) {\n this.childViewIds = prop;\n }\n }\n else {\n super.blendProps(v, propName, prop);\n }\n }\n blend(props) {\n super.blend(props);\n }\n onBlended() {\n super.onBlended();\n this.configChildNode();\n }\n configChildNode() {\n this.childViewIds.forEach((childViewId, index) => {\n const model = this.getSubModel(childViewId);\n if (model === undefined) {\n return;\n }\n if (index < this.childNodes.length) {\n const oldNode = this.childNodes[index];\n if (oldNode.viewId === childViewId) {\n //The same,skip\n }\n else {\n if (this.reusable) {\n if (oldNode.viewType === model.type) {\n //Same type,can be reused\n oldNode.viewId = childViewId;\n oldNode.blend(model.props);\n }\n else {\n //Replace this view\n this.view.removeChild(oldNode.view);\n const newNode = DoricViewNode.create(this.context, model.type);\n if (newNode === undefined) {\n return;\n }\n newNode.viewId = childViewId;\n newNode.init(this);\n newNode.blend(model.props);\n this.childNodes[index] = newNode;\n this.view.replaceChild(newNode.view, oldNode.view);\n }\n }\n else {\n //Find in remain nodes\n let position = -1;\n for (let start = index + 1; start < this.childNodes.length; start++) {\n if (childViewId === this.childNodes[start].viewId) {\n //Found\n position = start;\n break;\n }\n }\n if (position >= 0) {\n //Found swap idx,position\n const reused = this.childNodes[position];\n const abandoned = this.childNodes[index];\n this.childNodes[index] = reused;\n this.childNodes[position] = abandoned;\n this.view.removeChild(reused.view);\n this.view.insertBefore(reused.view, abandoned.view);\n this.view.removeChild(abandoned.view);\n if (position === this.view.childElementCount - 1) {\n this.view.appendChild(abandoned.view);\n }\n else {\n this.view.insertBefore(abandoned.view, this.view.children[position]);\n }\n }\n else {\n //Not found,insert\n const newNode = DoricViewNode.create(this.context, model.type);\n if (newNode === undefined) {\n return;\n }\n newNode.viewId = childViewId;\n newNode.init(this);\n newNode.blend(model.props);\n this.childNodes[index] = newNode;\n this.view.insertBefore(newNode.view, this.view.children[index]);\n }\n }\n }\n }\n else {\n //Insert\n const newNode = DoricViewNode.create(this.context, model.type);\n if (newNode === undefined) {\n return;\n }\n newNode.viewId = childViewId;\n newNode.init(this);\n newNode.blend(model.props);\n this.childNodes.push(newNode);\n this.view.appendChild(newNode.view);\n }\n });\n let size = this.childNodes.length;\n for (let idx = this.childViewIds.length; idx < size; idx++) {\n this.view.removeChild(this.childNodes[idx].view);\n }\n this.childNodes = this.childNodes.slice(0, this.childViewIds.length);\n }\n blendSubNode(model) {\n var _a;\n (_a = this.getSubNodeById(model.id)) === null || _a === void 0 ? void 0 : _a.blend(model.props);\n }\n getSubNodeById(viewId) {\n return this.childNodes.filter(e => e.viewId === viewId)[0];\n }\n}\n","import { DoricGroupViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString } from \"./DoricViewNode\";\nexport class DoricStackNode extends DoricGroupViewNode {\n build() {\n const ret = document.createElement('div');\n ret.style.position = \"relative\";\n return ret;\n }\n layout() {\n super.layout();\n this.configOffset();\n }\n configOffset() {\n this.childNodes.forEach(e => {\n e.view.style.position = \"absolute\";\n e.view.style.left = toPixelString(e.offsetX + this.paddingLeft);\n e.view.style.top = toPixelString(e.offsetY + this.paddingTop);\n const gravity = e.layoutConfig.alignment;\n if ((gravity & LEFT) === LEFT) {\n e.view.style.left = toPixelString(0);\n }\n else if ((gravity & RIGHT) === RIGHT) {\n e.view.style.left = toPixelString(this.view.offsetWidth - e.view.offsetWidth);\n }\n else if ((gravity & CENTER_X) === CENTER_X) {\n e.view.style.left = toPixelString(this.view.offsetWidth / 2 - e.view.offsetWidth / 2);\n }\n if ((gravity & TOP) === TOP) {\n e.view.style.top = toPixelString(0);\n }\n else if ((gravity & BOTTOM) === BOTTOM) {\n e.view.style.top = toPixelString(this.view.offsetHeight - e.view.offsetHeight);\n }\n else if ((gravity & CENTER_Y) === CENTER_Y) {\n e.view.style.top = toPixelString(this.view.offsetHeight / 2 - e.view.offsetHeight / 2);\n }\n });\n }\n}\n","import { DoricGroupViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString } from \"./DoricViewNode\";\nexport class DoricVLayoutNode extends DoricGroupViewNode {\n constructor() {\n super(...arguments);\n this.space = 0;\n this.gravity = 0;\n }\n build() {\n const ret = document.createElement('div');\n ret.style.display = \"flex\";\n ret.style.flexDirection = \"column\";\n ret.style.flexWrap = \"nowrap\";\n return ret;\n }\n blendProps(v, propName, prop) {\n if (propName === 'space') {\n this.space = prop;\n }\n else if (propName === 'gravity') {\n this.gravity = prop;\n if ((this.gravity & LEFT) === LEFT) {\n this.view.style.alignItems = \"flex-start\";\n }\n else if ((this.gravity & RIGHT) === RIGHT) {\n this.view.style.alignItems = \"flex-end\";\n }\n else if ((this.gravity & CENTER_X) === CENTER_X) {\n this.view.style.alignItems = \"center\";\n }\n if ((this.gravity & TOP) === TOP) {\n this.view.style.justifyContent = \"flex-start\";\n }\n else if ((this.gravity & BOTTOM) === BOTTOM) {\n this.view.style.justifyContent = \"flex-end\";\n }\n else if ((this.gravity & CENTER_Y) === CENTER_Y) {\n this.view.style.justifyContent = \"center\";\n }\n }\n else {\n super.blendProps(v, propName, prop);\n }\n }\n layout() {\n super.layout();\n this.childNodes.forEach((e, idx) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n e.view.style.flexShrink = \"0\";\n if ((_a = e.layoutConfig) === null || _a === void 0 ? void 0 : _a.weight) {\n e.view.style.flex = `${(_b = e.layoutConfig) === null || _b === void 0 ? void 0 : _b.weight}`;\n }\n e.view.style.marginTop = toPixelString(((_d = (_c = e.layoutConfig) === null || _c === void 0 ? void 0 : _c.margin) === null || _d === void 0 ? void 0 : _d.top) || 0);\n e.view.style.marginBottom = toPixelString((idx === this.childNodes.length - 1) ? 0 : this.space\n + (((_f = (_e = e.layoutConfig) === null || _e === void 0 ? void 0 : _e.margin) === null || _f === void 0 ? void 0 : _f.bottom) || 0));\n e.view.style.marginLeft = toPixelString(((_h = (_g = e.layoutConfig) === null || _g === void 0 ? void 0 : _g.margin) === null || _h === void 0 ? void 0 : _h.left) || 0);\n e.view.style.marginRight = toPixelString(((_k = (_j = e.layoutConfig) === null || _j === void 0 ? void 0 : _j.margin) === null || _k === void 0 ? void 0 : _k.right) || 0);\n });\n }\n}\n","import { DoricGroupViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString } from \"./DoricViewNode\";\nexport class DoricHLayoutNode extends DoricGroupViewNode {\n constructor() {\n super(...arguments);\n this.space = 0;\n this.gravity = 0;\n }\n build() {\n const ret = document.createElement('div');\n ret.style.display = \"flex\";\n ret.style.flexDirection = \"row\";\n ret.style.flexWrap = \"nowrap\";\n return ret;\n }\n blendProps(v, propName, prop) {\n if (propName === 'space') {\n this.space = prop;\n }\n else if (propName === 'gravity') {\n this.gravity = prop;\n this.gravity = prop;\n if ((this.gravity & LEFT) === LEFT) {\n this.view.style.justifyContent = \"flex-start\";\n }\n else if ((this.gravity & RIGHT) === RIGHT) {\n this.view.style.justifyContent = \"flex-end\";\n }\n else if ((this.gravity & CENTER_X) === CENTER_X) {\n this.view.style.justifyContent = \"center\";\n }\n if ((this.gravity & TOP) === TOP) {\n this.view.style.alignItems = \"flex-start\";\n }\n else if ((this.gravity & BOTTOM) === BOTTOM) {\n this.view.style.alignItems = \"flex-end\";\n }\n else if ((this.gravity & CENTER_Y) === CENTER_Y) {\n this.view.style.alignItems = \"center\";\n }\n }\n else {\n super.blendProps(v, propName, prop);\n }\n }\n layout() {\n super.layout();\n this.childNodes.forEach((e, idx) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n e.view.style.flexShrink = \"0\";\n if ((_a = e.layoutConfig) === null || _a === void 0 ? void 0 : _a.weight) {\n e.view.style.flex = `${(_b = e.layoutConfig) === null || _b === void 0 ? void 0 : _b.weight}`;\n }\n e.view.style.marginLeft = toPixelString(((_d = (_c = e.layoutConfig) === null || _c === void 0 ? void 0 : _c.margin) === null || _d === void 0 ? void 0 : _d.left) || 0);\n e.view.style.marginRight = toPixelString((idx === this.childNodes.length - 1) ? 0 : this.space\n + (((_f = (_e = e.layoutConfig) === null || _e === void 0 ? void 0 : _e.margin) === null || _f === void 0 ? void 0 : _f.right) || 0));\n e.view.style.marginTop = toPixelString(((_h = (_g = e.layoutConfig) === null || _g === void 0 ? void 0 : _g.margin) === null || _h === void 0 ? void 0 : _h.top) || 0);\n e.view.style.marginBottom = toPixelString(((_k = (_j = e.layoutConfig) === null || _j === void 0 ? void 0 : _j.margin) === null || _k === void 0 ? void 0 : _k.bottom) || 0);\n });\n }\n}\n","import { DoricViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString, toRGBAString } from \"./DoricViewNode\";\nexport class DoricTextNode extends DoricViewNode {\n build() {\n const div = document.createElement('div');\n div.style.display = \"flex\";\n this.textElement = document.createElement('span');\n div.appendChild(this.textElement);\n div.style.justifyContent = \"center\";\n div.style.alignItems = \"center\";\n return div;\n }\n blendProps(v, propName, prop) {\n switch (propName) {\n case 'text':\n this.textElement.innerText = prop;\n break;\n case 'textSize':\n v.style.fontSize = toPixelString(prop);\n break;\n case 'textColor':\n v.style.color = toRGBAString(prop);\n break;\n case 'textAlignment':\n const gravity = prop;\n if ((gravity & LEFT) === LEFT) {\n v.style.justifyContent = \"flex-start\";\n }\n else if ((gravity & RIGHT) === RIGHT) {\n v.style.justifyContent = \"flex-end\";\n }\n else if ((gravity & CENTER_X) === CENTER_X) {\n v.style.justifyContent = \"center\";\n }\n if ((gravity & TOP) === TOP) {\n v.style.alignItems = \"flex-start\";\n }\n else if ((gravity & BOTTOM) === BOTTOM) {\n v.style.alignItems = \"flex-end\";\n }\n else if ((gravity & CENTER_Y) === CENTER_Y) {\n v.style.alignItems = \"center\";\n }\n break;\n default:\n super.blendProps(v, propName, prop);\n break;\n }\n }\n}\n","import { DoricViewNode } from \"./DoricViewNode\";\nvar ScaleType;\n(function (ScaleType) {\n ScaleType[ScaleType[\"ScaleToFill\"] = 0] = \"ScaleToFill\";\n ScaleType[ScaleType[\"ScaleAspectFit\"] = 1] = \"ScaleAspectFit\";\n ScaleType[ScaleType[\"ScaleAspectFill\"] = 2] = \"ScaleAspectFill\";\n})(ScaleType || (ScaleType = {}));\nexport class DoricImageNode extends DoricViewNode {\n build() {\n const ret = document.createElement('img');\n ret.style.objectFit = \"fill\";\n return ret;\n }\n blendProps(v, propName, prop) {\n switch (propName) {\n case 'imageUrl':\n v.setAttribute('src', prop);\n break;\n case 'imageBase64':\n v.setAttribute('src', prop);\n break;\n case 'loadCallback':\n v.onload = () => {\n this.callJSResponse(prop, {\n width: v.width,\n height: v.height\n });\n };\n break;\n case 'scaleType':\n switch (prop) {\n case ScaleType.ScaleToFill:\n v.style.objectFit = \"fill\";\n break;\n case ScaleType.ScaleAspectFit:\n v.style.objectFit = \"contain\";\n break;\n case ScaleType.ScaleAspectFill:\n v.style.objectFit = \"cover\";\n break;\n }\n break;\n case 'isBlur':\n if (prop) {\n v.style.filter = 'blur(10px)';\n }\n else {\n v.style.filter = '';\n }\n break;\n default:\n super.blendProps(v, propName, prop);\n break;\n }\n }\n}\n","import { DoricSuperViewNode, DoricViewNode } from \"./DoricViewNode\";\nexport class DoricScrollerNode extends DoricSuperViewNode {\n constructor() {\n super(...arguments);\n this.childViewId = \"\";\n }\n build() {\n const ret = document.createElement('div');\n ret.style.overflow = \"scroll\";\n return ret;\n }\n blendProps(v, propName, prop) {\n if (propName === 'content') {\n this.childViewId = prop;\n }\n else {\n super.blendProps(v, propName, prop);\n }\n }\n blendSubNode(model) {\n var _a;\n (_a = this.childNode) === null || _a === void 0 ? void 0 : _a.blend(model.props);\n }\n getSubNodeById(viewId) {\n return viewId === this.childViewId ? this.childNode : undefined;\n }\n onBlended() {\n super.onBlended();\n const model = this.getSubModel(this.childViewId);\n if (model === undefined) {\n return;\n }\n if (this.childNode) {\n if (this.childNode.viewId === this.childViewId) {\n ///skip\n }\n else {\n if (this.reusable && this.childNode.viewType === model.type) {\n this.childNode.viewId = model.id;\n this.childNode.blend(model.props);\n }\n else {\n this.view.removeChild(this.childNode.view);\n const childNode = DoricViewNode.create(this.context, model.type);\n if (childNode === undefined) {\n return;\n }\n childNode.viewId = model.id;\n childNode.init(this);\n childNode.blend(model.props);\n this.view.appendChild(childNode.view);\n this.childNode = childNode;\n }\n }\n }\n else {\n const childNode = DoricViewNode.create(this.context, model.type);\n if (childNode === undefined) {\n return;\n }\n childNode.viewId = model.id;\n childNode.init(this);\n childNode.blend(model.props);\n this.view.appendChild(childNode.view);\n this.childNode = childNode;\n }\n }\n layout() {\n super.layout();\n }\n}\n","import { DoricPlugin } from '../DoricPlugin';\nimport { TOP, CENTER_Y, BOTTOM, toPixelString } from '../shader/DoricViewNode';\nexport class ModalPlugin extends DoricPlugin {\n toast(args) {\n const toastElement = document.createElement('div');\n toastElement.style.position = \"absolute\";\n toastElement.style.textAlign = \"center\";\n toastElement.style.width = \"100%\";\n const textElement = document.createElement('span');\n textElement.innerText = args.msg || \"\";\n textElement.style.backgroundColor = \"#777777\";\n textElement.style.color = \"white\";\n textElement.style.paddingLeft = '20px';\n textElement.style.paddingRight = '20px';\n textElement.style.paddingTop = '10px';\n textElement.style.paddingBottom = '10px';\n toastElement.appendChild(textElement);\n document.body.appendChild(toastElement);\n const gravity = args.gravity || BOTTOM;\n if ((gravity & TOP) == TOP) {\n toastElement.style.top = toPixelString(30);\n }\n else if ((gravity & BOTTOM) == BOTTOM) {\n toastElement.style.bottom = toPixelString(30);\n }\n else if ((gravity & CENTER_Y) == CENTER_Y) {\n toastElement.style.top = toPixelString(document.body.offsetHeight / 2 - toastElement.offsetHeight / 2);\n }\n setTimeout(() => {\n document.body.removeChild(toastElement);\n }, 2000);\n return Promise.resolve();\n }\n alert(args) {\n window.alert(args.msg || \"\");\n return Promise.resolve();\n }\n confirm(args) {\n if (window.confirm(args.msg || \"\")) {\n return Promise.resolve();\n }\n else {\n return Promise.reject();\n }\n }\n prompt(args) {\n const result = window.prompt(args.msg || \"\", args.defaultText);\n if (result) {\n return Promise.resolve(result);\n }\n else {\n return Promise.reject(result);\n }\n }\n}\n","import { ShaderPlugin } from \"./plugins/ShaderPlugin\";\nimport { DoricStackNode } from \"./shader/DoricStackNode\";\nimport { DoricVLayoutNode } from './shader/DoricVLayoutNode';\nimport { DoricHLayoutNode } from './shader/DoricHLayoutNode';\nimport { DoricTextNode } from \"./shader/DoricTextNode\";\nimport { DoricImageNode } from \"./shader/DoricImageNode\";\nimport { DoricScrollerNode } from \"./shader/DoricScrollerNode\";\nimport { ModalPlugin } from './plugins/ModalPlugin';\nconst bundles = new Map;\nconst plugins = new Map;\nconst nodes = new Map;\nexport function acquireJSBundle(name) {\n return bundles.get(name);\n}\nexport function registerJSBundle(name, bundle) {\n bundles.set(name, bundle);\n}\nexport function registerPlugin(name, plugin) {\n plugins.set(name, plugin);\n}\nexport function acquirePlugin(name) {\n return plugins.get(name);\n}\nexport function registerViewNode(name, node) {\n nodes.set(name, node);\n}\nexport function acquireViewNode(name) {\n return nodes.get(name);\n}\nregisterPlugin('shader', ShaderPlugin);\nregisterPlugin('modal', ModalPlugin);\nregisterViewNode('Stack', DoricStackNode);\nregisterViewNode('VLayout', DoricVLayoutNode);\nregisterViewNode('HLayout', DoricHLayoutNode);\nregisterViewNode('Text', DoricTextNode);\nregisterViewNode('Image', DoricImageNode);\nregisterViewNode('Scroller', DoricScrollerNode);\n","import { jsCallResolve, jsCallReject, jsCallbackTimer } from 'doric/src/runtime/sandbox';\nimport { acquireJSBundle, acquirePlugin } from './DoricRegistry';\nimport { getDoricContext } from './DoricContext';\nlet __scriptId__ = 0;\nfunction getScriptId() {\n return `script_${__scriptId__++}`;\n}\nconst originSetTimeout = window.setTimeout;\nconst originClearTimeout = window.clearTimeout;\nconst originSetInterval = window.setInterval;\nconst originClearInterval = window.clearInterval;\nconst timers = new Map;\nexport function injectGlobalObject(name, value) {\n Reflect.set(window, name, value, window);\n}\nexport function loadJS(script) {\n const scriptElement = document.createElement('script');\n scriptElement.text = script;\n scriptElement.id = getScriptId();\n document.body.appendChild(scriptElement);\n}\nfunction packageModuleScript(name, content) {\n return `Reflect.apply(doric.jsRegisterModule,this,[${name},Reflect.apply(function(__module){(function(module,exports,require,setTimeout,setInterval,clearTimeout,clearInterval){\n${content}\n})(__module,__module.exports,doric.__require__,doricSetTimeout,doricSetInterval,doricClearTimeout,doricClearInterval);\nreturn __module.exports;},this,[{exports:{}}])])`;\n}\nfunction packageCreateContext(contextId, content) {\n return `Reflect.apply(function(doric,context,Entry,require,exports,setTimeout,setInterval,clearTimeout,clearInterval){\n${content}\n},doric.jsObtainContext(\"${contextId}\"),[undefined,doric.jsObtainContext(\"${contextId}\"),doric.jsObtainEntry(\"${contextId}\"),doric.__require__,{},doricSetTimeout,doricSetInterval,doricClearTimeout,doricClearInterval])`;\n}\nfunction initDoric() {\n injectGlobalObject(\"nativeEmpty\", () => undefined);\n injectGlobalObject('nativeLog', (type, message) => {\n switch (type) {\n case 'd':\n console.log(message);\n break;\n case 'w':\n console.warn(message);\n break;\n case 'e':\n console.error(message);\n break;\n }\n });\n injectGlobalObject('nativeRequire', (moduleName) => {\n const bundle = acquireJSBundle(moduleName);\n if (bundle === undefined || bundle.length === 0) {\n console.log(`Cannot require JS Bundle :${moduleName}`);\n return false;\n }\n else {\n loadJS(packageModuleScript(moduleName, packageModuleScript(name, bundle)));\n return true;\n }\n });\n injectGlobalObject('nativeBridge', (contextId, namespace, method, callbackId, args) => {\n const pluginClass = acquirePlugin(namespace);\n const doricContext = getDoricContext(contextId);\n if (pluginClass === undefined) {\n console.error(`Cannot find Plugin:${namespace}`);\n return false;\n }\n if (doricContext === undefined) {\n console.error(`Cannot find Doric Context:${contextId}`);\n return false;\n }\n let plugin = doricContext.pluginInstances.get(namespace);\n if (plugin === undefined) {\n plugin = new pluginClass(doricContext);\n doricContext.pluginInstances.set(namespace, plugin);\n }\n if (!Reflect.has(plugin, method)) {\n console.error(`Cannot find Method:${method} in plugin ${namespace}`);\n return false;\n }\n const pluginMethod = Reflect.get(plugin, method, plugin);\n if (typeof pluginMethod !== 'function') {\n console.error(`Plugin ${namespace}'s property ${method}'s type is ${typeof pluginMethod} not function,`);\n }\n const ret = Reflect.apply(pluginMethod, plugin, [args]);\n if (ret instanceof Promise) {\n ret.then(e => {\n jsCallResolve(contextId, callbackId, e);\n }, e => {\n jsCallReject(contextId, callbackId, e);\n });\n }\n else if (ret !== undefined) {\n jsCallResolve(contextId, callbackId, ret);\n }\n return true;\n });\n injectGlobalObject('nativeSetTimer', (timerId, time, repeat) => {\n if (repeat) {\n const handleId = originSetInterval(() => {\n jsCallbackTimer(timerId);\n }, time);\n timers.set(timerId, { handleId, repeat });\n }\n else {\n const handleId = originSetTimeout(() => {\n jsCallbackTimer(timerId);\n }, time);\n timers.set(timerId, { handleId, repeat });\n }\n });\n injectGlobalObject('nativeClearTimer', (timerId) => {\n const timerInfo = timers.get(timerId);\n if (timerInfo) {\n if (timerInfo.repeat) {\n originClearInterval(timerInfo.handleId);\n }\n else {\n originClearTimeout(timerInfo.handleId);\n }\n }\n });\n}\nexport function createContext(contextId, content) {\n loadJS(packageCreateContext(contextId, content));\n}\ninitDoric();\n","import { jsObtainContext, jsCallEntityMethod } from 'doric/src/runtime/sandbox';\nimport { createContext } from \"./DoricDriver\";\nimport { DoricStackNode } from './shader/DoricStackNode';\nconst doricContexts = new Map;\nlet __contextId__ = 0;\nfunction getContextId() {\n return `context_${__contextId__++}`;\n}\nexport function getDoricContext(contextId) {\n return doricContexts.get(contextId);\n}\nexport class DoricContext {\n constructor(content) {\n this.contextId = getContextId();\n this.pluginInstances = new Map;\n createContext(this.contextId, content);\n doricContexts.set(this.contextId, this);\n this.rootNode = new DoricStackNode(this);\n }\n get panel() {\n var _a;\n return (_a = jsObtainContext(this.contextId)) === null || _a === void 0 ? void 0 : _a.entity;\n }\n invokeEntityMethod(method, ...otherArgs) {\n const argumentsList = [this.contextId];\n for (let i = 0; i < arguments.length; i++) {\n argumentsList.push(arguments[i]);\n }\n Reflect.apply(jsCallEntityMethod, this.panel, argumentsList);\n }\n init(frame, extra) {\n this.invokeEntityMethod(\"__init__\", frame, extra ? JSON.stringify(extra) : undefined);\n }\n}\n","import axios from 'axios';\nimport { DoricContext } from './DoricContext';\nexport class DoricElement extends HTMLElement {\n constructor() {\n super();\n this.source = this.getAttribute('src') || \"\";\n this.alias = this.getAttribute('alias') || this.source;\n axios.get(this.source).then(result => {\n this.load(result.data);\n });\n }\n load(content) {\n this.context = new DoricContext(content);\n const divElement = document.createElement('div');\n divElement.style.height = '100%';\n this.append(divElement);\n this.context.rootNode.view = divElement;\n this.context.init({\n width: divElement.offsetWidth,\n height: divElement.offsetHeight,\n });\n }\n}\n","import { DoricElement } from './src/DoricElement';\nwindow.customElements.define('doric-div', DoricElement);\n"],"names":["jsCallResolve","jsCallReject","jsCallbackTimer","jsObtainContext","jsCallEntityMethod"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"} \ No newline at end of file diff --git a/doric-h5/index.html b/doric-h5/index.html new file mode 100644 index 00000000..6d8641d6 --- /dev/null +++ b/doric-h5/index.html @@ -0,0 +1,37 @@ + + + + + + + + Doric Playground + + + + + +
+ + +
+ + + + + \ No newline at end of file diff --git a/doric-h5/index.ts b/doric-h5/index.ts new file mode 100644 index 00000000..61286046 --- /dev/null +++ b/doric-h5/index.ts @@ -0,0 +1,3 @@ +import { DoricElement } from './src/DoricElement' + +window.customElements.define('doric-div', DoricElement); \ No newline at end of file diff --git a/doric-h5/package-lock.json b/doric-h5/package-lock.json new file mode 100644 index 00000000..aad8fe6a --- /dev/null +++ b/doric-h5/package-lock.json @@ -0,0 +1,174 @@ +{ + "name": "doric-h5", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "12.12.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.20.tgz", + "integrity": "sha512-VAe+DiwpnC/g448uN+/3gRl4th0BTdrR9gSLIOHA+SUQskaYZQDOHG7xmjiE7JUhjbXnbXytf6Ih+/pA6CtMFQ==" + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "doric": { + "version": "file:../doric/doric-js", + "requires": { + "@types/ws": "^6.0.4", + "reflect-metadata": "^0.1.13", + "rollup": "^1.27.12", + "rollup-plugin-node-resolve": "^5.2.0", + "tslib": "^1.10.0", + "typescript": "^3.7.3", + "ws": "^7.2.0" + } + }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "is-reference": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", + "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", + "requires": { + "@types/estree": "0.0.39" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + } + } + }, + "magic-string": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", + "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "resolve": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.0.tgz", + "integrity": "sha512-uviWSi5N67j3t3UKFxej1loCH0VZn5XuqdNxoLShPcYPw6cUZn74K1VRj+9myynRX03bxIBEkwlkob/ujLsJVw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "rollup-plugin-commonjs": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", + "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", + "requires": { + "estree-walker": "^0.6.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", + "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", + "requires": { + "rollup-pluginutils": "^2.5.0" + } + }, + "rollup-plugin-node-resolve": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", + "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "requires": { + "estree-walker": "^0.6.1" + } + }, + "sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==" + }, + "tsc": { + "version": "1.20150623.0", + "resolved": "https://registry.npmjs.org/tsc/-/tsc-1.20150623.0.tgz", + "integrity": "sha1-Trw8d04WkUjLx2inNCUz8ILHpuU=" + }, + "typescript": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.3.tgz", + "integrity": "sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw==" + } + } +} diff --git a/doric-h5/package.json b/doric-h5/package.json new file mode 100644 index 00000000..d74f09c2 --- /dev/null +++ b/doric-h5/package.json @@ -0,0 +1,29 @@ +{ + "name": "doric-h5", + "version": "0.1.0", + "description": "Doric library for html", + "main": "build/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "tsc -p .&& rollup -c" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/doric-pub/doric-h5.git" + }, + "author": "pengfeizhou", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/doric-pub/doric-h5/issues" + }, + "homepage": "https://github.com/doric-pub/doric-h5#readme", + "dependencies": { + "axios": "^0.19.0", + "doric": "file:../doric/doric-js", + "rollup-plugin-commonjs": "^10.1.0", + "rollup-plugin-json": "^4.0.0", + "rollup-plugin-node-resolve": "^5.2.0", + "tsc": "^1.20150623.0", + "typescript": "^3.7.3" + } +} diff --git a/doric-h5/rollup.config.js b/doric-h5/rollup.config.js new file mode 100644 index 00000000..7fa9e196 --- /dev/null +++ b/doric-h5/rollup.config.js @@ -0,0 +1,48 @@ +import resolve from 'rollup-plugin-node-resolve' +import commonjs from 'rollup-plugin-commonjs' +import jsonPlugin from 'rollup-plugin-json' +import fs from 'fs' +import path from 'path' + +const sandboxBundle = fs.readFileSync(path.resolve("./node_modules/doric/bundle/doric-sandbox.js"), 'utf-8') + +const doricLibBundle = fs.readFileSync(path.resolve("./node_modules/doric/bundle/doric-lib.js"), 'utf-8') + +const builtinScript = ` +/**++++++++SandBox++++++++*/ +${sandboxBundle} +/**--------SandBox--------*/ + +/**++++++++Lib++++++++*/ +Reflect.apply(doric.jsRegisterModule,this,["doric",Reflect.apply(function(__module){(function(module,exports,require){ +${doricLibBundle} +})(__module,__module.exports,doric.__require__); +return __module.exports; +},this,[{exports:{}}])]); +/**--------Lib--------*/ + ` + +export default { + input: `build/index.js`, + output: { + format: "iife", + name: "index", + file: `dist/index.js`, + sourcemap: true, + banner: builtinScript, + globals: { + doric: "doric_lib", + 'doric/src/runtime/sandbox': 'doric', + }, + }, + plugins: [ + resolve({ mainFields: ["jsnext"] }), + commonjs(), + jsonPlugin(), + ], + external: ['axios', 'reflect-metadata', 'doric'], + onwarn: function (warning) { + if (warning.code === 'THIS_IS_UNDEFINED') { return; } + console.warn(warning.message); + }, +} \ No newline at end of file diff --git a/doric-h5/src/DoricContext.ts b/doric-h5/src/DoricContext.ts new file mode 100644 index 00000000..fb475006 --- /dev/null +++ b/doric-h5/src/DoricContext.ts @@ -0,0 +1,46 @@ +import { jsObtainContext, jsCallEntityMethod } from 'doric/src/runtime/sandbox' +import { Panel } from 'doric' +import { DoricPlugin } from "./DoricPlugin" +import { createContext } from "./DoricDriver" +import { DoricStackNode } from './shader/DoricStackNode' +const doricContexts: Map = new Map + +let __contextId__ = 0 +function getContextId() { + return `context_${__contextId__++}` +} + +export function getDoricContext(contextId: string) { + return doricContexts.get(contextId) +} + +export class DoricContext { + contextId = getContextId() + pluginInstances: Map = new Map + rootNode: DoricStackNode + constructor(content: string) { + createContext(this.contextId, content) + doricContexts.set(this.contextId, this) + this.rootNode = new DoricStackNode(this) + } + + get panel() { + return jsObtainContext(this.contextId)?.entity as Panel + } + + invokeEntityMethod(method: string, ...otherArgs: any) { + const argumentsList: any = [this.contextId] + for (let i = 0; i < arguments.length; i++) { + argumentsList.push(arguments[i]) + } + Reflect.apply(jsCallEntityMethod, this.panel, argumentsList) + } + + init(frame: { + width: number, + height: number, + }, extra?: object) { + this.invokeEntityMethod("__init__", frame, extra ? JSON.stringify(extra) : undefined) + } + +} \ No newline at end of file diff --git a/doric-h5/src/DoricDriver.ts b/doric-h5/src/DoricDriver.ts new file mode 100644 index 00000000..0e01fc4d --- /dev/null +++ b/doric-h5/src/DoricDriver.ts @@ -0,0 +1,137 @@ +import { jsCallResolve, jsCallReject, jsCallbackTimer } from 'doric/src/runtime/sandbox' +import { acquireJSBundle, acquirePlugin } from './DoricRegistry' +import { getDoricContext } from './DoricContext' +import { DoricPlugin } from './DoricPlugin' + +let __scriptId__ = 0 +function getScriptId() { + return `script_${__scriptId__++}` +} + +const originSetTimeout = window.setTimeout +const originClearTimeout = window.clearTimeout +const originSetInterval = window.setInterval +const originClearInterval = window.clearInterval + +const timers: Map = new Map + +export function injectGlobalObject(name: string, value: any) { + Reflect.set(window, name, value, window) +} + +export function loadJS(script: string) { + const scriptElement = document.createElement('script') + scriptElement.text = script + scriptElement.id = getScriptId() + document.body.appendChild(scriptElement) +} + +function packageModuleScript(name: string, content: string) { + return `Reflect.apply(doric.jsRegisterModule,this,[${name},Reflect.apply(function(__module){(function(module,exports,require,setTimeout,setInterval,clearTimeout,clearInterval){ +${content} +})(__module,__module.exports,doric.__require__,doricSetTimeout,doricSetInterval,doricClearTimeout,doricClearInterval); +return __module.exports;},this,[{exports:{}}])])` +} + +function packageCreateContext(contextId: string, content: string) { + return `Reflect.apply(function(doric,context,Entry,require,exports,setTimeout,setInterval,clearTimeout,clearInterval){ +${content} +},doric.jsObtainContext("${contextId}"),[undefined,doric.jsObtainContext("${contextId}"),doric.jsObtainEntry("${contextId}"),doric.__require__,{},doricSetTimeout,doricSetInterval,doricClearTimeout,doricClearInterval])` +} + +function initDoric() { + injectGlobalObject("nativeEmpty", () => undefined) + + injectGlobalObject('nativeLog', (type: 'd' | 'w' | 'e', message: string) => { + switch (type) { + case 'd': + console.log(message) + break + case 'w': + console.warn(message) + break + case 'e': + console.error(message) + break + } + }) + + injectGlobalObject('nativeRequire', (moduleName: string) => { + const bundle = acquireJSBundle(moduleName) + if (bundle === undefined || bundle.length === 0) { + console.log(`Cannot require JS Bundle :${moduleName}`) + return false + } else { + loadJS(packageModuleScript(moduleName, packageModuleScript(name, bundle))) + return true + } + }) + injectGlobalObject('nativeBridge', (contextId: string, namespace: string, method: string, callbackId: string, args?: any) => { + const pluginClass = acquirePlugin(namespace) + const doricContext = getDoricContext(contextId) + if (pluginClass === undefined) { + console.error(`Cannot find Plugin:${namespace}`) + return false + } + if (doricContext === undefined) { + console.error(`Cannot find Doric Context:${contextId}`) + return false + } + let plugin = doricContext.pluginInstances.get(namespace) + if (plugin === undefined) { + plugin = new pluginClass(doricContext) as DoricPlugin + doricContext.pluginInstances.set(namespace, plugin) + } + if (!Reflect.has(plugin, method)) { + console.error(`Cannot find Method:${method} in plugin ${namespace}`) + return false + } + const pluginMethod = Reflect.get(plugin, method, plugin) + if (typeof pluginMethod !== 'function') { + console.error(`Plugin ${namespace}'s property ${method}'s type is ${typeof pluginMethod} not function,`) + } + const ret = Reflect.apply(pluginMethod, plugin, [args]) + if (ret instanceof Promise) { + ret.then( + e => { + jsCallResolve(contextId, callbackId, e) + }, + e => { + jsCallReject(contextId, callbackId, e) + }) + } else if (ret !== undefined) { + jsCallResolve(contextId, callbackId, ret) + } + return true + }) + + injectGlobalObject('nativeSetTimer', (timerId: number, time: number, repeat: boolean) => { + if (repeat) { + const handleId = originSetInterval(() => { + jsCallbackTimer(timerId) + }, time) + timers.set(timerId, { handleId, repeat }) + } else { + const handleId = originSetTimeout(() => { + jsCallbackTimer(timerId) + }, time) + timers.set(timerId, { handleId, repeat }) + } + }) + injectGlobalObject('nativeClearTimer', (timerId: number) => { + const timerInfo = timers.get(timerId) + if (timerInfo) { + if (timerInfo.repeat) { + originClearInterval(timerInfo.handleId) + } else { + originClearTimeout(timerInfo.handleId) + } + } + }) +} + +export function createContext(contextId: string, content: string) { + loadJS(packageCreateContext(contextId, content)) +} + +initDoric() \ No newline at end of file diff --git a/doric-h5/src/DoricElement.ts b/doric-h5/src/DoricElement.ts new file mode 100644 index 00000000..60786c55 --- /dev/null +++ b/doric-h5/src/DoricElement.ts @@ -0,0 +1,30 @@ +import axios from 'axios' +import { DoricContext } from './DoricContext' + + +export class DoricElement extends HTMLElement { + source: string + alias: string + context?: DoricContext + constructor() { + super() + this.source = this.getAttribute('src') || "" + this.alias = this.getAttribute('alias') || this.source + axios.get(this.source).then(result => { + this.load(result.data) + }) + } + + load(content: string) { + this.context = new DoricContext(content) + + const divElement = document.createElement('div') + divElement.style.height = '100%' + this.append(divElement) + this.context.rootNode.view = divElement + this.context.init({ + width: divElement.offsetWidth, + height: divElement.offsetHeight, + }) + } +} \ No newline at end of file diff --git a/doric-h5/src/DoricPlugin.ts b/doric-h5/src/DoricPlugin.ts new file mode 100644 index 00000000..5161e47f --- /dev/null +++ b/doric-h5/src/DoricPlugin.ts @@ -0,0 +1,9 @@ +import { DoricContext } from "./DoricContext" + +export type DoricPluginClass = { new(...args: any[]): {} } +export class DoricPlugin { + context: DoricContext + constructor(context: DoricContext) { + this.context = context + } +} \ No newline at end of file diff --git a/doric-h5/src/DoricRegistry.ts b/doric-h5/src/DoricRegistry.ts new file mode 100644 index 00000000..9d0c6980 --- /dev/null +++ b/doric-h5/src/DoricRegistry.ts @@ -0,0 +1,51 @@ +import { DoricPluginClass } from "./DoricPlugin" +import { ShaderPlugin } from "./plugins/ShaderPlugin" +import { DoricViewNodeClass } from "./shader/DoricViewNode" +import { DoricStackNode } from "./shader/DoricStackNode" +import { DoricVLayoutNode } from './shader/DoricVLayoutNode' +import { DoricHLayoutNode } from './shader/DoricHLayoutNode' +import { DoricTextNode } from "./shader/DoricTextNode" +import { DoricImageNode } from "./shader/DoricImageNode" +import { DoricScrollerNode } from "./shader/DoricScrollerNode" +import { ModalPlugin } from './plugins/ModalPlugin' + +const bundles: Map = new Map + +const plugins: Map = new Map + +const nodes: Map = new Map + + +export function acquireJSBundle(name: string) { + return bundles.get(name) +} + +export function registerJSBundle(name: string, bundle: string) { + bundles.set(name, bundle) +} + +export function registerPlugin(name: string, plugin: DoricPluginClass) { + plugins.set(name, plugin) +} + +export function acquirePlugin(name: string) { + return plugins.get(name) +} + +export function registerViewNode(name: string, node: DoricViewNodeClass) { + nodes.set(name, node) +} + +export function acquireViewNode(name: string) { + return nodes.get(name) +} + +registerPlugin('shader', ShaderPlugin) +registerPlugin('modal', ModalPlugin) + +registerViewNode('Stack', DoricStackNode) +registerViewNode('VLayout', DoricVLayoutNode) +registerViewNode('HLayout', DoricHLayoutNode) +registerViewNode('Text', DoricTextNode) +registerViewNode('Image', DoricImageNode) +registerViewNode('Scroller', DoricScrollerNode) \ No newline at end of file diff --git a/doric-h5/src/plugins/ModalPlugin.ts b/doric-h5/src/plugins/ModalPlugin.ts new file mode 100644 index 00000000..d8726044 --- /dev/null +++ b/doric-h5/src/plugins/ModalPlugin.ts @@ -0,0 +1,72 @@ +import { DoricPlugin } from '../DoricPlugin' +import { TOP, CENTER_Y, BOTTOM, toPixelString } from '../shader/DoricViewNode' + +export class ModalPlugin extends DoricPlugin { + toast(args: { + msg?: string, + gravity?: number + }) { + const toastElement = document.createElement('div') + toastElement.style.position = "absolute" + toastElement.style.textAlign = "center" + toastElement.style.width = "100%" + + const textElement = document.createElement('span') + textElement.innerText = args.msg || "" + textElement.style.backgroundColor = "#777777" + textElement.style.color = "white" + textElement.style.paddingLeft = '20px' + textElement.style.paddingRight = '20px' + textElement.style.paddingTop = '10px' + textElement.style.paddingBottom = '10px' + toastElement.appendChild(textElement) + document.body.appendChild(toastElement) + const gravity = args.gravity || BOTTOM + if ((gravity & TOP) == TOP) { + toastElement.style.top = toPixelString(30) + } else if ((gravity & BOTTOM) == BOTTOM) { + toastElement.style.bottom = toPixelString(30) + } else if ((gravity & CENTER_Y) == CENTER_Y) { + toastElement.style.top = toPixelString(document.body.offsetHeight / 2 - toastElement.offsetHeight / 2) + } + setTimeout(() => { + document.body.removeChild(toastElement) + }, 2000) + return Promise.resolve() + } + alert(args: { + title?: string, + msg?: string, + okLabel?: string, + }) { + window.alert(args.msg || "") + return Promise.resolve() + } + confirm(args: { + title?: string, + msg?: string, + okLabel?: string, + cancelLabel?: string, + }) { + if (window.confirm(args.msg || "")) { + return Promise.resolve() + } else { + return Promise.reject() + } + } + prompt(args: { + title?: string, + msg?: string, + okLabel?: string, + cancelLabel?: string, + defaultText?: string + text?: string + }) { + const result = window.prompt(args.msg || "", args.defaultText) + if (result) { + return Promise.resolve(result) + } else { + return Promise.reject(result) + } + } +} \ No newline at end of file diff --git a/doric-h5/src/plugins/ShaderPlugin.ts b/doric-h5/src/plugins/ShaderPlugin.ts new file mode 100644 index 00000000..72af6939 --- /dev/null +++ b/doric-h5/src/plugins/ShaderPlugin.ts @@ -0,0 +1,9 @@ +import { DoricPlugin } from "../DoricPlugin"; +import { DVModel } from "../shader/DoricViewNode"; + +export class ShaderPlugin extends DoricPlugin { + render(ret: DVModel) { + this.context.rootNode.viewId = ret.id + this.context.rootNode.blend(ret.props) + } +} \ No newline at end of file diff --git a/doric-h5/src/shader/DoricHLayoutNode.ts b/doric-h5/src/shader/DoricHLayoutNode.ts new file mode 100644 index 00000000..4892776b --- /dev/null +++ b/doric-h5/src/shader/DoricHLayoutNode.ts @@ -0,0 +1,53 @@ +import { DoricGroupViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString } from "./DoricViewNode"; + +export class DoricHLayoutNode extends DoricGroupViewNode { + space = 0 + gravity = 0 + build() { + const ret = document.createElement('div') + ret.style.display = "flex" + ret.style.flexDirection = "row" + ret.style.flexWrap = "nowrap" + return ret + } + + blendProps(v: HTMLElement, propName: string, prop: any) { + if (propName === 'space') { + this.space = prop + } else if (propName === 'gravity') { + this.gravity = prop + this.gravity = prop + if ((this.gravity & LEFT) === LEFT) { + this.view.style.justifyContent = "flex-start" + } else if ((this.gravity & RIGHT) === RIGHT) { + this.view.style.justifyContent = "flex-end" + } else if ((this.gravity & CENTER_X) === CENTER_X) { + this.view.style.justifyContent = "center" + } + if ((this.gravity & TOP) === TOP) { + this.view.style.alignItems = "flex-start" + } else if ((this.gravity & BOTTOM) === BOTTOM) { + this.view.style.alignItems = "flex-end" + } else if ((this.gravity & CENTER_Y) === CENTER_Y) { + this.view.style.alignItems = "center" + } + } else { + super.blendProps(v, propName, prop) + } + } + layout() { + super.layout() + this.childNodes.forEach((e, idx) => { + e.view.style.flexShrink = "0" + if (e.layoutConfig?.weight) { + e.view.style.flex = `${e.layoutConfig?.weight}` + } + e.view.style.marginLeft = toPixelString(e.layoutConfig?.margin?.left || 0) + e.view.style.marginRight = toPixelString( + (idx === this.childNodes.length - 1) ? 0 : this.space + + (e.layoutConfig?.margin?.right || 0)) + e.view.style.marginTop = toPixelString(e.layoutConfig?.margin?.top || 0) + e.view.style.marginBottom = toPixelString(e.layoutConfig?.margin?.bottom || 0) + }) + } +} \ No newline at end of file diff --git a/doric-h5/src/shader/DoricImageNode.ts b/doric-h5/src/shader/DoricImageNode.ts new file mode 100644 index 00000000..2fb98ce0 --- /dev/null +++ b/doric-h5/src/shader/DoricImageNode.ts @@ -0,0 +1,59 @@ +import { DoricViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString, toRGBAString } from "./DoricViewNode"; + +enum ScaleType { + ScaleToFill = 0, + ScaleAspectFit, + ScaleAspectFill, +} + +export class DoricImageNode extends DoricViewNode { + + build(): HTMLElement { + const ret = document.createElement('img') + ret.style.objectFit = "fill" + return ret + } + + blendProps(v: HTMLImageElement, propName: string, prop: any) { + switch (propName) { + case 'imageUrl': + v.setAttribute('src', prop) + break + case 'imageBase64': + v.setAttribute('src', prop) + break + case 'loadCallback': + v.onload = () => { + this.callJSResponse(prop, { + width: v.width, + height: v.height + }) + } + break + case 'scaleType': + switch (prop) { + case ScaleType.ScaleToFill: + v.style.objectFit = "fill" + break + case ScaleType.ScaleAspectFit: + v.style.objectFit = "contain" + break + case ScaleType.ScaleAspectFill: + v.style.objectFit = "cover" + break + } + break + case 'isBlur': + if (prop) { + v.style.filter = 'blur(8px)' + } else { + v.style.filter = '' + } + break + default: + super.blendProps(v, propName, prop) + break + } + } + +} \ No newline at end of file diff --git a/doric-h5/src/shader/DoricScrollerNode.ts b/doric-h5/src/shader/DoricScrollerNode.ts new file mode 100644 index 00000000..269006f3 --- /dev/null +++ b/doric-h5/src/shader/DoricScrollerNode.ts @@ -0,0 +1,69 @@ +import { LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString, DoricSuperViewNode, DVModel, DoricViewNode } from "./DoricViewNode"; + +export class DoricScrollerNode extends DoricSuperViewNode { + + + childViewId: string = "" + childNode?: DoricViewNode + build() { + const ret = document.createElement('div') + ret.style.overflow = "scroll" + return ret + } + blendProps(v: HTMLElement, propName: string, prop: any) { + if (propName === 'content') { + this.childViewId = prop + } else { + super.blendProps(v, propName, prop) + } + } + blendSubNode(model: DVModel): void { + this.childNode?.blend(model.props) + } + getSubNodeById(viewId: string) { + return viewId === this.childViewId ? this.childNode : undefined + } + + onBlended() { + super.onBlended() + const model = this.getSubModel(this.childViewId) + if (model === undefined) { + return + } + if (this.childNode) { + if (this.childNode.viewId === this.childViewId) { + ///skip + } else { + if (this.reusable && this.childNode.viewType === model.type) { + this.childNode.viewId = model.id + this.childNode.blend(model.props) + } else { + this.view.removeChild(this.childNode.view) + const childNode = DoricViewNode.create(this.context, model.type) + if (childNode === undefined) { + return + } + childNode.viewId = model.id + childNode.init(this) + childNode.blend(model.props) + this.view.appendChild(childNode.view) + this.childNode = childNode + } + } + } else { + const childNode = DoricViewNode.create(this.context, model.type) + if (childNode === undefined) { + return + } + childNode.viewId = model.id + childNode.init(this) + childNode.blend(model.props) + this.view.appendChild(childNode.view) + this.childNode = childNode + } + } + + layout() { + super.layout() + } +} \ No newline at end of file diff --git a/doric-h5/src/shader/DoricStackNode.ts b/doric-h5/src/shader/DoricStackNode.ts new file mode 100644 index 00000000..da94b20b --- /dev/null +++ b/doric-h5/src/shader/DoricStackNode.ts @@ -0,0 +1,38 @@ +import { DoricGroupViewNode, LayoutSpec, FrameSize, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString } from "./DoricViewNode"; + +export class DoricStackNode extends DoricGroupViewNode { + + build() { + const ret = document.createElement('div') + ret.style.position = "relative" + return ret + } + + layout() { + super.layout() + this.configOffset() + } + + configOffset() { + this.childNodes.forEach(e => { + e.view.style.position = "absolute" + e.view.style.left = toPixelString(e.offsetX + this.paddingLeft) + e.view.style.top = toPixelString(e.offsetY + this.paddingTop) + const gravity = e.layoutConfig.alignment + if ((gravity & LEFT) === LEFT) { + e.view.style.left = toPixelString(0) + } else if ((gravity & RIGHT) === RIGHT) { + e.view.style.left = toPixelString(this.view.offsetWidth - e.view.offsetWidth) + } else if ((gravity & CENTER_X) === CENTER_X) { + e.view.style.left = toPixelString(this.view.offsetWidth / 2 - e.view.offsetWidth / 2) + } + if ((gravity & TOP) === TOP) { + e.view.style.top = toPixelString(0) + } else if ((gravity & BOTTOM) === BOTTOM) { + e.view.style.top = toPixelString(this.view.offsetHeight - e.view.offsetHeight) + } else if ((gravity & CENTER_Y) === CENTER_Y) { + e.view.style.top = toPixelString(this.view.offsetHeight / 2 - e.view.offsetHeight / 2) + } + }) + } +} \ No newline at end of file diff --git a/doric-h5/src/shader/DoricTextNode.ts b/doric-h5/src/shader/DoricTextNode.ts new file mode 100644 index 00000000..69ffd790 --- /dev/null +++ b/doric-h5/src/shader/DoricTextNode.ts @@ -0,0 +1,49 @@ +import { DoricViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString, toRGBAString } from "./DoricViewNode"; + +export class DoricTextNode extends DoricViewNode { + textElement!: HTMLElement + build(): HTMLElement { + const div = document.createElement('div') + div.style.display = "flex" + this.textElement = document.createElement('span') + div.appendChild(this.textElement) + div.style.justifyContent = "center" + div.style.alignItems = "center" + return div + } + + blendProps(v: HTMLParagraphElement, propName: string, prop: any) { + switch (propName) { + case 'text': + this.textElement.innerText = prop + break + case 'textSize': + v.style.fontSize = toPixelString(prop) + break + case 'textColor': + v.style.color = toRGBAString(prop) + break + case 'textAlignment': + const gravity: number = prop + if ((gravity & LEFT) === LEFT) { + v.style.justifyContent = "flex-start" + } else if ((gravity & RIGHT) === RIGHT) { + v.style.justifyContent = "flex-end" + } else if ((gravity & CENTER_X) === CENTER_X) { + v.style.justifyContent = "center" + } + if ((gravity & TOP) === TOP) { + v.style.alignItems = "flex-start" + } else if ((gravity & BOTTOM) === BOTTOM) { + v.style.alignItems = "flex-end" + } else if ((gravity & CENTER_Y) === CENTER_Y) { + v.style.alignItems = "center" + } + break + default: + super.blendProps(v, propName, prop) + break + } + } + +} \ No newline at end of file diff --git a/doric-h5/src/shader/DoricVLayoutNode.ts b/doric-h5/src/shader/DoricVLayoutNode.ts new file mode 100644 index 00000000..3501c78d --- /dev/null +++ b/doric-h5/src/shader/DoricVLayoutNode.ts @@ -0,0 +1,53 @@ +import { DoricGroupViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString } from "./DoricViewNode"; + +export class DoricVLayoutNode extends DoricGroupViewNode { + space = 0 + gravity = 0 + + build() { + const ret = document.createElement('div') + ret.style.display = "flex" + ret.style.flexDirection = "column" + ret.style.flexWrap = "nowrap" + return ret + } + blendProps(v: HTMLElement, propName: string, prop: any) { + if (propName === 'space') { + this.space = prop + } else if (propName === 'gravity') { + this.gravity = prop + if ((this.gravity & LEFT) === LEFT) { + this.view.style.alignItems = "flex-start" + } else if ((this.gravity & RIGHT) === RIGHT) { + this.view.style.alignItems = "flex-end" + } else if ((this.gravity & CENTER_X) === CENTER_X) { + this.view.style.alignItems = "center" + } + if ((this.gravity & TOP) === TOP) { + this.view.style.justifyContent = "flex-start" + } else if ((this.gravity & BOTTOM) === BOTTOM) { + this.view.style.justifyContent = "flex-end" + } else if ((this.gravity & CENTER_Y) === CENTER_Y) { + this.view.style.justifyContent = "center" + } + } else { + super.blendProps(v, propName, prop) + } + } + + layout() { + super.layout() + this.childNodes.forEach((e, idx) => { + e.view.style.flexShrink = "0" + if (e.layoutConfig?.weight) { + e.view.style.flex = `${e.layoutConfig?.weight}` + } + e.view.style.marginTop = toPixelString(e.layoutConfig?.margin?.top || 0) + e.view.style.marginBottom = toPixelString( + (idx === this.childNodes.length - 1) ? 0 : this.space + + (e.layoutConfig?.margin?.bottom || 0)) + e.view.style.marginLeft = toPixelString(e.layoutConfig?.margin?.left || 0) + e.view.style.marginRight = toPixelString(e.layoutConfig?.margin?.right || 0) + }) + } +} \ No newline at end of file diff --git a/doric-h5/src/shader/DoricViewNode.ts b/doric-h5/src/shader/DoricViewNode.ts new file mode 100644 index 00000000..3d430ab2 --- /dev/null +++ b/doric-h5/src/shader/DoricViewNode.ts @@ -0,0 +1,481 @@ +import { DoricContext } from "../DoricContext"; +import { acquireViewNode } from "../DoricRegistry"; + +export enum LayoutSpec { + EXACTLY = 0, + WRAP_CONTENT = 1, + AT_MOST = 2, +} + +const SPECIFIED = 1 +const START = 1 << 1 +const END = 1 << 2 + +const SHIFT_X = 0 +const SHIFT_Y = 4 + +export const LEFT = (START | SPECIFIED) << SHIFT_X +export const RIGHT = (END | SPECIFIED) << SHIFT_X + +export const TOP = (START | SPECIFIED) << SHIFT_Y +export const BOTTOM = (END | SPECIFIED) << SHIFT_Y + +export const CENTER_X = SPECIFIED << SHIFT_X +export const CENTER_Y = SPECIFIED << SHIFT_Y + +export const CENTER = CENTER_X | CENTER_Y + +export type FrameSize = { + width: number, + height: number, +} +export function toPixelString(v: number) { + return `${v}px` +} + +export function toRGBAString(color: number) { + let strs = [] + for (let i = 0; i < 32; i += 8) { + + strs.push(((color >> i) & 0xff).toString(16)) + } + strs = strs.map(e => { + if (e.length === 1) { + return '0' + e + } + return e + }).reverse() + /// RGBA + return `#${strs[1]}${strs[2]}${strs[3]}${strs[0]}` +} + + +export type DoricViewNodeClass = { new(...args: any[]): {} } + +export interface DVModel { + id: string, + type: string, + props: { + [index: string]: any + }, +} + +export abstract class DoricViewNode { + viewId = "" + viewType = "View" + context: DoricContext + superNode?: DoricSuperViewNode + layoutConfig = { + widthSpec: LayoutSpec.EXACTLY, + heightSpec: LayoutSpec.EXACTLY, + alignment: 0, + weight: 0, + margin: { + left: 0, + right: 0, + top: 0, + bottom: 0 + } + } + padding = { + left: 0, + right: 0, + top: 0, + bottom: 0, + } + + border?: { + width: number, + color: number, + } + + frameWidth = 0 + + frameHeight = 0 + + offsetX = 0 + + offsetY = 0 + + view!: HTMLElement + + + constructor(context: DoricContext) { + this.context = context + } + + init(superNode: DoricSuperViewNode) { + this.superNode = superNode + if (this instanceof DoricSuperViewNode) { + this.reusable = superNode.reusable + } + this.view = this.build() + } + + abstract build(): HTMLElement + + get paddingLeft() { + return this.padding.left || 0 + } + + get paddingRight() { + return this.padding.right || 0 + } + + get paddingTop() { + return this.padding.top || 0 + } + + get paddingBottom() { + return this.padding.bottom || 0 + } + + get borderWidth() { + return this.border?.width || 0 + } + + blend(props: { [index: string]: any }) { + for (let key in props) { + this.blendProps(this.view, key, props[key]) + } + this.onBlended() + this.layout() + } + onBlended() { + + } + configBorder() { + if (this.border) { + this.view.style.borderStyle = "solid" + this.view.style.borderWidth = toPixelString(this.border.width) + this.view.style.borderColor = toRGBAString(this.border.color) + } + } + + configWidth() { + switch (this.layoutConfig.widthSpec) { + case LayoutSpec.WRAP_CONTENT: + this.view.style.width = "fit-content" + break + + case LayoutSpec.AT_MOST: + this.view.style.width = "100%" + break + + case LayoutSpec.EXACTLY: + default: + this.view.style.width = toPixelString(this.frameWidth + - this.paddingLeft - this.paddingRight + - this.borderWidth * 2) + break + } + } + configHeight() { + switch (this.layoutConfig.heightSpec) { + case LayoutSpec.WRAP_CONTENT: + this.view.style.height = "fit-content" + break + + case LayoutSpec.AT_MOST: + this.view.style.height = "100%" + break + + case LayoutSpec.EXACTLY: + default: + this.view.style.height = toPixelString(this.frameHeight + - this.paddingTop - this.paddingBottom + - this.borderWidth * 2) + break + } + } + + configMargin() { + if (this.layoutConfig.margin) { + this.view.style.marginLeft = toPixelString(this.layoutConfig.margin.left || 0) + this.view.style.marginRight = toPixelString(this.layoutConfig.margin.right || 0) + this.view.style.marginTop = toPixelString(this.layoutConfig.margin.top || 0) + this.view.style.marginBottom = toPixelString(this.layoutConfig.margin.bottom || 0) + } + } + + configPadding() { + if (this.padding) { + this.view.style.paddingLeft = toPixelString(this.paddingLeft) + this.view.style.paddingRight = toPixelString(this.paddingRight) + this.view.style.paddingTop = toPixelString(this.paddingTop) + this.view.style.paddingBottom = toPixelString(this.paddingBottom) + } + } + + layout() { + this.configMargin() + this.configBorder() + this.configPadding() + this.configWidth() + this.configHeight() + } + + blendProps(v: HTMLElement, propName: string, prop: any) { + switch (propName) { + case "border": + this.border = prop + break + case "padding": + this.padding = prop + break + case 'width': + this.frameWidth = prop as number + break + case 'height': + this.frameHeight = prop as number + break + case 'backgroundColor': + this.backgroundColor = prop as number + break + case 'layoutConfig': + const layoutConfig = prop + for (let key in layoutConfig) { + Reflect.set(this.layoutConfig, key, Reflect.get(layoutConfig, key, layoutConfig)) + } + break + case 'x': + this.offsetX = prop as number + break + case 'y': + this.offsetY = prop as number + break + case 'onClick': + this.view.onclick = () => { + this.callJSResponse(prop as string) + } + break + case 'corners': + if (typeof prop === 'object') { + this.view.style.borderTopLeftRadius = toPixelString(prop.leftTop) + this.view.style.borderTopRightRadius = toPixelString(prop.rightTop) + this.view.style.borderBottomRightRadius = toPixelString(prop.rightBottom) + this.view.style.borderBottomLeftRadius = toPixelString(prop.leftBottom) + } else { + this.view.style.borderRadius = toPixelString(prop) + } + break + case 'shadow': + const opacity = prop.opacity || 0 + if (opacity > 0) { + const offsetX = prop.offsetX || 0 + const offsetY = prop.offsetY || 0 + const shadowColor = prop.color || 0xff000000 + const shadowRadius = prop.radius + const alpha = opacity * 255 + this.view.style.boxShadow = `${toPixelString(offsetX)} ${toPixelString(offsetY)} ${toPixelString(shadowRadius)} ${toRGBAString((shadowColor & 0xffffff) | ((alpha & 0xff) << 24))} ` + } else { + this.view.style.boxShadow = "" + } + break + } + } + + set backgroundColor(v: number) { + this.view.style.backgroundColor = toRGBAString(v) + } + + static create(context: DoricContext, type: string) { + const viewNodeClass = acquireViewNode(type) + if (viewNodeClass === undefined) { + console.error(`Cannot find ViewNode for ${type}`) + return undefined + } + const ret = new viewNodeClass(context) as DoricViewNode + ret.viewType = type + return ret + } + + getIdList() { + const ids: string[] = [] + let viewNode: DoricViewNode | undefined = this + do { + ids.push(viewNode.viewId) + viewNode = viewNode.superNode + } while (viewNode) + return ids.reverse() + } + + callJSResponse(funcId: string, ...args: any) { + const argumentsList: any = ['__response__', this.getIdList(), funcId] + for (let i = 1; i < arguments.length; i++) { + argumentsList.push(arguments[i]) + } + Reflect.apply(this.context.invokeEntityMethod, this.context, argumentsList) + } +} + + +export abstract class DoricSuperViewNode extends DoricViewNode { + reusable = false + + subModels: Map = new Map + + blendProps(v: HTMLElement, propName: string, prop: any) { + if (propName === 'subviews') { + if (prop instanceof Array) { + prop.forEach((e: DVModel) => { + this.mixinSubModel(e) + this.blendSubNode(e) + }) + } + } else { + super.blendProps(v, propName, prop) + } + } + + mixinSubModel(subNode: DVModel) { + const oldValue = this.getSubModel(subNode.id) + if (oldValue) { + this.mixin(subNode, oldValue) + } else { + this.subModels.set(subNode.id, subNode) + } + } + + getSubModel(id: string) { + return this.subModels.get(id) + } + + mixin(src: DVModel, target: DVModel) { + for (let key in src.props) { + if (key === "subviews") { + continue + } + Reflect.set(target.props, key, Reflect.get(src.props, key)) + } + } + clearSubModels() { + this.subModels.clear() + } + + removeSubModel(id: string) { + this.subModels.delete(id) + } + + abstract blendSubNode(model: DVModel): void + + abstract getSubNodeById(viewId: string): DoricViewNode | undefined +} + +export abstract class DoricGroupViewNode extends DoricSuperViewNode { + childNodes: DoricViewNode[] = [] + childViewIds: string[] = [] + + blendProps(v: HTMLElement, propName: string, prop: any) { + if (propName === 'children') { + if (prop instanceof Array) { + this.childViewIds = prop + } + } else { + super.blendProps(v, propName, prop) + } + } + + blend(props: { [index: string]: any }) { + super.blend(props) + } + onBlended() { + super.onBlended() + this.configChildNode() + } + configChildNode() { + this.childViewIds.forEach((childViewId, index) => { + const model = this.getSubModel(childViewId) + if (model === undefined) { + return + } + if (index < this.childNodes.length) { + const oldNode = this.childNodes[index] + if (oldNode.viewId === childViewId) { + //The same,skip + } else { + if (this.reusable) { + if (oldNode.viewType === model.type) { + //Same type,can be reused + oldNode.viewId = childViewId + oldNode.blend(model.props) + } else { + //Replace this view + this.view.removeChild(oldNode.view) + const newNode = DoricViewNode.create(this.context, model.type) + if (newNode === undefined) { + return + } + newNode.viewId = childViewId + newNode.init(this) + newNode.blend(model.props) + this.childNodes[index] = newNode + this.view.replaceChild(newNode.view, oldNode.view) + } + } else { + //Find in remain nodes + let position = -1 + for (let start = index + 1; start < this.childNodes.length; start++) { + if (childViewId === this.childNodes[start].viewId) { + //Found + position = start + break + } + } + if (position >= 0) { + //Found swap idx,position + const reused = this.childNodes[position] + const abandoned = this.childNodes[index] + this.childNodes[index] = reused + this.childNodes[position] = abandoned + this.view.removeChild(reused.view) + this.view.insertBefore(reused.view, abandoned.view) + this.view.removeChild(abandoned.view) + if (position === this.view.childElementCount - 1) { + this.view.appendChild(abandoned.view) + } else { + this.view.insertBefore(abandoned.view, this.view.children[position]) + } + } else { + //Not found,insert + const newNode = DoricViewNode.create(this.context, model.type) + if (newNode === undefined) { + return + } + newNode.viewId = childViewId + newNode.init(this) + newNode.blend(model.props) + this.childNodes[index] = newNode + this.view.insertBefore(newNode.view, this.view.children[index]) + } + } + } + } else { + //Insert + const newNode = DoricViewNode.create(this.context, model.type) + if (newNode === undefined) { + return + } + newNode.viewId = childViewId + newNode.init(this) + newNode.blend(model.props) + this.childNodes.push(newNode) + this.view.appendChild(newNode.view) + } + }) + let size = this.childNodes.length + for (let idx = this.childViewIds.length; idx < size; idx++) { + this.view.removeChild(this.childNodes[idx].view) + } + this.childNodes = this.childNodes.slice(0, this.childViewIds.length) + } + + blendSubNode(model: DVModel) { + this.getSubNodeById(model.id)?.blend(model.props) + } + + getSubNodeById(viewId: string) { + return this.childNodes.filter(e => e.viewId === viewId)[0] + } + +} \ No newline at end of file diff --git a/doric-h5/tsconfig.json b/doric-h5/tsconfig.json new file mode 100644 index 00000000..4eff713b --- /dev/null +++ b/doric-h5/tsconfig.json @@ -0,0 +1,64 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ES2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "lib": [ + "DOM" + ], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "build/", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */ + }, + "include": [ + "**/*.ts", + ] +} \ No newline at end of file