├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── App.js ├── LICENSE ├── README.md ├── babel.config.json ├── dist ├── index.js ├── index.js.map ├── node_modules │ └── tslib │ │ ├── tslib.es6.js │ │ └── tslib.es6.js.map ├── src │ ├── component │ │ └── index.d.ts │ ├── index.d.ts │ ├── index.js │ ├── index.js.map │ ├── lib │ │ ├── common.d.ts │ │ ├── common.js │ │ └── common.js.map │ ├── modules │ │ └── index.d.ts │ ├── plugin.d.ts │ ├── plugin.js │ ├── plugin.js.map │ ├── reactivity.d.ts │ ├── reactivity.js │ ├── reactivity.js.map │ ├── renderers │ │ ├── attributeRenderer.d.ts │ │ ├── attributeRenderer.js │ │ ├── attributeRenderer.js.map │ │ ├── conditionRenderer.d.ts │ │ ├── conditionRenderer.js │ │ ├── conditionRenderer.js.map │ │ ├── getRenderer.d.ts │ │ ├── getRenderer.js │ │ ├── getRenderer.js.map │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.js.map │ │ ├── loopRenderer.d.ts │ │ ├── loopRenderer.js │ │ ├── loopRenderer.js.map │ │ ├── variableRenderer.d.ts │ │ ├── variableRenderer.js │ │ └── variableRenderer.js.map │ ├── vdom.d.ts │ ├── vdom.js │ └── vdom.js.map ├── tnt.min.js └── tnt.min.js.map ├── docs ├── Overview.md ├── api │ └── Overview.md ├── datastype │ └── Overview.md ├── development │ └── Overview.md ├── plugin │ ├── Overview.md │ ├── TNT_Plugin.md │ └── TNT_Renderable.md ├── style │ ├── CommitRules.md │ ├── NamingRules.md │ └── Overview.md └── user-guide │ ├── HTMLTags.md │ └── Overview.md ├── index.html ├── package-lock.json ├── package.json ├── roadmap.md ├── rollup.config.js ├── src ├── component │ └── index.ts ├── index.ts ├── lib │ └── common.ts ├── plugin.ts ├── reactivity.ts ├── renderers │ ├── attributeRenderer.ts │ ├── conditionRenderer.ts │ ├── getRenderer.ts │ ├── index.ts │ ├── loopRenderer.ts │ └── variableRenderer.ts ├── route.ts └── vdom.ts ├── test ├── datas.json ├── test-module │ ├── index.tnt.xml │ └── tnt.module.json └── todo-demo │ ├── style.css │ └── todo.html └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = false 12 | insert_final_newline = false -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "es2021": true, 5 | "node": true 6 | }, 7 | "extends": [ 8 | "eslint:recommended", 9 | "plugin:@typescript-eslint/recommended" 10 | ], 11 | "parser": "@typescript-eslint/parser", 12 | "parserOptions": { 13 | "ecmaVersion": "latest", 14 | "sourceType": "module" 15 | }, 16 | "plugins": [ 17 | "@typescript-eslint" 18 | ], 19 | "rules": { 20 | "indent": [ 21 | "error", 22 | 2, 23 | ], 24 | "linebreak-style": [ 25 | "error", 26 | "unix" 27 | ], 28 | "quotes": [ 29 | "error", 30 | "double" 31 | ], 32 | "semi": [ 33 | "error", 34 | "always" 35 | ], 36 | "eqeqeq": [ 37 | "error", 38 | "always" 39 | ], 40 | }, 41 | }; 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | .vscode/ 3 | .VSCodeCounter/ 4 | Backup/ 5 | -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import { TNTApp } from "./dist/src/index.js"; 2 | 3 | const app = new TNTApp(); 4 | 5 | app.page({ 6 | data: { 7 | x: 233333, 8 | bool: true, 9 | lib: [true, false, true] 10 | 11 | }, 12 | mounted() { 13 | console.log("end!!!"); 14 | }, 15 | effect() { 16 | console.log(data.x); 17 | }, 18 | ready() { 19 | console.log("Hello world"); 20 | }, 21 | mount: document.getElementById("root") 22 | }, "id1"); 23 | 24 | export default app; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 BugDuck 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # The project has stop maintenance. 2 | 3 | ![TNT.js](https://img1.imgtp.com/2022/06/13/lPea2J3u.png) 4 | 5 | ![License](https://img.shields.io/github/license/Bug-Duck/tntjs?style=flat-square) 6 | ![version](https://img.shields.io/npm/v/tntjs?style=flat-square) 7 | ![Star](https://img.shields.io/github/stars/Bug-Duck/tntjs?color=yellow&logo=github&style=flat-square) 8 | ![Fork](https://img.shields.io/github/forks/Bug-Duck/tntjs?color=green&logo=github&style=flat-square) 9 | ![watch](https://img.shields.io/github/watchers/Bug-Duck/tntjs?color=blue&logo=github&style=flat-square) 10 | [![OSCS Status](https://www.oscs1024.com/platform/badge/Bug-Duck/tntjs.svg?size=small)](https://www.oscs1024.com/project/Bug-Duck/tntjs?ref=badge_small) 11 | 12 | [![website](https://img.shields.io/badge/website-bugduck.cn-yellowgreen?style=flat-square)](https://bugduck.cn) 13 | [![ProjectWebsite](https://img.shields.io/badge/ProjectWebsite-tntjs.bugduck.cn-red?style=flat-square)](https://tntjs.bugduck.cn) 14 | [![BiliBili](https://img.shields.io/static/v1?label=bilibili&message=BugDuck开源团队&color=ff69b4&logo=bilibili&style=flat-square)](https://space.bilibili.com/1959824394?spm_id_from=333.337.0.0) 15 | 16 | # TNT.js 17 | 18 | The JavaScript framework for modern web.This is a front-end framework that can control multiple pages. Writing JavaScript is like writing back-end code, which truly realizes efficient native development. In addition, we will add native component writing and debugging in future versions. 19 | 20 | ## Roadmap 21 | 22 | Please refer to [TNT.js Roadmap](https://github.com/Bug-Duck/tntjs/blob/master/roadmap.md). 23 | 24 | ## Demo 25 | 26 | ### Install tntjs 27 | Although tntjs is a more native front-end framework, you can still install them using a package manager just like any other framework 28 | 29 | First we need a project directory, assuming you are developing in a Linux environment, let's create a new `MyFirstTNTJsProject` 30 | ```shell 31 | $ mkdir MFTJP #here is the abbreviation 32 | $ cd MFTJP 33 | $ code ./ 34 | ``` 35 | 36 | Then let's install it 37 | ```shell 38 | $ npm install tntjs #npm 39 | $ yarn add tntjs #yarn 40 | $ pnpm install tntjs #pnpm 41 | ``` 42 | Or you can also use the files on the cdn 43 | ```url 44 | https://cdn.jsdelivr.net/npm/tntjs@latest/dist/src/index.js 45 | ``` 46 | 47 | ### How to use? 48 | 49 | Now you can happily control multiple pages with tntjs! 50 | 51 | Next, let's write the simplest Hello world. tntjs uses `` to realize the two-way binding of responsive variables and pages, that is to say, the value bound on the page will change as the variable changes. 52 | ```html 53 | 54 | ``` 55 | Fill in the expression in the `data` attribute 56 | 57 | The js part needs to instantiate a TNTApp 58 | ```js 59 | export const app = new TNTApp(); 60 | ``` 61 | 62 | Then use `page` to preset the page: 63 | ```js 64 | // App.js 65 | export const app = new TNTApp(); 66 | 67 | app.page({ 68 | data: { 69 | x: "Hello world!" 70 | }, 71 | mount: document.getElementById("app") 72 | }, "id1") 73 | ``` 74 | * Each html file has a separate pageid, you can use `` to set it in ``, which is the page identifier for tntjs multi-page programming 75 | ```html 76 | page1 77 | ``` 78 | * Use `data` in the first parameter to set the initial value of the responsive variable 79 | * The first parameter uses `mount` to specify the Element object of the scope of the tntjs application (the specified node can only have one child node) 80 | 81 | ### Now, Import it in html file 82 | 83 | ```html 84 | 85 | 86 | 87 | 88 | tntjs demo 89 | id1 90 | 91 | 92 |
93 |
94 | 95 |
96 |
97 | 98 | 99 | ``` 100 | Open it in browser, You can see: 101 | ```text 102 | Hello world! 103 | ``` 104 | 105 | ## Documentation 106 | 107 | Please refer to for more information. 108 | 109 | ## Sponsoring 110 | 111 | We're all middle school students and we don't have that much money. So sponsoring TNTjs will give us an extra reward to let us keep updating!😉 112 | 113 | ![Sponsor us on ZhiFuBao](https://img1.imgtp.com/2022/06/13/19puVIav.jpg) 114 | ![Sponsor us on WeChat](https://image.bugduck.cn/other/skm-weixin.png) 115 | 116 | ## Contributors 117 | 118 | - Emoji guidelines: 119 | - :star: : Community administrator 120 | - :pen: : Major contributor 121 | - :student: : Student 122 | 123 | |![Acbox](https://github.com/sheepbox8646.png)|![samzhangjy](https://github.com/samzhangjy.png)|![mono](http://q1.qlogo.cn/g?b=qq&nk=3151435932&s=640)|![27Onion](https://github.com/onion108.png)|![鸭](http://q1.qlogo.cn/g?b=qq&nk=3593809064&s=640)|![Rotten-LKZ](https://github.com/Rotten-LKZ.png)| 124 | |:-:|:-:|:-:|:-:|:-:|:-:| 125 | |箱子Acbox
:star: :pen: :student:|samzhangjy
:star: :pen: :student:|mono
:star: :pen:|27Onion
:pen: :student:|leonfyr
:pen: :student:|Rotten-LKZ
:student:| 126 | 127 | ## Changelog 128 | 129 | ### Development Stage 130 | 131 | - 2022.4.1 开始在学校构思 132 | - 2022.4.5 项目启动 133 | - 2022.4.9 ``标签功能实现 134 | - 2022.4.10 变量赋值功能实现(TNTScript已废弃) 135 | - 2022.4.17 函数调用功能实现 136 | - 2022.4.24 TypeScript 重构项目 137 | - 2022.5.22 项目重构完成 138 | - 2022.5.29 发布 0.1.0 版本 139 | - 2022.5.29 取消发布 0.1.0 版本 140 | - 2022.6.9 ES6重构完成 141 | - 2022.7.1 开发者们都放暑假啦!恢复开发 142 | - 2022.7.20 vdom(虚拟dom)实现 143 | - 2022.8.3 重写完成 144 | 145 | Enjoy! 146 | -------------------------------------------------------------------------------- /babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "es2015", 5 | { 6 | "modules": false 7 | } 8 | ] 9 | ], 10 | "plugins": ["external-helpers"] 11 | } 12 | -------------------------------------------------------------------------------- /dist/index.js: -------------------------------------------------------------------------------- 1 | class TNTApp { 2 | constructor() { } 3 | page(createFunctions, ...page_id) { 4 | } 5 | } 6 | 7 | export { TNTApp }; 8 | //# sourceMappingURL=index.js.map 9 | -------------------------------------------------------------------------------- /dist/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":"MAqBa,MAAM,CAAA;AACjB,IAAA,WAAA,GAAA,GAAgB;AAEhB,IAAA,IAAI,CAEF,eAA0C,EAC1C,GAAG,OAAiB,EAAA;KAGrB;AACF;;;;"} -------------------------------------------------------------------------------- /dist/node_modules/tslib/tslib.es6.js: -------------------------------------------------------------------------------- 1 | var t=function(e,n){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},t(e,n)};function e(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}var n=function(){return n=Object.assign||function(t){for(var e,n=1,r=arguments.length;n=0;c--)(o=t[c])&&(a=(i<3?o(a):i>3?o(e,n,a):o(e,n))||a);return i>3&&a&&Object.defineProperty(e,n,a),a}function i(t,e){return function(n,r){e(n,r,t)}}function a(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)}function c(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))}function u(t,e){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function s(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,o,i=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(t){o={error:t}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function p(){for(var t=[],e=0;e1||c(t,e)}))})}function c(t,e){try{(n=o[t](e)).value instanceof v?Promise.resolve(n.value.v).then(u,f):l(i[0][2],n)}catch(t){l(i[0][3],t)}var n}function u(t){c("next",t)}function f(t){c("throw",t)}function l(t,e){t(e),i.shift(),i.length&&c(i[0][0],i[0][1])}}function d(t){var e,n;return e={},r("next"),r("throw",(function(t){throw t})),r("return"),e[Symbol.iterator]=function(){return this},e;function r(r,o){e[r]=t[r]?function(e){return(n=!n)?{value:v(t[r](e)),done:"return"===r}:o?o(e):e}:o}}function m(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=y(t),e={},r("next"),r("throw"),r("return"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,o){(function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n})}),e)})(r,o,(e=t[n](e)).done,e.value)}))}}}function O(t,e){return Object.defineProperty?Object.defineProperty(t,"raw",{value:e}):t.raw=e,t}var g=Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e};function j(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&f(e,t,n);return g(e,t),e}function P(t){return t&&t.__esModule?t:{default:t}}function S(t,e,n,r){if("a"===n&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!r:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(t):r?r.value:e.get(t)}function x(t,e,n,r,o){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!o:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?o.call(t,n):o?o.value=n:e.set(t,n),n}function _(t,e){if(null===e||"object"!=typeof e&&"function"!=typeof e)throw new TypeError("Cannot use 'in' operator on non-object");return"function"==typeof t?e===t:t.has(e)}export{n as __assign,d as __asyncDelegator,w as __asyncGenerator,m as __asyncValues,v as __await,c as __awaiter,S as __classPrivateFieldGet,_ as __classPrivateFieldIn,x as __classPrivateFieldSet,f as __createBinding,o as __decorate,l as __exportStar,e as __extends,u as __generator,P as __importDefault,j as __importStar,O as __makeTemplateObject,a as __metadata,i as __param,s as __read,r as __rest,p as __spread,b as __spreadArray,h as __spreadArrays,y as __values}; 2 | //# sourceMappingURL=tslib.es6.js.map 3 | -------------------------------------------------------------------------------- /dist/node_modules/tslib/tslib.es6.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"tslib.es6.js","sources":["../../../node_modules/tslib/tslib.es6.js"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n 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;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__decorate","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__param","paramIndex","decorator","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","pop","push","__createBinding","o","m","k","k2","undefined","__esModule","writable","configurable","enumerable","get","__exportStar","__values","__read","ar","error","__spread","concat","__spreadArrays","il","a","j","jl","__spreadArray","to","from","pack","l","slice","__await","__asyncGenerator","asyncIterator","q","resume","fulfill","settle","shift","__asyncDelegator","__asyncValues","__makeTemplateObject","cooked","raw","__setModuleDefault","__importStar","mod","__importDefault","default","__classPrivateFieldGet","receiver","state","kind","has","__classPrivateFieldSet","set","__classPrivateFieldIn"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/src/component/index.d.ts: -------------------------------------------------------------------------------- 1 | export declare class TNTModule { 2 | #private; 3 | constructor(); 4 | useParamers(paramers: Record): void; 5 | } 6 | -------------------------------------------------------------------------------- /dist/src/index.d.ts: -------------------------------------------------------------------------------- 1 | import { TNTPlugin } from "./plugin"; 2 | export declare type TNTData = object; 3 | export declare type TNTEffect = () => any; 4 | export declare type TNTComputed = Record; 5 | declare global { 6 | export interface Window { 7 | data: TNTData; 8 | } 9 | } 10 | export declare class TNTApp { 11 | #private; 12 | constructor(); 13 | page(createFunctions: Record, ...page_id: string[]): void; 14 | useExportPlugin(plugin: TNTPlugin): void; 15 | get data(): object; 16 | usePlugin(plugin: TNTPlugin): this; 17 | } 18 | export { computed, getTrackableObject, reactive, ref, targetMap, watchEffect, trigger, track, } from "./reactivity"; 19 | export { h, mount, patch } from "./vdom"; 20 | export { TNTPlugin } from "./plugin"; 21 | -------------------------------------------------------------------------------- /dist/src/index.js: -------------------------------------------------------------------------------- 1 | import{__classPrivateFieldSet as t,__classPrivateFieldGet as e}from"../node_modules/tslib/tslib.es6.js";import{deepClone as i}from"./lib/common.js";import{watchEffect as s,trigger as a,track as o,reactive as n,ref as r,computed as f}from"./reactivity.js";export{computed,getTrackableObject,reactive,ref,targetMap,track,trigger,watchEffect}from"./reactivity.js";import{h as c,getAttributesOfElement as d,createVdomFromExistingElement as l,mount as u,patch as m}from"./vdom.js";export{h,mount,patch}from"./vdom.js";export{TNTPlugin}from"./plugin.js";var p,v,w,g,k,y,M,T,b,W,j,N,x,E,P,A,S,H,L;class R{constructor(){p.add(this),v.set(this,void 0),w.set(this,void 0),g.set(this,void 0),k.set(this,void 0),y.set(this,void 0),M.set(this,void 0),T.set(this,void 0),b.set(this,void 0),W.set(this,void 0),j.set(this,void 0),N.set(this,void 0),t(this,M,(()=>{}),"f"),t(this,T,(()=>{}),"f"),t(this,b,[],"f"),t(this,w,{},"f"),t(this,v,{},"f"),t(this,g,{},"f"),t(this,W,[],"f"),t(this,y,{},"f"),t(this,N,[],"f"),window.data={};const e=document.getElementsByTagName("page-id")[0];t(this,j,e.innerHTML,"f"),e.innerHTML=""}page(i,...s){s.includes(e(this,j,"f"))&&(void 0!==i.main&&(window.onload=i.main),void 0!==i.ready&&(()=>{t(this,T,i.ready,"f"),e(this,T,"f").call(this,this)})(),void 0!==i.data&&e(this,p,"m",A).call(this,i.data),void 0!==i.computed&&e(this,p,"m",S).call(this,i.computed),void 0!==i.effect&&e(this,p,"m",H).call(this,i.effect),void 0!==i.mounted&&(()=>{t(this,M,i.mounted,"f")})(),void 0!==i.mount&&e(this,p,"m",E).call(this,i.mount))}useExportPlugin(t){e(this,N,"f").push(t)}get data(){return e(this,k,"f")}usePlugin(t){return e(this,N,"f").push(t),this}}v=new WeakMap,w=new WeakMap,g=new WeakMap,k=new WeakMap,y=new WeakMap,M=new WeakMap,T=new WeakMap,b=new WeakMap,W=new WeakMap,j=new WeakMap,N=new WeakMap,p=new WeakSet,x=function(t){const e=t.methods();for(const t in e)this[t]=e[t];t.onload()},E=function(t){let a=!1,o=null,n=null;return e(this,b,"f").push("mount"),s((()=>{var s;const h=null!==(s=null==n?void 0:n.el)&&void 0!==s?s:t.children[0],r=c(h.tagName,d(h),[]);if(r.el=h,l(r,h,{}),n=c(t.tagName,d(h),r.children,h),!a)return o=i(n),u(o,t,{}),a=!0,e(this,p,"m",L).call(this,t,h),void e(this,M,"f").call(this,this);const f=i(n);m(o,f,{}),o=i(f),e(this,p,"m",L).call(this,t,h)})),e(this,N,"f").forEach((t=>{e(this,p,"m",x).call(this,t)})),this},P=function(){const t=(t,i,s)=>{Array.isArray(s)&&(t.reactive[i].splice(0,t.reactive[i].length),t.reactive[i].push(...s)),a(e(this,y,"f")[i],i)},i={get(t,e){if("symbol"!=typeof e)return(e=e.toString())in t.reactive?t.reactive[e]:e in t.computed?t.computed[e].value:e in t.ref?(o(t.ref[e],"value"),t.ref[e].value):void console.warn(`[TNT warn] You accessed a value not defined (Reading '${e}').`)},set:(e,i,s)=>i in e.reactive?(t(e,i,s),!0):i in e.ref?(e.ref[i].value=s,a(e.ref[i],"value"),!0):(console.warn(`[TNT warn] You set a value not defined (Reading '${i}').`),!1),has:(t,e)=>("symbol"==typeof e&&(e=e.toString()),!(e in globalThis)&&(e in t.ref||e in t.reactive||e in t.computed))};return new Proxy({reactive:e(this,v,"f"),computed:e(this,w,"f"),ref:e(this,g,"f")},i)},A=function(s){e(this,b,"f").push("data"),t(this,y,i(s),"f"),t(this,v,{},"f"),t(this,g,{},"f");for(const t in s)"object"!=typeof s[t]?e(this,g,"f")[t]=r(s[t]):e(this,v,"f")[t]=n(s[t]);return t(this,k,e(this,p,"m",P).call(this),"f"),window.data=e(this,k,"f"),this},S=function(i){e(this,b,"f").push("computed"),e(this,b,"f").includes("data")||console.warn("[TNT warn] useComputed() hook is called before useData(). Any reactive data accessed from computed functions will not be accessable.","This may lead to unpredictable results or errors.");for(const t in i)e(this,w,"f")[t]=f(i[t]);return t(this,k,e(this,p,"m",P).call(this),"f"),window.data=e(this,k,"f"),this},H=function(t){return e(this,b,"f").push("effect"),e(this,W,"f").push(t),s(t),this},L=function(t,e){t.children.length>1&&e.remove()};export{R as TNTApp}; 2 | //# sourceMappingURL=index.js.map 3 | -------------------------------------------------------------------------------- /dist/src/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sources":["../../../src/index.ts"],"sourcesContent":[null],"names":["TNTApp","constructor","_TNTApp_reactiveData","set","this","_TNTApp_computedData","_TNTApp_refData","_TNTApp_dataProxy","_TNTApp_originalData","_TNTApp_onMounted","_TNTApp_onReady","_TNTApp_hooksCalled","_TNTApp_watchEffects","_TNTApp_pageid","_TNTApp_pluginData","__classPrivateFieldSet","window","data","pageIdElement","document","getElementsByTagName","innerHTML","page","createFunctions","page_id","includes","__classPrivateFieldGet","main","onload","ready","call","computed","effect","mounted","mount","useExportPlugin","plugin","push","usePlugin","funcs","methods","i","container","isMounted","prevVdom","currentNode","watchEffect","currentContainer","_a","el","children","vnode","h","tagName","getAttributesOfElement","createVdomFromExistingElement","deepClone","newVdom","patch","forEach","_TNTApp_instances","_TNTApp_loadPlugin","_TNTApp_getDataProxy","syncData","target","prop","value","Array","isArray","reactive","splice","length","trigger","handlers","get","toString","ref","track","console","warn","has","key","globalThis","Proxy","computedValues","_TNTApp_removeUpdatedElements","element","toRemove","remove"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/src/lib/common.d.ts: -------------------------------------------------------------------------------- 1 | export declare const deepClone: (obj: any) => any; 2 | export declare const evaluate: (expression: string, extraContext?: {}, shouldExecuate?: boolean) => any; 3 | export declare const addCssText: (cssText: string, member: string) => string; 4 | -------------------------------------------------------------------------------- /dist/src/lib/common.js: -------------------------------------------------------------------------------- 1 | const t=r=>{const n={};for(const o in r)if(Array.isArray(r[o])){const e=[];r[o].forEach((r=>{"object"==typeof r?e.push(t(r)):e.push(r)})),n[o]=e}else"object"!=typeof r[o]||r[o].tagName?n[o]=r[o]:n[o]=t(r[o]);return n},r=(t,r={},n=!0)=>{let o="";for(const t in r)o+=`const ${t} = ${"string"==typeof r[t]?'"'+r[t]+'"':JSON.stringify(r[t])}; `;try{const e=Function("ctx",`with(window.data) {${o}; return ${t};}`);return n?e(r):e}catch(t){return t.toString()}},n=(t,r)=>{const n=t.trim();return";"===n[length-1]?n+r:";"+n+r};export{n as addCssText,t as deepClone,r as evaluate}; 2 | //# sourceMappingURL=common.js.map 3 | -------------------------------------------------------------------------------- /dist/src/lib/common.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"common.js","sources":["../../../../src/lib/common.ts"],"sourcesContent":[null],"names":["deepClone","obj","newObj","key","Array","isArray","newArr","forEach","val","push","tagName","evaluate","expression","extraContext","shouldExecuate","extraContextEval","JSON","stringify","func","Function","e","toString","addCssText","cssText","member","css","trim","length"],"mappings":"AAKa,MAAAA,EAAaC,IACxB,MAAMC,EAAc,GACpB,IAAK,MAAMC,KAAOF,EAChB,GAAIG,MAAMC,QAAQJ,EAAIE,IAAtB,CACE,MAAMG,EAAS,GACfL,EAAIE,GAAKI,SAASC,IACG,iBAARA,EAAkBF,EAAOG,KAAKT,EAAUQ,IAC9CF,EAAOG,KAAKD,MAEnBN,EAAOC,GAAOG,MAGQ,iBAAbL,EAAIE,IAAsBF,EAAIE,GAAKO,QAI9CR,EAAOC,GAAOF,EAAIE,GAHhBD,EAAOC,GAAOH,EAAUC,EAAIE,IAKhC,OAAOD,GAUIS,EAAW,CACtBC,EACAC,EAAe,GACfC,GAAiB,KAEjB,IAAIC,EAAmB,GACvB,IAAK,MAAMZ,KAAOU,EAChBE,GAAoB,SAASZ,OACE,iBAAtBU,EAAaV,GAChB,IAAMU,EAAaV,GAAO,IAC1Ba,KAAKC,UAAUJ,EAAaV,QAGpC,IACE,MAAMe,EAAOC,SACX,MACA,sBAAsBJ,aAA4BH,OAEpD,OAAOE,EAAiBI,EAAKL,GAAgBK,EAC7C,MAAOE,GACP,OAAOA,EAAEC,aAIAC,EAAa,CAACC,EAAiBC,KAC1C,MAAMC,EAAMF,EAAQG,OAEpB,MAAiB,MADAD,EAAIE,OAAS,GACDF,EAAMD,EACvB,IAAMC,EAAMD"} -------------------------------------------------------------------------------- /dist/src/modules/index.d.ts: -------------------------------------------------------------------------------- 1 | export declare class TNTModule { 2 | #private; 3 | constructor(); 4 | useParamers(paramers: Record): void; 5 | } 6 | -------------------------------------------------------------------------------- /dist/src/plugin.d.ts: -------------------------------------------------------------------------------- 1 | export declare class TNTPlugin { 2 | name: string; 3 | version: string; 4 | onload(): void; 5 | render(): void; 6 | watchEffect(): void; 7 | methods(): Record any)>; 8 | } 9 | -------------------------------------------------------------------------------- /dist/src/plugin.js: -------------------------------------------------------------------------------- 1 | class e{onload(){}render(){}watchEffect(){}methods(){return{}}}export{e as TNTPlugin}; 2 | //# sourceMappingURL=plugin.js.map 3 | -------------------------------------------------------------------------------- /dist/src/plugin.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"plugin.js","sources":["../../../src/plugin.ts"],"sourcesContent":[null],"names":["TNTPlugin","onload","render","watchEffect","methods"],"mappings":"MAKaA,EAMXC,UACAC,UACAC,eACAC,UACE,MAAO"} -------------------------------------------------------------------------------- /dist/src/reactivity.d.ts: -------------------------------------------------------------------------------- 1 | export declare type EffectType = () => void; 2 | export declare type ReactiveType = object; 3 | declare type TargetMap = WeakMap>>; 4 | export declare const targetMap: TargetMap; 5 | interface TrackableCallback { 6 | onGet: (target: ReactiveType, key: string, receiver: any) => void; 7 | onSet: (target: ReactiveType, key: string, value: ReactiveType, receiver: any) => void; 8 | onDeleteProperty: (target: ReactiveType, key: string) => void; 9 | } 10 | export declare const getTrackableObject: (obj: ReactiveType, callbacks: TrackableCallback) => object; 11 | export declare const track: (target: object, key: string) => void; 12 | export declare const trigger: (target: ReactiveType, key: string) => void; 13 | export declare const watchEffect: (effect: EffectType) => void; 14 | export declare const reactive: (target: ReactiveType) => object; 15 | export declare const ref: (raw: ReactiveType) => { 16 | value: object; 17 | }; 18 | export declare const computed: (getter: () => ReactiveType) => { 19 | value: object; 20 | }; 21 | export {}; 22 | -------------------------------------------------------------------------------- /dist/src/reactivity.js: -------------------------------------------------------------------------------- 1 | const e=[],t=new WeakMap,r=(e,t)=>{for(const o in e)"object"==typeof e[o]&&(e[o]=r(e[o],t));const o=new Proxy(e,{get(e,r,o){const n=Reflect.get(e,r,o);return t.onGet(e,r,o),n},set(e,o,n,c){"object"==typeof n&&(n=r(n,t));const s=Reflect.set(e,o,n,c);return t.onSet(e,o,n,c),s},deleteProperty(e,r){const o=Reflect.deleteProperty(e,r);return t.onDeleteProperty(e,r),o}});return Array.isArray(e)&&Object.setPrototypeOf(o,Array.prototype),o},o=(r,o)=>{if(!e.length)return;let n=t.get(r);n||(n=new Map,t.set(r,n));let c=n.get(o);c||(c=new Set,n.set(o,c)),e.forEach((e=>c.add(e)))},n=(e,r)=>{const o=t.get(e);if(!o)return;const n=o.get(r);n&&n.forEach((e=>{e()}))},c=t=>{e.push(t),t(),e.pop()},s=e=>r(e,{onGet(e,t){o(e,t)},onSet(e,t){n(e,t)},onDeleteProperty(){}}),l=e=>{const t={get value(){return o(t,"value"),e},set value(r){r!==e&&(e=r,n(t,"value"))}};return t},u=e=>{const t=l(null);return c((()=>t.value=e())),t};export{u as computed,r as getTrackableObject,s as reactive,l as ref,t as targetMap,o as track,n as trigger,c as watchEffect}; 2 | //# sourceMappingURL=reactivity.js.map 3 | -------------------------------------------------------------------------------- /dist/src/reactivity.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"reactivity.js","sources":["../../../src/reactivity.ts"],"sourcesContent":[null],"names":["activeEffects","targetMap","WeakMap","getTrackableObject","obj","callbacks","key","proxy","Proxy","get","target","receiver","result","Reflect","onGet","set","value","onSet","deleteProperty","onDeleteProperty","Array","isArray","Object","setPrototypeOf","prototype","track","length","depsMap","Map","dep","Set","forEach","effect","add","trigger","deps","watchEffect","push","pop","reactive","ref","raw","r","newVal","computed","getter"],"mappings":"AAQA,MAAMA,EAA8B,GAEvBC,EAAuB,IAAIC,QAoB3BC,EAAqB,CAChCC,EACAC,KAEA,IAAK,MAAMC,KAAOF,EACQ,iBAAbA,EAAIE,KACbF,EAAIE,GAAOH,EAAmBC,EAAIE,GAAMD,IAG5C,MAAME,EAAQ,IAAIC,MAAMJ,EAAK,CAC3BK,IAAIC,EAAsBJ,EAAaK,GACrC,MAAMC,EAASC,QAAQJ,IAAIC,EAAQJ,EAAKK,GAExC,OADAN,EAAUS,MAAMJ,EAAQJ,EAAKK,GACtBC,GAETG,IAAIL,EAAsBJ,EAAaU,EAAeL,GAC/B,iBAAVK,IACTA,EAAQb,EAAmBa,EAAOX,IAEpC,MAAMO,EAASC,QAAQE,IAAIL,EAAQJ,EAAKU,EAAOL,GAE/C,OADAN,EAAUY,MAAMP,EAAQJ,EAAKU,EAAOL,GAC7BC,GAETM,eAAeR,EAAsBJ,GACnC,MAAMM,EAASC,QAAQK,eAAeR,EAAQJ,GAE9C,OADAD,EAAUc,iBAAiBT,EAAQJ,GAC5BM,KAMX,OAHIQ,MAAMC,QAAQjB,IAChBkB,OAAOC,eAAehB,EAAOa,MAAMI,WAE9BjB,GAQIkB,EAAQ,CAACf,EAAgBJ,KACpC,IAAKN,EAAc0B,OAAQ,OAC3B,IAAIC,EAAU1B,EAAUQ,IAAIC,GACvBiB,IACHA,EAAU,IAAIC,IACd3B,EAAUc,IAAIL,EAAQiB,IAExB,IAAIE,EAAMF,EAAQlB,IAAIH,GACjBuB,IAEHA,EAAM,IAAIC,IACVH,EAAQZ,IAAIT,EAAKuB,IAEnB7B,EAAc+B,SAASC,GAAWH,EAAII,IAAID,MAQ/BE,EAAU,CAACxB,EAAsBJ,KAC5C,MAAMqB,EAAU1B,EAAUQ,IAAIC,GAC9B,IAAKiB,EAAS,OACd,MAAMQ,EAAOR,EAAQlB,IAAIH,GACpB6B,GAELA,EAAKJ,SAASC,IACZA,QAQSI,EAAeJ,IAC1BhC,EAAcqC,KAAKL,GACnBA,IACAhC,EAAcsC,OAQHC,EAAY7B,GAChBP,EAAmBO,EAAQ,CAChCI,MAAMJ,EAAQJ,GACZmB,EAAMf,EAAQJ,IAEhBW,MAAMP,EAAQJ,GACZ4B,EAAQxB,EAAQJ,IAElBa,uBASSqB,EAAOC,IAClB,MAAMC,EAAI,CACJ1B,YAEF,OADAS,EAAMiB,EAAG,SACFD,GAELzB,UAAM2B,GACJA,IAAWF,IACfA,EAAME,EACNT,EAAQQ,EAAG,YAGf,OAAOA,GASIE,EAAYC,IACvB,MAAMjC,EAAS4B,EAAI,MAEnB,OADAJ,GAAY,IAAOxB,EAAOI,MAAQ6B,MAC3BjC"} -------------------------------------------------------------------------------- /dist/src/renderers/attributeRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import { Renderer } from "./index"; 2 | declare const renderer: Renderer; 3 | export default renderer; 4 | -------------------------------------------------------------------------------- /dist/src/renderers/attributeRenderer.js: -------------------------------------------------------------------------------- 1 | import{evaluate as t}from"../lib/common.js";import{watchEffect as e}from"../reactivity.js";const r={renderer:(r,s)=>{const o="/* TNT_RENDERED */",i="__tnt_",n={};for(const a in r.props){let p=a;if(p.startsWith(i)&&(p=p.slice(i.length)),p.startsWith(":")||p.startsWith("on"))if(p.startsWith("on")){if(r.props[a].startsWith(o))continue;const t=i+p;let e="";for(const t in s)e+=`const ${t} = ${JSON.stringify(s[t])}; `;const c=`${o} with (window.data) {${e}${r.props[t in r.props?t:p].toString()}}`;n[t]=r.props[a],r.el.setAttribute(p,c),r.props[p]=c}else a.startsWith(":on")&&console.warn("[TNT warn] Using reactive binding and event listeners at the same time will cause the program to run not as expected.","Please extract logic or remove one of the effect bindings."),r.el.removeAttribute(a),e((()=>{r.el.setAttribute(a.slice(1),t(r.props[a],s))}))}for(const t in n)r.el.setAttribute(t,n[t]),r.props[t]=n[t];return!0},name:"attributeRenderer",shouldFire(t){for(const e in t.props)if(e.startsWith(":")||e.startsWith("on"))return!0;return!1}};export{r as default}; 2 | //# sourceMappingURL=attributeRenderer.js.map 3 | -------------------------------------------------------------------------------- /dist/src/renderers/attributeRenderer.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"attributeRenderer.js","sources":["../../../../src/renderers/attributeRenderer.ts"],"sourcesContent":[null],"names":["renderer","currentNode","extraContext","TNT_RENDERED","TNT_PRESERVED_PREFIX","specialListeners","key","props","realKey","startsWith","slice","length","originalKey","injectContext","ctx","JSON","stringify","script","toString","el","setAttribute","console","warn","removeAttribute","watchEffect","evaluate","name","shouldFire","node"],"mappings":"2FAWA,MAmDMA,EAAqB,CACzBA,SApDwB,CAACC,EAAoBC,KAC7C,MAAMC,EAAe,qBACfC,EAAuB,SACvBC,EAAwC,GAE9C,IAAK,MAAMC,KAAOL,EAAYM,MAAO,CACnC,IAAIC,EAAUF,EAGd,GAFIE,EAAQC,WAAWL,KACrBI,EAAUA,EAAQE,MAAMN,EAAqBO,SAC1CH,EAAQC,WAAW,MAASD,EAAQC,WAAW,MAEpD,GAAID,EAAQC,WAAW,MAAvB,CACE,GAAIR,EAAYM,MAAMD,GAAKG,WAAWN,GAAe,SACrD,MAAMS,EAAcR,EAAuBI,EAC3C,IAAIK,EAAgB,GACpB,IAAK,MAAMC,KAAOZ,EAChBW,GAAiB,SAASC,OAASC,KAAKC,UACtCd,EAAaY,QAGjB,MAAMG,EAAS,GAAGd,yBAAoCU,IAAgBZ,EAAYM,MAChFK,KAAeX,EAAYM,MAAQK,EAAcJ,GACjDU,cACFb,EAAiBO,GAAeX,EAAYM,MAAMD,GAClDL,EAAYkB,GAAGC,aAAaZ,EAASS,GACrChB,EAAYM,MAAMC,GAAWS,OAI3BX,EAAIG,WAAW,QACjBY,QAAQC,KACN,wHACA,8DAIJrB,EAAYkB,GAAGI,gBAAgBjB,GAC/BkB,GAAY,KACVvB,EAAYkB,GAAGC,aACbd,EAAII,MAAM,GACVe,EAASxB,EAAYM,MAAMD,GAAMJ,OAIvC,IAAK,MAAMI,KAAOD,EAChBJ,EAAYkB,GAAGC,aAAad,EAAKD,EAAiBC,IAClDL,EAAYM,MAAMD,GAAOD,EAAiBC,GAE5C,OAAO,GAKPoB,KAAM,oBACNC,WAAWC,GACT,IAAK,MAAMtB,KAAOsB,EAAKrB,MACrB,GAAID,EAAIG,WAAW,MAAQH,EAAIG,WAAW,MAAO,OAAO,EAE1D,OAAO"} -------------------------------------------------------------------------------- /dist/src/renderers/conditionRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import { Renderer } from "./index"; 2 | export declare const TAGS_WITH_CONDITION: string[]; 3 | export declare const CONDITION_TAGS: string[]; 4 | declare const renderer: Renderer; 5 | export default renderer; 6 | -------------------------------------------------------------------------------- /dist/src/renderers/conditionRenderer.js: -------------------------------------------------------------------------------- 1 | import{evaluate as e}from"../lib/common.js";import{watchEffect as r}from"../reactivity.js";const t=["t-if","t-elif"],n=["t-if","t-elif","t-else"],o=(t,n)=>{let o=!1,l=!1;return r((()=>{const r=e(t.props.cond,n);o=!!r,l=o,o!==l&&(t.props.rendered="false"),t.props.rendered=o.toString()})),o},l=(n,o,l,d)=>{let s=!1;const i=l.children[l.children.length-1];return!(d-1==0||!t.includes(i.tag)||"true"===i.props.rendered)&&(r((()=>{const r=e(n.props.cond,o);s=!!r,n.props.rendered=s.toString()})),s)},d=(n,o,l,d)=>{let s=!1;const i=l.children[l.children.length-1];return!(d-1==0||!t.includes(i.tag))&&(r((()=>{console.log("else!!!!!!");const r=e(i.props.cond,o);s=!r,n.props.rendered=s.toString()})),s)},s={renderer:(e,r,t,n)=>{let s=null;return s="t-if"===e.tag?o:"t-elif"===e.tag?l:d,s(e,r,t,n)},name:"conditionRenderer",shouldFire:e=>n.includes(e.tag)};export{n as CONDITION_TAGS,t as TAGS_WITH_CONDITION,s as default}; 2 | //# sourceMappingURL=conditionRenderer.js.map 3 | -------------------------------------------------------------------------------- /dist/src/renderers/conditionRenderer.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"conditionRenderer.js","sources":["../../../../src/renderers/conditionRenderer.ts"],"sourcesContent":[null],"names":["TAGS_WITH_CONDITION","CONDITION_TAGS","ifRenderer","currentNode","extraContext","shouldRender","oldShouldRender","watchEffect","result","evaluate","props","cond","rendered","toString","elifRenderer","rootVNode","index","previousElement","children","length","includes","tag","elseRenderer","console","log","renderer","currentRenderer","name","shouldFire","node"],"mappings":"iGAMaA,EAAsB,CAAC,OAAQ,UAE/BC,EAAiB,CAAC,OAAQ,SAAU,UAS3CC,EAAa,CAACC,EAAoBC,KACtC,IAAIC,GAAe,EACfC,GAAkB,EAUtB,OATAC,GAAY,KACV,MAAMC,EAASC,EAASN,EAAYO,MAAMC,KAAMP,GAChDC,IAAiBG,EACjBF,EAAkBD,EACdA,IAAiBC,IACnBH,EAAYO,MAAME,SAAW,SAE/BT,EAAYO,MAAME,SAAWP,EAAaQ,cAErCR,GAaHS,EAAe,CACnBX,EACAC,EACAW,EACAC,KAEA,IAAIX,GAAe,EACnB,MAAMY,EAAmBF,EAAUG,SACjCH,EAAUG,SAASC,OAAS,GAE9B,QACEH,EAAQ,GAAM,IACbhB,EAAoBoB,SAASH,EAAgBI,MACX,SAAnCJ,EAAgBP,MAAME,YAGxBL,GAAY,KACV,MAAMC,EAASC,EAASN,EAAYO,MAAMC,KAAMP,GAChDC,IAAiBG,EACjBL,EAAYO,MAAME,SAAWP,EAAaQ,cAErCR,IAaHiB,EAAe,CACnBnB,EACAC,EACAW,EACAC,KAEA,IAAIX,GAAe,EACnB,MAAMY,EAAmBF,EAAUG,SACjCH,EAAUG,SAASC,OAAS,GAE9B,QAAIH,EAAQ,GAAM,IAAMhB,EAAoBoB,SAASH,EAAgBI,QAErEd,GAAY,KACVgB,QAAQC,IAAI,cACZ,MAAMhB,EAASC,EAASQ,EAAgBP,MAAMC,KAAMP,GACpDC,GAAgBG,EAChBL,EAAYO,MAAME,SAAWP,EAAaQ,cAErCR,IA+BHoB,EAAqB,CACzBA,SAlBwB,CACxBtB,EACAC,EACAW,EACAC,KAEA,IAAIU,EAAkB,KAQtB,OANEA,EADsB,SAApBvB,EAAYkB,IACInB,EACW,WAApBC,EAAYkB,IACHP,EAEAQ,EAEbI,EAAgBvB,EAAaC,EAAcW,EAAWC,IAK7DW,KAAM,oBACNC,WAAWC,GACF5B,EAAemB,SAASS,EAAKR"} -------------------------------------------------------------------------------- /dist/src/renderers/getRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import { Renderer } from "./index"; 2 | declare const renderer: Renderer; 3 | export default renderer; 4 | -------------------------------------------------------------------------------- /dist/src/renderers/getRenderer.js: -------------------------------------------------------------------------------- 1 | import{reactive as e}from"../reactivity.js";const t={renderer:(t,s)=>{let r;const n=t.props.src,o=t.props.type,p=t.props.data,a=new XMLHttpRequest;if(a.open("GET",n,!1),void 0===p?a.send(null):a.send(p),"text"===o){const e=a.responseText;t.children=[e.toString()]}else if("json"===o){const t=a.responseText;if(!t)return;const s=JSON.parse(t);r=e(s)}return r.requestData={text:a.responseText,code:a.status},{shouldRender:!0,injectVariables:r}},name:"getRenderer",shouldFire:e=>"t-get"===e.tag};export{t as default}; 2 | //# sourceMappingURL=getRenderer.js.map 3 | -------------------------------------------------------------------------------- /dist/src/renderers/getRenderer.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"getRenderer.js","sources":["../../../../src/renderers/getRenderer.ts"],"sourcesContent":[null],"names":["renderer","currentNode","extraContext","buffer","getUrlResult","props","src","getDatasType","type","sendDatas","data","httpGetRequest","XMLHttpRequest","open","send","datas","responseText","children","toString","jsonData","JSON","parse","reactive","text","code","status","shouldRender","injectVariables","name","shouldFire","node","tag"],"mappings":"4CAIA,MAoCMA,EAAqB,CACzBA,SArCkB,CAClBC,EACAC,KAEA,IAAIC,EAEJ,MAAMC,EAAeH,EAAYI,MAAMC,IACjCC,EAAeN,EAAYI,MAAMG,KACjCC,EAAYR,EAAYI,MAAMK,KAC9BC,EAAiB,IAAIC,eAQ3B,GANAD,EAAeE,KAAK,MAAOT,GAAc,QAChB,IAAdK,EACTE,EAAeG,KAAK,MAEpBH,EAAeG,KAAKL,GAED,SAAjBF,EAAyB,CAC3B,MAAMQ,EAAQJ,EAAeK,aAC7Bf,EAAYgB,SAAW,CAACF,EAAMG,iBACzB,GAAqB,SAAjBX,EAAyB,CAClC,MAAMY,EAAWR,EAAeK,aAChC,IAAKG,EAAU,OACf,MAAMT,EAAOU,KAAKC,MAAMF,GACxBhB,EAASmB,EAASZ,GAMpB,OAJAP,EAAoB,YAAI,CACtBoB,KAAMZ,EAAeK,aACrBQ,KAAMb,EAAec,QAEhB,CACLC,cAAc,EACdC,gBAAiBxB,IAMnByB,KAAM,cACNC,WAAWC,GACW,UAAbA,EAAKC"} -------------------------------------------------------------------------------- /dist/src/renderers/index.d.ts: -------------------------------------------------------------------------------- 1 | import { VNode } from "../vdom"; 2 | export interface RenderedContent { 3 | shouldRender: boolean; 4 | injectVariables?: Record; 5 | } 6 | export interface Renderer { 7 | renderer: (currentNode: VNode, extraContext: object, rootVNode?: VNode, index?: number) => boolean | RenderedContent; 8 | name: string; 9 | shouldFire: (node: VNode) => boolean; 10 | fireOnMounted?: boolean; 11 | } 12 | export declare const renderers: Renderer[]; 13 | declare const _default: { 14 | renderers: Renderer[]; 15 | }; 16 | export default _default; 17 | -------------------------------------------------------------------------------- /dist/src/renderers/index.js: -------------------------------------------------------------------------------- 1 | import r from"./variableRenderer.js";import e from"./conditionRenderer.js";import o from"./loopRenderer.js";import t from"./attributeRenderer.js";import m from"./getRenderer.js";const i=[r,e,o,t,m];var n={renderers:i};export{n as default,i as renderers}; 2 | //# sourceMappingURL=index.js.map 3 | -------------------------------------------------------------------------------- /dist/src/renderers/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sources":["../../../../src/renderers/index.ts"],"sourcesContent":[null],"names":["renderers","variableRenderer","conditionRenderer","loopRenderer","attributeRenderer","getRenderer","renderers$1"],"mappings":"kLA0Ca,MAAAA,EAAwB,CACnCC,EACAC,EACAC,EACAC,EACAC,GAGF,IAAeC,EAAA,CAEbN"} -------------------------------------------------------------------------------- /dist/src/renderers/loopRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import { Renderer } from "./index"; 2 | declare const renderer: Renderer; 3 | export default renderer; 4 | -------------------------------------------------------------------------------- /dist/src/renderers/loopRenderer.js: -------------------------------------------------------------------------------- 1 | import{evaluate as e}from"../lib/common.js";import{createVNodeFromElement as r,createVdomFromExistingElement as o}from"../vdom.js";import n from"./index.js";const s={renderer:(s,t)=>{const i=s.props.data.split(" in "),d=i[0].trim(),l=e(i[1].trim(),t),c=s.el.children[0];s.children=[];for(const[e,i]of l.entries()){const l=r(c);o(l,l.el,Object.assign(Object.assign({},t),{[d]:i}));let a=!0;n.renderers.forEach((r=>{if(!r.shouldFire(l))return;const o=r.renderer(l,Object.assign(Object.assign({},t),{[d]:i}),s,e);a="boolean"!=typeof o?o.shouldRender?a:o.shouldRender:o?a:o})),a&&s.children.push(l)}return!1},name:"loopRenderer",shouldFire:e=>"t-for"===e.tag};export{s as default}; 2 | //# sourceMappingURL=loopRenderer.js.map 3 | -------------------------------------------------------------------------------- /dist/src/renderers/loopRenderer.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"loopRenderer.js","sources":["../../../../src/renderers/loopRenderer.ts"],"sourcesContent":[null],"names":["renderer","currentNode","extraContext","expr","props","data","split","localName","trim","loopingValue","evaluate","originalChild","el","children","index","currentData","entries","currentChild","createVNodeFromElement","createVdomFromExistingElement","Object","assign","shouldRender","renderers","forEach","shouldFire","renderResult","push","name","node","tag"],"mappings":"6JAcA,MAyCMA,EAAqB,CACzBA,SA1CmB,CAACC,EAAoBC,KACxC,MAAMC,EAAOF,EAAYG,MAAMC,KAAKC,MAAM,QACpCC,EAAYJ,EAAK,GAAGK,OACpBC,EAAeC,EAASP,EAAK,GAAGK,OAAQN,GACxCS,EAAyBV,EAAYW,GAAGC,SAAS,GACvDZ,EAAYY,SAAW,GAEvB,IAAK,MAAOC,EAAOC,KAAgBN,EAAaO,UAAW,CACzD,MAAMC,EAAeC,EAAuBP,GAE5CQ,EAA8BF,EAAcA,EAAaL,GAAEQ,OAAAC,OAAAD,OAAAC,OAAA,GACtDnB,GAAY,CACfK,CAACA,GAAYQ,KAEf,IAAIO,GAAe,EAEnBC,EAAUA,UAAUC,SAASxB,IAC3B,IAAKA,EAASyB,WAAWR,GAAe,OAExC,MAAMS,EAAe1B,EAASA,SAC5BiB,iCACKf,GAAY,CAAEK,CAACA,GAAYQ,IAChCd,EACAa,GAMFQ,EAJ4B,kBAAjBI,EAIKA,EAAaJ,aAEzBA,EADAI,EAAaJ,aAJCI,EAA8BJ,EAAfI,KAO9BJ,GACJrB,EAAYY,SAAqBc,KAAKV,GAIzC,OAAO,GAKPW,KAAM,eACNH,WAAWI,GACW,UAAbA,EAAKC"} -------------------------------------------------------------------------------- /dist/src/renderers/variableRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import { Renderer } from "./index"; 2 | declare const renderer: Renderer; 3 | export default renderer; 4 | -------------------------------------------------------------------------------- /dist/src/renderers/variableRenderer.js: -------------------------------------------------------------------------------- 1 | import{evaluate as r}from"../lib/common.js";import{watchEffect as e}from"../reactivity.js";const o={renderer:(o,t)=>(e((()=>{o.children=[r(o.props.data,t).toString()]})),!0),name:"variableRenderer",shouldFire:r=>"v"===r.tag};export{o as default}; 2 | //# sourceMappingURL=variableRenderer.js.map 3 | -------------------------------------------------------------------------------- /dist/src/renderers/variableRenderer.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"variableRenderer.js","sources":["../../../../src/renderers/variableRenderer.ts"],"sourcesContent":[null],"names":["renderer","currentNode","extraContext","watchEffect","children","evaluate","props","data","toString","name","shouldFire","node","tag"],"mappings":"2FAWA,MASMA,EAAqB,CACzBA,SAVuB,CAACC,EAAoBC,KAC5CC,GAAY,KACVF,EAAYG,SAAW,CACrBC,EAASJ,EAAYK,MAAMC,KAAML,GAAcM,gBAG5C,GAKPC,KAAM,mBACNC,WAAWC,GACW,MAAbA,EAAKC"} -------------------------------------------------------------------------------- /dist/src/vdom.d.ts: -------------------------------------------------------------------------------- 1 | export declare type VNodeChild = VNode | string; 2 | export interface VNode { 3 | tag: string; 4 | props: Record; 5 | children: VNodeChild[]; 6 | el: Element; 7 | } 8 | export declare const h: (tag: string, props: Record, children: VNodeChild[], el?: Element) => VNode; 9 | export declare const mount: (vnode: VNode, container: Element, extraContext?: object) => Element; 10 | export declare const patch: (n1: VNode, n2: VNode, extraContext?: object) => void; 11 | export declare const getAttributesOfElement: (element: Element) => Record; 12 | export declare const createVdomFromExistingElement: (rootVNode: VNode, container: Element, extraContext?: object) => void; 13 | export declare const createVNodeFromElement: (node: Element) => VNode; 14 | -------------------------------------------------------------------------------- /dist/src/vdom.js: -------------------------------------------------------------------------------- 1 | import e from"./renderers/index.js";const t=(e,t={},r,n)=>({tag:e,props:t,children:r,el:n}),r=(t,n,o={})=>{const i=t.el=document.createElement(t.tag);for(const e in t.props){const r=t.props[e];i.setAttribute(e,r)}return e.renderers.forEach((e=>{e.fireOnMounted&&e.shouldFire(t)&&e.renderer(t,o)})),"string"==typeof t.children?(i.textContent=t.children,void n.appendChild(i)):(t.children.forEach((e=>{"string"!=typeof e?r(e,i,o):i.appendChild(document.createTextNode(e))})),n.appendChild(i),n)},n=(e,t,o={})=>{if(e.tag===t.tag){const i=t.el=e.el,d=e.props||{},s=t.props||{};for(const e in s){const t=d[e],r=s[e];r!==t&&i.setAttribute(e,r)}for(const e in d)e in s||i.removeAttribute(e);const l=e.children,c=t.children,h=Math.min(l.length,c.length);for(let e=0;el.length?void c.slice(l.length).forEach((e=>{"string"!=typeof e?r(e,i,o):i.appendChild(document.createTextNode(e))})):c.length{"string"!=typeof e?i.removeChild(e.el):i.removeChild(i.childNodes[t])})):void 0}throw new Error("Replacing root elements are not supported.")},o=e=>{const t={};for(let r=0;r{[...n.childNodes].forEach(((n,s)=>{if(n.nodeType===Node.TEXT_NODE){if(!n.textContent.trim())return;return void r.children.push(n.textContent)}if(n.nodeType!==Node.ELEMENT_NODE)return;let l=!0,c=d;const h=t(n.tagName.toLowerCase(),o(n),[]);h.el=n,e.renderers.forEach((e=>{if(!e.shouldFire(h))return;const t=e.renderer(h,c,r,s);"boolean"!=typeof t?(l=t.shouldRender||l,c=Object.assign(Object.assign({},c),t.injectVariables)):l=t?l:t})),l&&i(h,n,c),r.children.push(h)}))},d=e=>t(e.tagName.toLowerCase(),o(e),[],e);export{d as createVNodeFromElement,i as createVdomFromExistingElement,o as getAttributesOfElement,t as h,r as mount,n as patch}; 2 | //# sourceMappingURL=vdom.js.map 3 | -------------------------------------------------------------------------------- /dist/src/vdom.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"vdom.js","sources":["../../../src/vdom.ts"],"sourcesContent":[null],"names":["h","tag","props","children","el","mount","vnode","container","extraContext","document","createElement","key","value","setAttribute","renderers","forEach","renderer","fireOnMounted","shouldFire","textContent","appendChild","child","createTextNode","patch","n1","n2","oldProps","newProps","oldValue","newValue","removeAttribute","oldChildren","newChildren","commonLength","Math","min","length","i","oldChild","newChild","replaceChild","childNodes","slice","index","removeChild","Error","getAttributesOfElement","element","attributes","name","createVdomFromExistingElement","rootVNode","nodeType","Node","TEXT_NODE","trim","push","ELEMENT_NODE","shouldRender","injectContext","currentNode","tagName","toLowerCase","renderResult","injectVariables","createVNodeFromElement","node"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/tnt.min.js: -------------------------------------------------------------------------------- 1 | var TNT=function(e){"use strict"; 2 | /*! ***************************************************************************** 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 | PERFORMANCE OF THIS SOFTWARE. 15 | ***************************************************************************** */function t(e,t,r,n){if("a"===r&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(e):n?n.value:t.get(e)}function r(e,t,r,n,o){if("m"===n)throw new TypeError("Private method is not writable");if("a"===n&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===n?o.call(e,r):o?o.value=r:t.set(e,r),r}const n=e=>{const t={};for(const r in e)if(Array.isArray(e[r])){const o=[];e[r].forEach((e=>{"object"==typeof e?o.push(n(e)):o.push(e)})),t[r]=o}else"object"!=typeof e[r]||e[r].tagName?t[r]=e[r]:t[r]=n(e[r]);return t},o=(e,t={},r=!0)=>{let n="";for(const e in t)n+=`const ${e} = ${"string"==typeof t[e]?'"'+t[e]+'"':JSON.stringify(t[e])}; `;try{const o=Function("ctx",`with(window.data) {${n}; return ${e};}`);return r?o(t):o}catch(e){return e.toString()}},s=[],i=new WeakMap,a=(e,t)=>{for(const r in e)"object"==typeof e[r]&&(e[r]=a(e[r],t));const r=new Proxy(e,{get(e,r,n){const o=Reflect.get(e,r,n);return t.onGet(e,r,n),o},set(e,r,n,o){"object"==typeof n&&(n=a(n,t));const s=Reflect.set(e,r,n,o);return t.onSet(e,r,n,o),s},deleteProperty(e,r){const n=Reflect.deleteProperty(e,r);return t.onDeleteProperty(e,r),n}});return Array.isArray(e)&&Object.setPrototypeOf(r,Array.prototype),r},c=(e,t)=>{if(!s.length)return;let r=i.get(e);r||(r=new Map,i.set(e,r));let n=r.get(t);n||(n=new Set,r.set(t,n)),s.forEach((e=>n.add(e)))},l=(e,t)=>{const r=i.get(e);if(!r)return;const n=r.get(t);n&&n.forEach((e=>{e()}))},d=e=>{s.push(e),e(),s.pop()},h=e=>a(e,{onGet(e,t){c(e,t)},onSet(e,t){l(e,t)},onDeleteProperty(){}}),u=e=>{const t={get value(){return c(t,"value"),e},set value(r){r!==e&&(e=r,l(t,"value"))}};return t},p=e=>{const t=u(null);return d((()=>t.value=e())),t},f=["t-if","t-elif"],g=["t-if","t-elif","t-else"],v=(e,t)=>{let r=!1;return d((()=>{const n=o(e.props.cond,t);r=!!n,e.props.rendered=r.toString()})),r},w=(e,t,r,n)=>{let s=!1;const i=r.children[r.children.length-1];return!(n-1==0||!f.includes(i.tag)||"true"===i.props.rendered)&&(d((()=>{const r=o(e.props.cond,t);s=!!r,e.props.rendered=s.toString()})),s)},m=(e,t,r,n)=>{let s=!1;const i=r.children[r.children.length-1];return!(n-1==0||!f.includes(i.tag))&&(d((()=>{const r=o(i.props.cond,t);s=!r,e.props.rendered=s.toString()})),s)},y={renderer:(e,t)=>{const r=e.props.data.split(" in "),n=r[0].trim(),s=o(r[1].trim(),t),i=e.el.children[0];e.children=[];for(const[r,o]of s.entries()){const s=W(i);R(s,s.el,Object.assign(Object.assign({},t),{[n]:o}));let a=!0;b.renderers.forEach((i=>{if(!i.shouldFire(s))return;const c=i.renderer(s,Object.assign(Object.assign({},t),{[n]:o}),e,r);a="boolean"!=typeof c?c.shouldRender?a:c.shouldRender:c?a:c})),a&&e.children.push(s)}return!1},name:"loopRenderer",shouldFire:e=>"t-for"===e.tag};var b={renderers:[{renderer:(e,t)=>(d((()=>{e.children=[o(e.props.data,t).toString()]})),!0),name:"variableRenderer",shouldFire:e=>"v"===e.tag},{renderer:(e,t,r,n)=>{let o=null;return o="t-if"===e.tag?v:"t-elif"===e.tag?w:m,o(e,t,r,n)},name:"conditionRenderer",shouldFire:e=>g.includes(e.tag)},y,{renderer:(e,t)=>{const r="/* TNT_RENDERED */",n="__tnt_",s={};for(const i in e.props){let a=i;if(a.startsWith(n)&&(a=a.slice(n.length)),a.startsWith(":")||a.startsWith("on"))if(a.startsWith("on")){if(e.props[i].startsWith(r))continue;const o=n+a;let c="";for(const e in t)c+=`const ${e} = ${JSON.stringify(t[e])}; `;const l=`${r} with (window.data) {${c}${e.props[o in e.props?o:a].toString()}}`;s[o]=e.props[i],e.el.setAttribute(a,l),e.props[a]=l}else i.startsWith(":on")&&console.warn("[TNT warn] Using reactive binding and event listeners at the same time will cause the program to run not as expected.","Please extract logic or remove one of the effect bindings."),e.el.removeAttribute(i),d((()=>{e.el.setAttribute(i.slice(1),o(e.props[i],t))}))}for(const t in s)e.el.setAttribute(t,s[t]),e.props[t]=s[t];return!0},name:"attributeRenderer",shouldFire(e){for(const t in e.props)if(t.startsWith(":")||t.startsWith("on"))return!0;return!1}},{renderer:(e,t)=>{let r;const n=e.props.src,o=e.props.type,s=e.props.data,i=new XMLHttpRequest;if(i.open("GET",n,!1),void 0===s?i.send(null):i.send(s),"text"===o){const t=i.responseText;e.children=[t.toString()]}else if("json"===o){const e=i.responseText;if(!e)return;const t=JSON.parse(e);r=h(t)}return r.requestData={text:i.responseText,code:i.status},{shouldRender:!0,injectVariables:r}},name:"getRenderer",shouldFire:e=>"t-get"===e.tag}]};const T=(e,t={},r,n)=>({tag:e,props:t,children:r,el:n}),E=(e,t,r={})=>{const n=e.el=document.createElement(e.tag);for(const t in e.props){const r=e.props[t];n.setAttribute(t,r)}return b.renderers.forEach((t=>{t.fireOnMounted&&t.shouldFire(e)&&t.renderer(e,r)})),"string"==typeof e.children?(n.textContent=e.children,void t.appendChild(n)):(e.children.forEach((e=>{"string"!=typeof e?E(e,n,r):n.appendChild(document.createTextNode(e))})),t.appendChild(n),t)},N=(e,t,r={})=>{if(e.tag===t.tag){const n=t.el=e.el,o=e.props||{},s=t.props||{};for(const e in s){const t=o[e],r=s[e];r!==t&&n.setAttribute(e,r)}for(const e in o)e in s||n.removeAttribute(e);const i=e.children,a=t.children,c=Math.min(i.length,a.length);for(let e=0;ei.length?void a.slice(i.length).forEach((e=>{"string"!=typeof e?E(e,n,r):n.appendChild(document.createTextNode(e))})):a.length{"string"!=typeof e?n.removeChild(e.el):n.removeChild(n.childNodes[t])})):void 0}throw new Error("Replacing root elements are not supported.")},j=e=>{const t={};for(let r=0;r{[...t.childNodes].forEach(((t,n)=>{if(t.nodeType===Node.TEXT_NODE){if(!t.textContent.trim())return;return void e.children.push(t.textContent)}if(t.nodeType!==Node.ELEMENT_NODE)return;let o=!0,s=r;const i=T(t.tagName.toLowerCase(),j(t),[]);i.el=t,b.renderers.forEach((t=>{if(!t.shouldFire(i))return;const r=t.renderer(i,s,e,n);"boolean"!=typeof r?(o=r.shouldRender||o,s=Object.assign(Object.assign({},s),r.injectVariables)):o=r?o:r})),o&&R(i,t,s),e.children.push(i)}))},W=e=>T(e.tagName.toLowerCase(),j(e),[],e);var M,x,A,C,O,S,k,P,$,D,F;return x=new WeakMap,A=new WeakMap,C=new WeakMap,O=new WeakMap,S=new WeakMap,k=new WeakMap,P=new WeakMap,$=new WeakMap,M=new WeakSet,D=function(){const e=(e,r,n)=>{Array.isArray(n)&&(e.reactive[r].splice(0,e.reactive[r].length),e.reactive[r].push(...n)),l(t(this,S,"f")[r],r)},r={get(e,t){if("symbol"!=typeof t)return(t=t.toString())in e.reactive?e.reactive[t]:t in e.computed?e.computed[t].value:t in e.ref?(c(e.ref[t],"value"),e.ref[t].value):void console.warn(`[TNT warn] You accessed a value not defined (Reading '${t}').`)},set:(t,r,n)=>r in t.reactive?(e(t,r,n),!0):r in t.ref?(t.ref[r].value=n,l(t.ref[r],"value"),!0):(console.warn(`[TNT warn] You set a value not defined (Reading '${r}').`),!1),has:(e,t)=>("symbol"==typeof t&&(t=t.toString()),!(t in globalThis)&&(t in e.ref||t in e.reactive||t in e.computed))};return new Proxy({reactive:t(this,x,"f"),computed:t(this,A,"f"),ref:t(this,C,"f")},r)},F=function(e,t){e.children.length>1&&t.remove()},e.TNTApp=class{constructor(){M.add(this),x.set(this,void 0),A.set(this,void 0),C.set(this,void 0),O.set(this,void 0),S.set(this,void 0),k.set(this,void 0),P.set(this,void 0),$.set(this,void 0),r(this,k,(()=>{}),"f"),r(this,P,[],"f"),r(this,A,{},"f"),r(this,x,{},"f"),r(this,C,{},"f"),r(this,$,[],"f"),r(this,S,{},"f"),window.data={}}mount(e){let r=!1,o=null,s=null;return t(this,P,"f").push("mount"),d((()=>{var i;const a=null!==(i=null==s?void 0:s.el)&&void 0!==i?i:e.children[0],c=T(a.tagName,j(a),[]);if(c.el=a,R(c,a,{}),s=T(e.tagName,j(a),c.children,a),!r)return o=n(s),E(o,e,{}),r=!0,t(this,M,"m",F).call(this,e,a),void t(this,k,"f").call(this,this);const l=n(s);N(o,l,{}),o=n(l),t(this,M,"m",F).call(this,e,a)})),this}get data(){return t(this,O,"f")}useData(e){t(this,P,"f").push("data"),r(this,S,n(e),"f"),r(this,x,{},"f"),r(this,C,{},"f");for(const r in e)"object"!=typeof e[r]?t(this,C,"f")[r]=u(e[r]):t(this,x,"f")[r]=h(e[r]);return r(this,O,t(this,M,"m",D).call(this),"f"),window.data=t(this,O,"f"),this}useComputed(e){t(this,P,"f").push("computed"),t(this,P,"f").includes("data")||console.warn("[TNT warn] useComputed() hook is called before useData(). Any reactive data accessed from computed functions will not be accessable.","This may lead to unpredictable results or errors.");for(const r in e)t(this,A,"f")[r]=p(e[r]);return r(this,O,t(this,M,"m",D).call(this),"f"),window.data=t(this,O,"f"),this}useEffect(e){return t(this,P,"f").push("effect"),t(this,$,"f").push(e),d(e),this}onMounted(e){return r(this,k,e,"f"),this}},e.computed=p,e.getTrackableObject=a,e.h=T,e.mount=E,e.patch=N,e.reactive=h,e.ref=u,e.targetMap=i,e.track=c,e.trigger=l,e.watchEffect=d,Object.defineProperty(e,"__esModule",{value:!0}),e}({}); 16 | //# sourceMappingURL=tnt.min.js.map 17 | -------------------------------------------------------------------------------- /dist/tnt.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"tnt.min.js","sources":["../node_modules/tslib/tslib.es6.js","../../src/lib/common.ts","../../src/reactivity.ts","../../src/renderers/conditionRenderer.ts","../../src/renderers/loopRenderer.ts","../../src/renderers/index.ts","../../src/renderers/variableRenderer.ts","../../src/renderers/attributeRenderer.ts","../../src/renderers/getRenderer.ts","../../src/vdom.ts","../../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n 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;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n",null,null,null,null,null,null,null,null,null,null],"names":["__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","value","get","__classPrivateFieldSet","set","deepClone","obj","newObj","key","Array","isArray","newArr","forEach","val","push","tagName","evaluate","expression","extraContext","shouldExecuate","extraContextEval","JSON","stringify","func","Function","e","toString","activeEffects","targetMap","WeakMap","getTrackableObject","callbacks","proxy","Proxy","target","result","Reflect","onGet","onSet","deleteProperty","onDeleteProperty","Object","setPrototypeOf","prototype","track","length","depsMap","Map","dep","Set","effect","add","trigger","deps","watchEffect","pop","reactive","ref","raw","r","newVal","computed","getter","TAGS_WITH_CONDITION","CONDITION_TAGS","ifRenderer","currentNode","shouldRender","props","cond","rendered","elifRenderer","rootVNode","index","previousElement","children","includes","tag","elseRenderer","renderer","expr","data","split","localName","trim","loopingValue","originalChild","el","currentData","entries","currentChild","createVNodeFromElement","createVdomFromExistingElement","assign","renderers","shouldFire","renderResult","name","node","renderers$1","currentRenderer","loopRenderer","TNT_RENDERED","TNT_PRESERVED_PREFIX","specialListeners","realKey","startsWith","slice","originalKey","injectContext","ctx","script","setAttribute","console","warn","removeAttribute","buffer","getUrlResult","src","getDatasType","type","sendDatas","httpGetRequest","XMLHttpRequest","open","send","datas","responseText","jsonData","parse","text","code","status","injectVariables","h","mount","vnode","container","document","createElement","fireOnMounted","textContent","appendChild","child","createTextNode","patch","n1","n2","oldProps","newProps","oldValue","newValue","oldChildren","newChildren","commonLength","Math","min","i","oldChild","newChild","replaceChild","childNodes","removeChild","Error","getAttributesOfElement","element","attributes","nodeType","Node","TEXT_NODE","ELEMENT_NODE","toLowerCase","syncData","prop","splice","this","_TNTApp_originalData","handlers","globalThis","_TNTApp_reactiveData","_TNTApp_computedData","_TNTApp_refData","_TNTApp_removeUpdatedElements","toRemove","remove","constructor","_TNTApp_dataProxy","_TNTApp_onMounted","_TNTApp_hooksCalled","_TNTApp_watchEffects","window","isMounted","prevVdom","currentContainer","_a","newVdom","useData","useComputed","computedValues","useEffect","onMounted"],"mappings":"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"} -------------------------------------------------------------------------------- /docs/Overview.md: -------------------------------------------------------------------------------- 1 | # TNT.js Developer Documentation 2 | 3 | ## Overview 4 | 5 | ### What is TNT.js 6 | TNT.js is a front-end framework. It is designed to be user-friendly. You can choose either to use the deeper features (with more complex concepts) or use the simple features. 7 | 8 | ### How TNT.js works 9 | We use a lot of custom HTML tags. The TNT.js has two parts, including the TNT Runtime and plugins. If you want to develop plugins for TNT.js, please move to the plugin development. If you are the user, please move to the user guide. 10 | 11 | ## Portal 12 | 13 | [Plugin Development Guide](plugin/Overview.md) 14 | [User Guide](user-guide/Overview.md) 15 | [TNT.js Javascript API Documentation](api/Overview.md) 16 | [TNT.js Datatype Documentation](datastype/Overview.md) 17 | [TNT.js Code Style Documentation](style/Overview.md) 18 | -------------------------------------------------------------------------------- /docs/api/Overview.md: -------------------------------------------------------------------------------- 1 | # TNT.js Javascript API Documentation 2 | 3 | ## Overview 4 | This documentation is about the TNT.js Javascript API. 5 | 6 | ## Portal 7 | 8 | -------------------------------------------------------------------------------- /docs/datastype/Overview.md: -------------------------------------------------------------------------------- 1 | # TNTScript Datatype Documentation 2 | ## Overview 3 | ... 4 | ## Conversion Table 5 | This table is a comparison of TNTScript's datas' type and JavaScript's datas' type. 6 | 7 | |JavaScript|TNTScript| 8 | |-|-| 9 | |string|string| 10 | |number|number| 11 | |boolean|boolean| 12 | |object|object| 13 | |array|array| 14 | |Docment|dom| 15 | |function|function| 16 | |Array(TNTScript's code list)|func| 17 | |/|code| 18 | |jsx|htmlstring| -------------------------------------------------------------------------------- /docs/development/Overview.md: -------------------------------------------------------------------------------- 1 | # TNT.js Core Development 2 | 3 | ## Setting up the development environment 4 | 5 | Install dependencies: 6 | 7 | ```bash 8 | $ npm i 9 | ``` 10 | 11 | Then install [rollup.js](https://rollupjs.org/guide/en/): 12 | 13 | ```bash 14 | $ npm i -g rollup 15 | ``` 16 | 17 | And install [live-server](https://github.com/tapio/live-server) to have a better DX: 18 | 19 | ```bash 20 | $ npm i -g live-server 21 | ``` 22 | 23 | ## Running the application 24 | 25 | We need to serve ES Modules through HTTP/HTTPS so we can use them in the browser. 26 | 27 | To do so, fire up live-server: 28 | 29 | ```bash 30 | $ live-server 31 | ``` 32 | 33 | This will serve everything in the root folder at [localhost](http://127.0.0.1:8080). 34 | 35 | Additionally, contents in `index.html` can be found directly at [/](http://127.0.0.1:8080/). But `/index.html` works too! 36 | 37 | To start a live reload bundler, use `rollup -c -w`. This will watch for changes in the current folder and compile them! 38 | -------------------------------------------------------------------------------- /docs/plugin/Overview.md: -------------------------------------------------------------------------------- 1 | # TNT.js Plugin Development Guide 2 | 3 | ## Overview 4 | The **plugin** is a piece of code that extends the function of TNT.js. The plugins of TNT.js all have classes as their entry point. The entry class must implement an interface called`TNT.Plugin`. 5 | 6 | ## Portal 7 | 8 | [TNT.Plugin](TNT_Plugin.md) 9 | [TNT.Renderable](TNT_Renderable.md) 10 | -------------------------------------------------------------------------------- /docs/plugin/TNT_Plugin.md: -------------------------------------------------------------------------------- 1 | # `TNT.Plugin` 2 | 3 | ## Overview 4 | The interface that a plugin's main class must implement. 5 | 6 | ## Definition 7 | 8 | ```typescript 9 | export interface Plugin { 10 | get id(): string; 11 | get rendererList(): Array; 12 | get tags(): Array; 13 | get version(): string; 14 | dependencies?: string[]; 15 | onInit(): void; 16 | } 17 | ``` 18 | ## Members 19 | 20 | ```typescript 21 | get id(): string; 22 | ``` 23 | This method should return a string that represents the plugin. The id should be a string that only contains`abcdefghijklmnopqrstuvwxyz0123456789_`. 24 | 25 | ```typescript 26 | get rendererList(): Renderable[]; 27 | ``` 28 | This method should return a list of renderers. TNT.js runtime will call the renderer if needed. 29 | 30 | ```typescript 31 | get tags(): string[]; 32 | ``` 33 | The method should return a list of tag names that should be protected. The tag name listed here will be protected before rendering. If you want to access the innerHTML of HTML tags with tag names listed here in the render method, please use `xxx.getAttribute('data-tnt-plugin-value-backup')` (where `xxx` is an HTML element object) instead of `xxx.innerHTML`. 34 | 35 | ```typescript 36 | get version(): string; 37 | ``` 38 | This method should return a string that represents the version of the plugin. 39 | 40 | ```typescript 41 | dependencies?: string[]; 42 | ``` 43 | This field is optional. If your plugin depends on other plugins, you should add the ids of the plugins to this list. 44 | 45 | ```typescript 46 | onInit(): void; 47 | ``` 48 | This method will be called when TNTRuntime has successfully loaded this plugin. 49 | -------------------------------------------------------------------------------- /docs/plugin/TNT_Renderable.md: -------------------------------------------------------------------------------- 1 | # `TNT.Renderable` 2 | 3 | ## Overview 4 | The interface that plugins' renderer classes must implement. 5 | 6 | ## Definition 7 | 8 | ```typescript 9 | export interface Renderable { 10 | render(): void; 11 | } 12 | ``` 13 | ## Members 14 | 15 | ```typescript 16 | render(): void; 17 | ``` 18 | This method will be called when the runtime's renderer has been triggered (e.g. The symbol table has been updated). 19 | -------------------------------------------------------------------------------- /docs/style/CommitRules.md: -------------------------------------------------------------------------------- 1 | # Commit Rules 2 | 3 | ## Overview 4 | This documentation is about the rules of git committing messages. 5 | 6 | ## Rules 7 | 8 | TNTjs follows [Conventional Commit](https://www.conventionalcommits.org/) (or CC for short) commit message standard. 9 | 10 | The basic form of a commit message following CC standard is as follows: 11 | 12 | ``` 13 | [scope (optional)]: description 14 | 15 | [commit body(optional)] 16 | 17 | [commit footer(optional)] 18 | ``` 19 | 20 | And first off, `type` is a noun that describes the change. It can be one of the following: 21 | 22 | - `feat`: Introduces a new feature 23 | - `fix`: Fixes a bug 24 | - `docs`: Updates documentation 25 | - `style`: Updates code style 26 | - `refactor`: Performs a code refactoring (but not modifying any core features) 27 | - `test`: Adds or modifies tests 28 | - `chore`: Other changes that don't modify src or test files 29 | - `revert`: Reverts a previous commit 30 | - etc. 31 | 32 | For a full list of commit types, please refer to . 33 | 34 | The scope of the change is optional, specifying the scope of current changes. E.g: 35 | 36 | ``` 37 | build(npm): commit description 38 | ``` 39 | 40 | Commit description is a short overview of the change, written directly after the commit type (or commit scope, if any). 41 | 42 | The commit body below is optional as well. It is intended to be a detailed description of the change and describes some longer contexts, separated the commit description by a blank line. 43 | 44 | And the commit footer is also optional, which might include some additional tokens. Such as `Co-authored-by: user1, user2` means that the current commit was made by the submitter, user1 and user2. 45 | 46 | An important footer is `BREAKING CHANGE`, meaning that some breaking changes happened in the commit. For example: 47 | 48 | ``` 49 | BREAKING CHANGE: environment variables now take precedence over config files 50 | ``` 51 | 52 | Using CC with Husky and pre-commit hooks is highly recommended. -------------------------------------------------------------------------------- /docs/style/NamingRules.md: -------------------------------------------------------------------------------- 1 | # Naming Rules 2 | 3 | ## Overview 4 | This documentation is about the naming rules. 5 | 6 | ## Properties 7 | We don't allow **public fields**. Please use **getters and setters** with private fields instead. 8 | 9 | For private fields, use little pascal case with `prv_` prefix. Examples: 10 | ```typescript 11 | prv_content: string; 12 | prv_somethingStupid: object; 13 | prv_whateverItIs: number; 14 | ``` 15 | 16 | ## Methods (Including getters and setters) 17 | 18 | Use little pascal case. 19 | 20 | ## Typenames (Enum, class, namespace etc.) 21 | 22 | Use big pascal case, like 23 | ```typescript 24 | class SomeClassName {} 25 | ``` 26 | -------------------------------------------------------------------------------- /docs/style/Overview.md: -------------------------------------------------------------------------------- 1 | # TNT.js Code Style Documentation 2 | 3 | ## Overview 4 | This documentation is about the code style of the TNT.js development. Every developer who develops TNT.js (either runtime or integrated plugins) should follow those rules. 5 | 6 | ## Portal 7 | 8 | [Naming Rules](NamingRules.md) 9 | [Commit Rules](CommitRules.md) 10 | -------------------------------------------------------------------------------- /docs/user-guide/HTMLTags.md: -------------------------------------------------------------------------------- 1 | # HTML Tags 2 | 3 | ## Overview 4 | This article is about the custom HTML tags that TNT.js runtime provides. 5 | 6 | ## `` 7 | The `` tag will insert a variable into the HTML tag. The value of the variable should be restored in the `TNT.Globals.symbolTable`. `` tag's behavior may be changed by plugins. 8 | 9 | ## `` 10 | Enable the Debug plugin. 11 | 12 | ## `` 13 | Disable the TNTScript plugin. 14 | 15 | ## `` 16 | Disable a plugin. The id of the plugin should be in the property `plugin`. 17 | 18 | ## `` and `` 19 | Disable all the plugins. Not recommended. 20 | -------------------------------------------------------------------------------- /docs/user-guide/Overview.md: -------------------------------------------------------------------------------- 1 | # TNT.js User Guide 2 | 3 | ## Overview 4 | Welcome to the world of TNT.js! To use TNT.js, you just need to reference the `tnt.min.js` by using a single ` 8 | tntjs demo 9 | id1 10 | 11 | 12 |
13 |
14 |
15 |
16 |
17 | 18 | 19 | wc 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | Yes 29 | 30 | 31 | No 32 | 33 | 34 |
35 |
36 | 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tntjs", 3 | "version": "0.2.4", 4 | "description": "The JavaScript framework for modern web.", 5 | "main": "dist/src/index.js", 6 | "files": [ 7 | "dist/src/**", 8 | "dist/node_modules/**" 9 | ], 10 | "scripts": { 11 | "build": "rollup --config", 12 | "dev": "rollup --config --watch" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/Bug-Duck/tntjs.git" 17 | }, 18 | "author": "BugDuck, 27Onion, Acbox", 19 | "license": "MIT", 20 | "devDependencies": { 21 | "@babel/core": "^7.18.6", 22 | "@rollup/plugin-alias": "^3.1.9", 23 | "@rollup/plugin-babel": "^5.3.1", 24 | "@rollup/plugin-node-resolve": "^13.3.0", 25 | "@rollup/plugin-typescript": "^8.3.2", 26 | "@typescript-eslint/eslint-plugin": "^5.27.0", 27 | "@typescript-eslint/parser": "^5.27.0", 28 | "babel-plugin-external-helpers": "^6.22.0", 29 | "babel-preset-es2015": "^6.24.1", 30 | "babel-preset-minify": "^0.5.2", 31 | "eslint": "^8.17.0", 32 | "javascript-obfuscator": "^4.0.0", 33 | "rollup-plugin-serve": "^1.1.0", 34 | "rollup-plugin-terser": "^7.0.2", 35 | "ts-loader": "^9.3.0", 36 | "typescript": "^4.7.3", 37 | "webpack-cli": "^4.9.2" 38 | }, 39 | "dependencies": { 40 | "tslib": "^2.4.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /roadmap.md: -------------------------------------------------------------------------------- 1 | # TNTjs Roadmap 2 | 3 | Our roadmap is a list of features that we are working on, what stage they're in and when we expect to bring them to you. Share your feelings about our new features via submitting a new issue! 4 | 5 | ## TODO 6 | 7 | - Port the current code to meet the ES6 standard 8 | - Refactor the whole codebase 9 | - Better project structure 10 | - Finish documentation 11 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import alias from "@rollup/plugin-alias"; 2 | import resolve from "@rollup/plugin-node-resolve"; 3 | import typescript from "@rollup/plugin-typescript"; 4 | import babel from "@rollup/plugin-babel"; 5 | import { terser } from "rollup-plugin-terser"; 6 | 7 | export default { 8 | input: "src/index.ts", 9 | preserveModules: true, 10 | treeshake: false, 11 | output: { 12 | format: "esm", 13 | sourcemap: true, 14 | dir: "./dist", 15 | name: "TNT", 16 | }, 17 | plugins: [ 18 | alias({ 19 | entries: [ 20 | { find: "runtime", replacement: "src/runtime" }, 21 | { find: "plugins", replacement: "src/plugins" }, 22 | { find: "utils", replacement: "src/utils" }, 23 | ], 24 | }), 25 | resolve(), 26 | typescript(), 27 | babel({ 28 | babelHelpers: "bundled", 29 | exclude: ["node_modules/**"] 30 | }), 31 | terser(), 32 | ], 33 | }; -------------------------------------------------------------------------------- /src/component/index.ts: -------------------------------------------------------------------------------- 1 | // export const readModule = (path: string) => { 2 | // // Get module datas. 3 | // const http = new XMLHttpRequest(); 4 | // http.open("GET", `${path}/tnt.module.json`, true); 5 | // http.send(); 6 | // const module = JSON.parse(http.responseText); 7 | // return module; 8 | // }; 9 | 10 | export class TNTModule { 11 | #paramers: Record; 12 | 13 | constructor() { 14 | this.#paramers = {}; 15 | } 16 | 17 | /** 18 | * 19 | */ 20 | useParamers(paramers: Record) { 21 | this.#paramers = paramers; 22 | } 23 | } 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { deepClone } from "./lib/common"; 2 | import { 3 | computed, 4 | reactive, 5 | ref, 6 | track, 7 | trigger, 8 | watchEffect, 9 | } from "./reactivity"; 10 | import { 11 | createVdomFromExistingElement, 12 | getAttributesOfElement, 13 | h, 14 | mount, 15 | patch, 16 | VNode, 17 | } from "./vdom"; 18 | import { 19 | TNTPlugin 20 | } from "./plugin"; 21 | 22 | export type TNTData = object; 23 | 24 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 25 | export type TNTEffect = () => any; 26 | 27 | export type TNTComputed = Record; 28 | 29 | // tweak the Window object a bit to pass type check 30 | declare global { 31 | export interface Window { 32 | data: TNTData; 33 | } 34 | } 35 | 36 | /** Create a new TNTjs application. */ 37 | export class TNTApp { 38 | /** Reactive data object */ 39 | #reactiveData: object; 40 | /** Computed data object */ 41 | #computedData: object; 42 | /** Reference-value data object */ 43 | #refData: object; 44 | /** Helper proxy for watching modifications on data */ 45 | #dataProxy: object; 46 | /** Original data passed into {@link TNTApp.useData()} */ 47 | #originalData: object; 48 | /** Function to run when application was first mounted */ 49 | #onMounted: (app: TNTApp) => void; 50 | /** Function to run before tntjs app load*/ 51 | #onReady: (app: TNTApp) => void; 52 | /** Helper array for storing currently called `TNTApp.use*` hooks. */ 53 | #hooksCalled: string[]; 54 | /** Effects watched in {@link TNTApp.useEffect()} */ 55 | #watchEffects: TNTEffect[]; 56 | /** HTML Files's page-id */ 57 | #pageid: string; 58 | /** TNTPlugin data list*/ 59 | #pluginData: TNTPlugin[]; 60 | 61 | 62 | constructor() { 63 | // eslint-disable-next-line @typescript-eslint/no-empty-function 64 | this.#onMounted = () => { }; 65 | // eslint-disable-next-line @typescript-eslint/no-empty-function 66 | this.#onReady = () => { }; 67 | this.#hooksCalled = []; 68 | this.#computedData = {}; 69 | this.#reactiveData = {}; 70 | this.#refData = {}; 71 | this.#watchEffects = []; 72 | this.#originalData = {}; 73 | this.#pluginData = []; 74 | window.data = {}; 75 | 76 | // pageID 77 | const pageIdElement = document.getElementsByTagName("page-id")[0]; 78 | this.#pageid = pageIdElement.innerHTML; 79 | pageIdElement.innerHTML = ""; 80 | } 81 | 82 | page( 83 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 84 | createFunctions: Record, 85 | ...page_id: string[] 86 | ) { 87 | if (!(page_id.includes(this.#pageid))) return; 88 | (typeof createFunctions.main !== "undefined") ? (() => { 89 | window.onload = createFunctions.main; 90 | })() : undefined; 91 | (typeof createFunctions.ready !== "undefined") ? (() => { 92 | this.#onReady = createFunctions.ready; 93 | // run ready function before mount. 94 | this.#onReady(this); 95 | })() : undefined; 96 | (typeof createFunctions.data !== "undefined") ? this.#useData(createFunctions.data) : undefined; 97 | (typeof createFunctions.computed !== "undefined") ? this.#useComputed(createFunctions.computed) : undefined; 98 | (typeof createFunctions.effect !== "undefined") ? this.#useEffect(createFunctions.effect) : undefined; 99 | (typeof createFunctions.mounted !== "undefined") ? (() => { 100 | this.#onMounted = createFunctions.mounted; 101 | })() : undefined; 102 | (typeof createFunctions.mount !== "undefined") ? this.#mount(createFunctions.mount) : undefined; 103 | } 104 | 105 | useExportPlugin(plugin: TNTPlugin) { 106 | this.#pluginData.push(plugin); 107 | } 108 | 109 | #loadPlugin(plugin: TNTPlugin) { 110 | const funcs = plugin.methods(); 111 | for (const i in funcs) { 112 | this[i] = funcs[i]; 113 | } 114 | plugin.onload(); 115 | } 116 | 117 | /** 118 | * Initialize and mount a new TNT Application. 119 | * @param container The container element to mount with. 120 | * @returns Mounted TNTApp instance. 121 | */ 122 | #mount(container: Element) { 123 | let isMounted = false; 124 | let prevVdom: VNode | null = null; 125 | let currentNode = null; 126 | this.#hooksCalled.push("mount"); 127 | 128 | // app lifecycle loop 129 | watchEffect(() => { 130 | const currentContainer: Element = 131 | currentNode?.el ?? container.children[0]; 132 | const vnode = h( 133 | currentContainer.tagName, 134 | getAttributesOfElement(currentContainer), 135 | [] 136 | ); 137 | vnode.el = currentContainer; 138 | createVdomFromExistingElement(vnode, currentContainer, {}); 139 | currentNode = h( 140 | container.tagName, 141 | getAttributesOfElement(currentContainer), 142 | vnode.children, 143 | currentContainer 144 | ); 145 | if (!isMounted) { 146 | prevVdom = deepClone(currentNode); 147 | mount(prevVdom, container, {}); 148 | isMounted = true; 149 | this.#removeUpdatedElements(container, currentContainer); 150 | this.#onMounted(this); 151 | return; 152 | } 153 | const newVdom: VNode = deepClone(currentNode); 154 | patch(prevVdom, newVdom, {}); 155 | prevVdom = deepClone(newVdom); 156 | this.#removeUpdatedElements(container, currentContainer); 157 | }); 158 | 159 | this.#pluginData.forEach(i => { 160 | this.#loadPlugin(i); 161 | }); 162 | 163 | return this; 164 | } 165 | 166 | /** All defined reactive / ref data. */ 167 | get data() { 168 | return this.#dataProxy; 169 | } 170 | 171 | /** 172 | * Generate a new TNT data proxy based on reactive and reference data. 173 | * The generated proxy will watch for re-assignments as well as reading values and handle edge cases. 174 | * @returns Proxied TNT data object. 175 | */ 176 | #getDataProxy() { 177 | type MixedTarget = { reactive: object; computed: object; ref: object }; 178 | 179 | const syncData = (target: MixedTarget, prop: string, value: object) => { 180 | // edge-case handling for re-assgining arrays 181 | if (Array.isArray(value)) { 182 | // re-creating the reactive array will drop its former effects 183 | // so for work-around this will clear the array and push new elements into it 184 | // TODO: improve performance for re-assigning reactive arrays 185 | target.reactive[prop].splice(0, target.reactive[prop].length); 186 | target.reactive[prop].push(...value); 187 | } 188 | // manually trigger an update 189 | trigger(this.#originalData[prop], prop); 190 | }; 191 | 192 | const handlers = { 193 | get(target: MixedTarget, prop: string | symbol) { 194 | if (typeof prop === "symbol") return undefined; 195 | prop = prop.toString(); 196 | if (prop in target.reactive) { 197 | return target.reactive[prop]; 198 | } 199 | if (prop in target.computed) { 200 | return target.computed[prop].value; 201 | } 202 | if (prop in target.ref) { 203 | track(target.ref[prop], "value"); 204 | return target.ref[prop].value; 205 | } 206 | console.warn( 207 | `[TNT warn] You accessed a value not defined (Reading '${prop}').` 208 | ); 209 | return undefined; 210 | }, 211 | set(target: MixedTarget, prop: string, value: object) { 212 | if (prop in target.reactive) { 213 | syncData(target, prop, value); 214 | return true; 215 | } 216 | if (prop in target.ref) { 217 | target.ref[prop].value = value; 218 | trigger(target.ref[prop], "value"); 219 | return true; 220 | } 221 | console.warn( 222 | `[TNT warn] You set a value not defined (Reading '${prop}').` 223 | ); 224 | return false; 225 | }, 226 | has(target: MixedTarget, key: string | symbol) { 227 | if (typeof key === "symbol") { 228 | key = key.toString(); 229 | } 230 | if (key in globalThis) return false; 231 | return ( 232 | key in target.ref || key in target.reactive || key in target.computed 233 | ); 234 | }, 235 | }; 236 | 237 | return new Proxy( 238 | { 239 | reactive: this.#reactiveData, 240 | computed: this.#computedData, 241 | ref: this.#refData, 242 | }, 243 | handlers 244 | ); 245 | } 246 | 247 | usePlugin(plugin: TNTPlugin) { 248 | this.#pluginData.push(plugin); 249 | return this; 250 | } 251 | 252 | /** 253 | * Hook to create reactive data objects. 254 | * @param data Data to become reactive. 255 | * @returns Current `TNTApp` instance. 256 | */ 257 | #useData(data: TNTData) { 258 | this.#hooksCalled.push("data"); 259 | this.#originalData = deepClone(data); 260 | this.#reactiveData = {}; 261 | this.#refData = {}; 262 | for (const key in data) { 263 | if (typeof data[key] === "object") { 264 | this.#reactiveData[key] = reactive(data[key]); 265 | continue; 266 | } 267 | this.#refData[key] = ref(data[key]); 268 | } 269 | this.#dataProxy = this.#getDataProxy(); 270 | window.data = this.#dataProxy; 271 | return this; 272 | } 273 | 274 | /** 275 | * Hook to create computed values with ease. 276 | * @param computedValues Functions to calcuate each computed value. 277 | * @returns Current `TNTApp` instance. 278 | */ 279 | #useComputed(computedValues: TNTComputed) { 280 | this.#hooksCalled.push("computed"); 281 | if (!this.#hooksCalled.includes("data")) { 282 | console.warn( 283 | "[TNT warn] useComputed() hook is called before useData(). Any reactive data accessed from computed functions will not be accessable.", 284 | "This may lead to unpredictable results or errors." 285 | ); 286 | } 287 | for (const key in computedValues) { 288 | this.#computedData[key] = computed(computedValues[key]); 289 | } 290 | this.#dataProxy = this.#getDataProxy(); 291 | window.data = this.#dataProxy; 292 | return this; 293 | } 294 | 295 | /** 296 | * Hook to watch effect dependency updates. 297 | * @param effect Effect function to watch. 298 | * @returns Current `TNTApp` instance. 299 | */ 300 | #useEffect(effect: TNTEffect) { 301 | this.#hooksCalled.push("effect"); 302 | this.#watchEffects.push(effect); 303 | watchEffect(effect); 304 | return this; 305 | } 306 | 307 | /** 308 | * Remove older child elements. 309 | * @param element The root element to check children length. 310 | * @param toRemove The child element to remove. 311 | */ 312 | #removeUpdatedElements(element: Element, toRemove: Element) { 313 | if (element.children.length > 1) toRemove.remove(); 314 | } 315 | } 316 | 317 | export { 318 | computed, 319 | getTrackableObject, 320 | reactive, 321 | ref, 322 | targetMap, 323 | watchEffect, 324 | trigger, 325 | track, 326 | } from "./reactivity"; 327 | export { h, mount, patch } from "./vdom"; 328 | export { TNTPlugin } from "./plugin"; 329 | -------------------------------------------------------------------------------- /src/lib/common.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Deep clone an object. 3 | * @param obj Object to clone. 4 | * @returns Deep cloned object. 5 | */ 6 | export const deepClone = (obj: any) => { 7 | const newObj: any = {}; 8 | for (const key in obj) { 9 | if (Array.isArray(obj[key])) { 10 | const newArr = []; 11 | obj[key].forEach((val) => { 12 | if (typeof val === "object") newArr.push(deepClone(val)); 13 | else newArr.push(val); 14 | }); 15 | newObj[key] = newArr; 16 | continue; 17 | } 18 | if (typeof obj[key] === "object" && !obj[key].tagName) { 19 | newObj[key] = deepClone(obj[key]); 20 | continue; 21 | } 22 | newObj[key] = obj[key]; 23 | } 24 | return newObj; 25 | }; 26 | 27 | /** 28 | * Evaluate an expression. 29 | * @param expression Expression to evaluate its value. 30 | * @param extraContext Some extra context to inject. 31 | * @param shouldExecuate Whether or not to execuate the generated function. 32 | * @returns Evaluated result or error message. 33 | */ 34 | export const evaluate = ( 35 | expression: string, 36 | extraContext = {}, 37 | shouldExecuate = true 38 | ) => { 39 | let extraContextEval = ""; 40 | for (const key in extraContext) { 41 | extraContextEval += `const ${key} = ${ 42 | typeof extraContext[key] === "string" 43 | ? '"' + extraContext[key] + '"' 44 | : JSON.stringify(extraContext[key]) 45 | }; `; 46 | } 47 | try { 48 | const func = Function( 49 | "ctx", 50 | `with(window.data) {${extraContextEval}; return ${expression};}` 51 | ); 52 | return shouldExecuate ? func(extraContext) : func; 53 | } catch (e) { 54 | return e.toString(); 55 | } 56 | }; 57 | 58 | export const addCssText = (cssText: string, member: string) => { 59 | const css = cssText.trim(); 60 | const lastChar = css[length - 1]; 61 | if (lastChar === ";") return css + member; 62 | else return ";" + css + member; 63 | }; 64 | -------------------------------------------------------------------------------- /src/plugin.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-empty-function */ 2 | /** 3 | * tntjs plugin devlop. 4 | */ 5 | 6 | export class TNTPlugin { 7 | /** TNT plugin's name */ 8 | name: string; 9 | /** TNT plugin's version */ 10 | version: string; 11 | 12 | onload() {} 13 | render() {} 14 | watchEffect() {} 15 | methods(): Record any)> { 16 | return {}; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/reactivity.ts: -------------------------------------------------------------------------------- 1 | /** An effect to be ran when its dependencies change. */ 2 | export type EffectType = () => void; 3 | /** Objects that can be reactive. */ 4 | export type ReactiveType = object; 5 | /** Map to store reactive object - dependencies - effects data. */ 6 | type TargetMap = WeakMap>>; 7 | 8 | /** Currently active running effects. */ 9 | const activeEffects: EffectType[] = []; 10 | /** {@inheritDoc TargetMap} */ 11 | export const targetMap: TargetMap = new WeakMap(); 12 | 13 | /** Callbasks when a trackable object changes. */ 14 | interface TrackableCallback { 15 | onGet: (target: ReactiveType, key: string, receiver: any) => void; 16 | onSet: ( 17 | target: ReactiveType, 18 | key: string, 19 | value: ReactiveType, 20 | receiver: any 21 | ) => void; 22 | onDeleteProperty: (target: ReactiveType, key: string) => void; 23 | } 24 | 25 | /** 26 | * Get a trackable proxy object and fire certain callbacks on certain events. 27 | * @param obj The object to track updates. 28 | * @param callbacks Callbacks to run when certain event was fired. 29 | * @returns A proxy to the original object. 30 | */ 31 | export const getTrackableObject = ( 32 | obj: ReactiveType, 33 | callbacks: TrackableCallback 34 | ) => { 35 | for (const key in obj) { 36 | if (typeof obj[key] === "object") { 37 | obj[key] = getTrackableObject(obj[key], callbacks); 38 | } 39 | } 40 | const proxy = new Proxy(obj, { 41 | get(target: ReactiveType, key: string, receiver: any) { 42 | const result = Reflect.get(target, key, receiver); 43 | callbacks.onGet(target, key, receiver); 44 | return result; 45 | }, 46 | set(target: ReactiveType, key: string, value: object, receiver: any) { 47 | if (typeof value === "object") { 48 | value = getTrackableObject(value, callbacks); 49 | } 50 | const result = Reflect.set(target, key, value, receiver); 51 | callbacks.onSet(target, key, value, receiver); 52 | return result; 53 | }, 54 | deleteProperty(target: ReactiveType, key: string) { 55 | const result = Reflect.deleteProperty(target, key); 56 | callbacks.onDeleteProperty(target, key); 57 | return result; 58 | }, 59 | }); 60 | if (Array.isArray(obj)) { 61 | Object.setPrototypeOf(proxy, Array.prototype); 62 | } 63 | return proxy; 64 | }; 65 | 66 | /** 67 | * Track the current running effect's dependencies. 68 | * @param target The reactive object to track. 69 | * @param key The key to fetch data from. 70 | */ 71 | export const track = (target: object, key: string) => { 72 | if (!activeEffects.length) return; 73 | let depsMap = targetMap.get(target); 74 | if (!depsMap) { 75 | depsMap = new Map(); 76 | targetMap.set(target, depsMap); 77 | } 78 | let dep = depsMap.get(key); 79 | if (!dep) { 80 | // using set assures that no duplicate effects will be stored 81 | dep = new Set(); 82 | depsMap.set(key, dep); 83 | } 84 | activeEffects.forEach((effect) => dep.add(effect)); 85 | }; 86 | 87 | /** 88 | * Trigger effects of certain dependencies. 89 | * @param target The reactive object to trigger effects. 90 | * @param key The key to fetch dependencies from. 91 | */ 92 | export const trigger = (target: ReactiveType, key: string) => { 93 | const depsMap = targetMap.get(target); 94 | if (!depsMap) return; 95 | const deps = depsMap.get(key); 96 | if (!deps) return; 97 | 98 | deps.forEach((effect) => { 99 | effect(); 100 | }); 101 | }; 102 | 103 | /** 104 | * Watch an effect's dependencies. 105 | * @param effect Effect to run when its dependencies changed. 106 | */ 107 | export const watchEffect = (effect: EffectType) => { 108 | activeEffects.push(effect); 109 | effect(); 110 | activeEffects.pop(); 111 | }; 112 | 113 | /** 114 | * Create a reactive object and enable two-way auto update. 115 | * @param target The object to be made reactive. 116 | * @returns The proxied reactive object. 117 | */ 118 | export const reactive = (target: ReactiveType) => { 119 | return getTrackableObject(target, { 120 | onGet(target, key) { 121 | track(target, key); 122 | }, 123 | onSet(target, key) { 124 | trigger(target, key); 125 | }, 126 | onDeleteProperty() {}, 127 | }); 128 | }; 129 | 130 | /** 131 | * Create a reactive reference to a plain value. 132 | * @param raw A raw value to be reactive. 133 | * @returns The proxied object with `.value` getters and setters. 134 | */ 135 | export const ref = (raw: ReactiveType) => { 136 | const r = { 137 | get value() { 138 | track(r, "value"); 139 | return raw; 140 | }, 141 | set value(newVal) { 142 | if (newVal === raw) return; 143 | raw = newVal; 144 | trigger(r, "value"); 145 | }, 146 | }; 147 | return r; 148 | }; 149 | 150 | /** 151 | * Create a reactive computed value. 152 | * @note `computed` is built on top of {@link ref} API. Any updates must be using `.value` accessor. 153 | * @param getter Function to calculate the computed value. 154 | * @returns A reference object to the computed value. 155 | */ 156 | export const computed = (getter: () => ReactiveType) => { 157 | const result = ref(null); 158 | watchEffect(() => (result.value = getter())); 159 | return result; 160 | }; 161 | -------------------------------------------------------------------------------- /src/renderers/attributeRenderer.ts: -------------------------------------------------------------------------------- 1 | import { evaluate } from "../lib/common"; 2 | import { watchEffect } from "../reactivity"; 3 | import { VNode } from "../vdom"; 4 | import { Renderer } from "./index"; 5 | 6 | /** 7 | * Render attribute bindings. 8 | * @param currentNode Current VNode to render. 9 | * @param extraContext Some extra context to inject. 10 | * @returns Whether to continue rendering `currentNode`'s children or not. 11 | */ 12 | const attributeRenderer = (currentNode: VNode, extraContext: object) => { 13 | const TNT_RENDERED = "/* TNT_RENDERED */"; 14 | const TNT_PRESERVED_PREFIX = "__tnt_"; 15 | const specialListeners: Record = {}; 16 | 17 | for (const key in currentNode.props) { 18 | let realKey = key; 19 | if (realKey.startsWith(TNT_PRESERVED_PREFIX)) 20 | realKey = realKey.slice(TNT_PRESERVED_PREFIX.length); 21 | if (!realKey.startsWith(":") && !realKey.startsWith("on")) continue; 22 | 23 | if (realKey.startsWith("on")) { 24 | if (currentNode.props[key].startsWith(TNT_RENDERED)) continue; 25 | const originalKey = TNT_PRESERVED_PREFIX + realKey; 26 | let injectContext = ""; 27 | for (const ctx in extraContext) 28 | injectContext += `const ${ctx} = ${JSON.stringify( 29 | extraContext[ctx] 30 | )}; `; 31 | 32 | const script = `${TNT_RENDERED} with (window.data) {${injectContext}${currentNode.props[ 33 | originalKey in currentNode.props ? originalKey : realKey 34 | ].toString()}}`; 35 | specialListeners[originalKey] = currentNode.props[key]; 36 | currentNode.el.setAttribute(realKey, script); 37 | currentNode.props[realKey] = script; 38 | continue; 39 | } 40 | 41 | if (key.startsWith(":on")) { 42 | console.warn( 43 | "[TNT warn] Using reactive binding and event listeners at the same time will cause the program to run not as expected.", 44 | "Please extract logic or remove one of the effect bindings." 45 | ); 46 | } 47 | // original attribute is no longer needed 48 | currentNode.el.removeAttribute(key); 49 | watchEffect(() => { 50 | currentNode.el.setAttribute( 51 | key.slice(1), 52 | evaluate(currentNode.props[key], extraContext) 53 | ); 54 | }); 55 | } 56 | for (const key in specialListeners) { 57 | currentNode.el.setAttribute(key, specialListeners[key]); 58 | currentNode.props[key] = specialListeners[key]; 59 | } 60 | return true; 61 | }; 62 | 63 | const renderer: Renderer = { 64 | renderer: attributeRenderer, 65 | name: "attributeRenderer", 66 | shouldFire(node) { 67 | for (const key in node.props) { 68 | if (key.startsWith(":") || key.startsWith("on")) return true; 69 | } 70 | return false; 71 | }, 72 | }; 73 | 74 | export default renderer; 75 | -------------------------------------------------------------------------------- /src/renderers/conditionRenderer.ts: -------------------------------------------------------------------------------- 1 | import { evaluate } from "../lib/common"; 2 | import { watchEffect } from "../reactivity"; 3 | import { VNode } from "../vdom"; 4 | import { Renderer } from "./index"; 5 | 6 | /** Condition tags with `props.cond` property. */ 7 | export const TAGS_WITH_CONDITION = ["t-if", "t-elif"]; 8 | /** All condition tags, discarding its actual condition. */ 9 | export const CONDITION_TAGS = ["t-if", "t-elif", "t-else"]; 10 | 11 | /** 12 | * Render a `` element. 13 | * This renderer will render its children if `currentNode.props.cond` returns a truthy value, not rendering otherwise. 14 | * @param currentNode Current node to check condition. 15 | * @param extraContext Some extra variable context to inject. 16 | * @returns Whether should continue to render currentNode's children. 17 | */ 18 | const ifRenderer = (currentNode: VNode, extraContext: object) => { 19 | let shouldRender = false; 20 | let oldShouldRender = false; 21 | watchEffect(() => { 22 | const result = evaluate(currentNode.props.cond, extraContext); 23 | shouldRender = !!result; 24 | oldShouldRender = shouldRender; 25 | if (shouldRender !== oldShouldRender) { 26 | currentNode.props.rendered = "false"; 27 | } 28 | currentNode.props.rendered = shouldRender.toString(); 29 | }); 30 | return shouldRender; 31 | }; 32 | 33 | /** 34 | * Render a `` element. 35 | * This renderer will only render `currentNode`'s children if its previous element sibling is a `` or `` 36 | * and its previoud element's condition is a falsy value. 37 | * @param currentNode Current node to render. 38 | * @param extraContext Some extra variable context to inject. 39 | * @param rootVNode The root VNode of `currentNode`. 40 | * @param index The position of `currentNode` in `rootVNode.children`. 41 | * @returns Whether to continue to render currentNode's children nodes. 42 | */ 43 | const elifRenderer = ( 44 | currentNode: VNode, 45 | extraContext: object, 46 | rootVNode: VNode, 47 | index: number 48 | ) => { 49 | let shouldRender = false; 50 | const previousElement = (rootVNode.children as VNode[])[ 51 | rootVNode.children.length - 1 52 | ]; 53 | if ( 54 | index - 1 === 0 || 55 | !TAGS_WITH_CONDITION.includes(previousElement.tag) || 56 | previousElement.props.rendered === "true" 57 | ) 58 | return false; 59 | watchEffect(() => { 60 | const result = evaluate(currentNode.props.cond, extraContext); 61 | shouldRender = !!result; 62 | currentNode.props.rendered = shouldRender.toString(); 63 | }); 64 | return shouldRender; 65 | }; 66 | 67 | /** 68 | * Render a `` element. 69 | * This renderer will only render if `currentNode`'s previous element is a valid condition element AND its condition 70 | * is a falsy value. 71 | * @param currentNode Current node to render. 72 | * @param extraContext Some extra context to inject. 73 | * @param rootVNode The root VNode of `currentNode`. 74 | * @param index The position of `currentNode` in `rootVNode.children`. 75 | * @returns Whether to continue to render currentNode's children elements. 76 | */ 77 | const elseRenderer = ( 78 | currentNode: VNode, 79 | extraContext: object, 80 | rootVNode: VNode, 81 | index: number 82 | ) => { 83 | let shouldRender = false; 84 | const previousElement = (rootVNode.children as VNode[])[ 85 | rootVNode.children.length - 1 86 | ]; 87 | if (index - 1 === 0 || !TAGS_WITH_CONDITION.includes(previousElement.tag)) 88 | return false; 89 | watchEffect(() => { 90 | console.log("else!!!!!!"); 91 | const result = evaluate(previousElement.props.cond, extraContext); 92 | shouldRender = !result; 93 | currentNode.props.rendered = shouldRender.toString(); 94 | }); 95 | return shouldRender; 96 | }; 97 | 98 | /** 99 | * Render condition tags. 100 | * This renderer will only render if the condition of current element is truthy and its corresponding builtin 101 | * conditions met the requirements. 102 | * @see {@link ifRenderer}, {@link elifRenderer}, {@link elseRenderer} 103 | * @param currentNode Current node to render. 104 | * @param extraContext Some extra context to inject. 105 | * @param rootVNode The root VNode of `currentNode`. 106 | * @param index The position of `currentNode` in `rootVNode.children`. 107 | * @returns Whether to continue render currentNode's children elements. 108 | */ 109 | const conditionRenderer = ( 110 | currentNode: VNode, 111 | extraContext: object, 112 | rootVNode: VNode, 113 | index: number 114 | ) => { 115 | let currentRenderer = null; 116 | if (currentNode.tag === "t-if") { 117 | currentRenderer = ifRenderer; 118 | } else if (currentNode.tag === "t-elif") { 119 | currentRenderer = elifRenderer; 120 | } else { 121 | currentRenderer = elseRenderer; 122 | } 123 | return currentRenderer(currentNode, extraContext, rootVNode, index); 124 | }; 125 | 126 | const renderer: Renderer = { 127 | renderer: conditionRenderer, 128 | name: "conditionRenderer", 129 | shouldFire(node) { 130 | return CONDITION_TAGS.includes(node.tag); 131 | }, 132 | }; 133 | 134 | export default renderer; 135 | -------------------------------------------------------------------------------- /src/renderers/getRenderer.ts: -------------------------------------------------------------------------------- 1 | import { reactive } from "../reactivity"; 2 | import { VNode } from "../vdom"; 3 | import { RenderedContent, Renderer } from "./index"; 4 | 5 | const getRenderer = ( 6 | currentNode: VNode, 7 | extraContext: object 8 | ): RenderedContent => { 9 | let buffer: {}; 10 | // get url datas from src 11 | const getUrlResult = currentNode.props.src; 12 | const getDatasType = currentNode.props.type; 13 | const sendDatas = currentNode.props.data; 14 | const httpGetRequest = new XMLHttpRequest(); 15 | // TODO: improve this request method to async and don't do sync operations on the main thread 16 | httpGetRequest.open("GET", getUrlResult, false); 17 | if (typeof sendDatas === "undefined") { 18 | httpGetRequest.send(null); 19 | } else { 20 | httpGetRequest.send(sendDatas); 21 | } 22 | if (getDatasType === "text") { 23 | const datas = httpGetRequest.responseText; 24 | currentNode.children = [datas.toString()]; 25 | } else if (getDatasType === "json") { 26 | const jsonData = httpGetRequest.responseText; 27 | if (!jsonData) return; 28 | const data = JSON.parse(jsonData); 29 | buffer = reactive(data); 30 | } 31 | buffer["requestData"] = { 32 | text: httpGetRequest.responseText, 33 | code: httpGetRequest.status, 34 | }; 35 | return { 36 | shouldRender: true, 37 | injectVariables: buffer, 38 | }; 39 | }; 40 | 41 | const renderer: Renderer = { 42 | renderer: getRenderer, 43 | name: "getRenderer", 44 | shouldFire(node) { 45 | return node.tag === "t-get"; 46 | }, 47 | }; 48 | 49 | export default renderer; 50 | -------------------------------------------------------------------------------- /src/renderers/index.ts: -------------------------------------------------------------------------------- 1 | import { VNode } from "../vdom"; 2 | import variableRenderer from "./variableRenderer"; 3 | import conditionRenderer from "./conditionRenderer"; 4 | import loopRenderer from "./loopRenderer"; 5 | import attributeRenderer from "./attributeRenderer"; 6 | import getRenderer from "./getRenderer"; 7 | 8 | /** Return values for rendered contents. */ 9 | export interface RenderedContent { 10 | /** Weather the current node should render on page. */ 11 | shouldRender: boolean; 12 | /** A collection of variable values to inject into the children renderers. */ 13 | injectVariables?: Record; 14 | } 15 | /** A standard renderer model for builtin or custom renderers. */ 16 | export interface Renderer { 17 | /** 18 | * The main renderer function. 19 | * @param currentNode VNode to render. 20 | * @param extraContext Some extra variable context to render the content 21 | * @param rootVNode Root VNode of the currently rendering VNode. 22 | * @param index The current position of currentNode in rootVNode's children list. 23 | * @returns Whether to render currentNode's children elements if returned a boolean, higher level reference elsewise (see {@link RenderedContent}). 24 | */ 25 | renderer: ( 26 | currentNode: VNode, 27 | extraContext: object, 28 | rootVNode?: VNode, 29 | index?: number 30 | ) => boolean | RenderedContent; 31 | /** Name of current renderer, only for debugging purposes. */ 32 | name: string; 33 | /** 34 | * Function to check whether current node should be called with current renderer. 35 | * @param node Current VNode to check. 36 | * @returns Whether to call current render function or not. 37 | */ 38 | shouldFire: (node: VNode) => boolean; 39 | /** Whether current renderer should be fired on mount stage */ 40 | fireOnMounted?: boolean; 41 | } 42 | 43 | export const renderers: Renderer[] = [ 44 | variableRenderer, 45 | conditionRenderer, 46 | loopRenderer, 47 | attributeRenderer, 48 | getRenderer, 49 | ]; 50 | 51 | export default { 52 | /** Builtin renderers. */ 53 | renderers, 54 | }; 55 | -------------------------------------------------------------------------------- /src/renderers/loopRenderer.ts: -------------------------------------------------------------------------------- 1 | import { evaluate } from "../lib/common"; 2 | import { 3 | createVdomFromExistingElement, 4 | createVNodeFromElement, 5 | VNode, 6 | } from "../vdom"; 7 | import renderers, { Renderer } from "./index"; 8 | 9 | /** 10 | * Render a `` loop. 11 | * @param currentNode Currently rendering VNode. 12 | * @param extraContext Some extra context to fill in to the evaluation process. 13 | * @returns Whether to continue rendering its children or not. 14 | */ 15 | const loopRenderer = (currentNode: VNode, extraContext: object) => { 16 | const expr = currentNode.props.data.split(" in "); 17 | const localName = expr[0].trim(); 18 | const loopingValue = evaluate(expr[1].trim(), extraContext); 19 | const originalChild: Element = currentNode.el.children[0]; 20 | currentNode.children = []; 21 | 22 | for (const [index, currentData] of loopingValue.entries()) { 23 | const currentChild = createVNodeFromElement(originalChild); 24 | // custom rendering logic 25 | createVdomFromExistingElement(currentChild, currentChild.el, { 26 | ...extraContext, 27 | [localName]: currentData, 28 | }); 29 | let shouldRender = true; 30 | // FIXME: condition tags in t-for tags will not update reactively with arrays 31 | renderers.renderers.forEach((renderer) => { 32 | if (!renderer.shouldFire(currentChild)) return; 33 | // if (currentChild.tag === ("t-elif" || "t-else")) return; 34 | const renderResult = renderer.renderer( 35 | currentChild, 36 | { ...extraContext, [localName]: currentData }, 37 | currentNode, 38 | index 39 | ); 40 | if (typeof renderResult === "boolean") { 41 | shouldRender = !renderResult ? renderResult : shouldRender; 42 | return; 43 | } 44 | shouldRender = !renderResult.shouldRender 45 | ? renderResult.shouldRender 46 | : shouldRender; 47 | }); 48 | if (!shouldRender) continue; 49 | (currentNode.children as VNode[]).push(currentChild); 50 | } 51 | 52 | // do not render its children since they're already rendered 53 | return false; 54 | }; 55 | 56 | const renderer: Renderer = { 57 | renderer: loopRenderer, 58 | name: "loopRenderer", 59 | shouldFire(node) { 60 | return node.tag === "t-for"; 61 | }, 62 | }; 63 | 64 | export default renderer; 65 | -------------------------------------------------------------------------------- /src/renderers/variableRenderer.ts: -------------------------------------------------------------------------------- 1 | import { evaluate } from "../lib/common"; 2 | import { watchEffect } from "../reactivity"; 3 | import { VNode } from "../vdom"; 4 | import { Renderer } from "./index"; 5 | 6 | /** 7 | * Render a variable (`` tag). 8 | * @param currentNode Node that need to be rendered. 9 | * @param extraContext Some extra context to inject. 10 | * @returns Whether to continue render `currentNode`'s children elements. 11 | */ 12 | const variableRenderer = (currentNode: VNode, extraContext: object) => { 13 | watchEffect(() => { 14 | currentNode.children = [ 15 | evaluate(currentNode.props.data, extraContext).toString(), 16 | ]; 17 | }); 18 | return true; 19 | }; 20 | 21 | const renderer: Renderer = { 22 | renderer: variableRenderer, 23 | name: "variableRenderer", 24 | shouldFire(node) { 25 | return node.tag === "v"; 26 | }, 27 | }; 28 | 29 | export default renderer; 30 | -------------------------------------------------------------------------------- /src/route.ts: -------------------------------------------------------------------------------- 1 | // export class Route { 2 | // #routeList: r[]; 3 | // #main: String; 4 | 5 | // constructor() { 6 | // /** 7 | // * 1.第一次渲染,调用change 8 | // * 2.当hash(#后面的值)发生变化,调用一次change 9 | // * 3.change变化之后,改变url hash的值 10 | // */ 11 | // console.log("%c第一次初始化", "color: red"); 12 | // this.#change(window.location.hash.replace(/#/, "")); 13 | // window.onhashchange = () => { 14 | // console.log("%c检测到#后的值变化", "color: red"); 15 | // this.#change(window.location.hash.replace(/#/, "")); 16 | // }; 17 | // this.#routeList = []; 18 | // } 19 | 20 | // /** 21 | // * load the route 22 | // * @date 2022-07-22 23 | // * @param {r} obj path and element (route object) 24 | // * @returns {any} 25 | // */ 26 | // useRoute(obj: r): void { 27 | // this.#routeList.push(obj); 28 | // console.log("%c 加载路由成功!", "color: red"); 29 | // } 30 | 31 | // /** 32 | // * set the router main page 33 | // * @date 2022-07-22 34 | // * @param {String} path main page path 35 | // * @returns {any} 36 | // */ 37 | // useMainRoute(path: String): void { 38 | // this.#main = path; 39 | // console.log("%c设置主路由成功!", "color: red"); 40 | // } 41 | 42 | // toggle(path: String) { 43 | // this.#change(window.location.hash.replace(/#/, "")); 44 | // window.history.pushState({}, document.title, `#${path.toString()}`); 45 | // console.log("%c页面切换成功!", "color: red"); 46 | // // window.location.hash = path.toString(); 47 | // } 48 | 49 | // #change(path: String) { 50 | // /** */ 51 | // if (typeof this.#main === "undefined") return console.log("%c监测到没有设置主路由", "color: red"); 52 | // if (path === "") { 53 | // console.log("%c 监测到#后为空,设置为主路由","color: red"); 54 | // try { 55 | // this.#routeList.forEach((i) => { 56 | // if (i.path === this.#main) { 57 | // i.ele.style.display = "block"; 58 | // throw new Error("break"); 59 | // } else { 60 | // i.ele.style.display = "none"; 61 | // } 62 | // }); 63 | // } catch (e) { 64 | // if (e !== "break") throw e; 65 | // } 66 | // } else { 67 | // this.#routeList.forEach((i) => { 68 | // if (i.path !== path) { 69 | // i.ele.style.display = "block"; 70 | // window.location.hash = path.toString(); 71 | // } else { 72 | // i.ele.style.display = "none"; 73 | // } 74 | // }); 75 | // } 76 | // console.log("%c视图渲染成功!", "color: red"); 77 | // } 78 | // } 79 | 80 | // export class r { 81 | // #path: String; 82 | // #pageElementObject: HTMLElement; 83 | 84 | // constructor(path: String, pageElementObject: HTMLElement) { 85 | // this.#pageElementObject = pageElementObject; 86 | // this.#path = path; 87 | // } 88 | 89 | // get path() { 90 | // return this.#path; 91 | // } 92 | 93 | // get ele() { 94 | // return this.#pageElementObject; 95 | // } 96 | // } 97 | 98 | // const Router = new Route(); 99 | // export { Router }; 100 | -------------------------------------------------------------------------------- /src/vdom.ts: -------------------------------------------------------------------------------- 1 | import renderers from "./renderers/index"; 2 | 3 | export type VNodeChild = VNode | string; 4 | 5 | /** A Virtual Node representation. */ 6 | export interface VNode { 7 | /** Node tag name. */ 8 | tag: string; 9 | /** Node properties */ 10 | props: Record; 11 | /** Node children */ 12 | children: VNodeChild[]; 13 | /** Actual element in DOM for the current VNode. */ 14 | el: Element; 15 | } 16 | 17 | /** 18 | * Constructs a VNode. 19 | * @param tag Tag name. 20 | * @param props Tag attributes / properties. 21 | * @param children Tag children. 22 | * @param el Tag actual DOM element 23 | * @returns Constructed Virtual DOM Node. 24 | */ 25 | export const h = ( 26 | tag: string, 27 | props: Record = {}, 28 | children: VNodeChild[], 29 | el?: Element 30 | ): VNode => { 31 | return { tag, props, children, el }; 32 | }; 33 | 34 | /** 35 | * Mounts a VNode to an actual DOM element. 36 | * @param vnode The root VNode to mount with. 37 | * @param container The container DOM element to contain all generated nodes. 38 | * @returns The container element with generated nodes appended. 39 | */ 40 | export const mount = ( 41 | vnode: VNode, 42 | container: Element, 43 | extraContext: object = {} 44 | ) => { 45 | const el = (vnode.el = document.createElement(vnode.tag)); 46 | // processing props 47 | for (const key in vnode.props) { 48 | const value = vnode.props[key]; 49 | el.setAttribute(key, value); 50 | } 51 | renderers.renderers.forEach((renderer) => { 52 | if (!renderer.fireOnMounted || !renderer.shouldFire(vnode)) return; 53 | renderer.renderer(vnode, extraContext); 54 | }); 55 | 56 | // processing children 57 | if (typeof vnode.children === "string") { 58 | 59 | 60 | el.textContent = vnode.children; 61 | container.appendChild(el); 62 | return; 63 | } 64 | vnode.children.forEach((child) => { 65 | if (typeof child === "string") { 66 | el.appendChild(document.createTextNode(child)); 67 | return; 68 | } 69 | mount(child, el, extraContext); 70 | }); 71 | container.appendChild(el); 72 | return container; 73 | }; 74 | 75 | /** 76 | * Patches the current actual element to a new VNode and replace the older one. 77 | * Note that this function will modify the DOM. 78 | * @param n1 The old VNode to be replaced. 79 | * @param n2 The newer VNode to update the current DOM to. 80 | */ 81 | export const patch = (n1: VNode, n2: VNode, extraContext: object = {}) => { 82 | if (n1.tag === n2.tag) { 83 | const el = (n2.el = n1.el); 84 | // props 85 | const oldProps = n1.props || {}; 86 | const newProps = n2.props || {}; 87 | for (const key in newProps) { 88 | const oldValue = oldProps[key]; 89 | const newValue = newProps[key]; 90 | if (newValue === oldValue) continue; 91 | el.setAttribute(key, newValue); 92 | } 93 | for (const key in oldProps) { 94 | if (!(key in newProps)) { 95 | el.removeAttribute(key); 96 | } 97 | } 98 | 99 | // children 100 | const oldChildren = n1.children; 101 | const newChildren = n2.children; 102 | const commonLength = Math.min(oldChildren.length, newChildren.length); 103 | for (let i = 0; i < commonLength; i++) { 104 | const oldChild = oldChildren[i]; 105 | const newChild = newChildren[i]; 106 | if (typeof oldChild === "string") { 107 | if (typeof newChild === "string") { 108 | if (oldChild !== newChild) { 109 | el.replaceChild( 110 | document.createTextNode(newChild), 111 | el.childNodes[i] 112 | ); 113 | } 114 | continue; 115 | } 116 | } 117 | patch(oldChild as VNode, newChild as VNode, extraContext); 118 | } 119 | if (newChildren.length > oldChildren.length) { 120 | newChildren.slice(oldChildren.length).forEach((child: VNode) => { 121 | if (typeof child === "string") { 122 | el.appendChild(document.createTextNode(child)); 123 | return; 124 | } 125 | mount(child, el, extraContext); 126 | }); 127 | return; 128 | } 129 | if (newChildren.length < oldChildren.length) { 130 | oldChildren 131 | .slice(newChildren.length) 132 | .forEach((child: VNodeChild, index) => { 133 | if (typeof child === "string") { 134 | el.removeChild(el.childNodes[index]); 135 | return; 136 | } 137 | el.removeChild(child.el); 138 | }); 139 | return; 140 | } 141 | return; 142 | } 143 | throw new Error("Replacing root elements are not supported."); 144 | }; 145 | 146 | /** 147 | * Helper function to get and convert attributes from an element to use the object structure. 148 | * @param element The element to get attributes from. 149 | * @returns Attributes in a single object-like structure. 150 | */ 151 | export const getAttributesOfElement = ( 152 | element: Element 153 | ): Record => { 154 | const attributes = {}; 155 | for (let i = 0; i < element.attributes.length; i++) { 156 | const value = element.attributes[i].value; 157 | const name = element.attributes[i].name; 158 | attributes[name] = value; 159 | } 160 | return attributes; 161 | }; 162 | 163 | /** 164 | * Generates a new VNode from existing elemnt. 165 | * @param rootVNode The root VNode to append children to. 166 | * @param container The container element to generate VNodes from. 167 | * @param extraContext Some extra context data to pass to `evaulate()`. 168 | */ 169 | export const createVdomFromExistingElement = ( 170 | rootVNode: VNode, 171 | container: Element, 172 | extraContext: object = {} 173 | ) => { 174 | [...container.childNodes].forEach((child: Element, index) => { 175 | if (child.nodeType === Node.TEXT_NODE) { 176 | if (!child.textContent.trim()) return; 177 | rootVNode.children.push(child.textContent); 178 | return; 179 | } 180 | // only generate text node and element node 181 | if (child.nodeType !== Node.ELEMENT_NODE) { 182 | return; 183 | } 184 | // if (child.closest("t-for")) return; 185 | let shouldRender = true; 186 | let injectContext = extraContext; 187 | const currentNode = h( 188 | child.tagName.toLowerCase(), 189 | getAttributesOfElement(child), 190 | [] 191 | ); 192 | currentNode.el = child; 193 | // fire renderers 194 | renderers.renderers.forEach((renderer) => { 195 | if (!renderer.shouldFire(currentNode)) return; 196 | const renderResult = renderer.renderer( 197 | currentNode, 198 | injectContext, 199 | rootVNode, 200 | index 201 | ); 202 | if (typeof renderResult === "boolean") { 203 | shouldRender = !renderResult ? renderResult : shouldRender; 204 | return; 205 | } 206 | shouldRender = renderResult.shouldRender || shouldRender; 207 | injectContext = { ...injectContext, ...renderResult.injectVariables }; 208 | }); 209 | if (shouldRender) { 210 | createVdomFromExistingElement(currentNode, child, injectContext); 211 | } 212 | (rootVNode.children as VNode[]).push(currentNode); 213 | }); 214 | }; 215 | 216 | /** 217 | * Create a new VNode from the given element. 218 | * Note: this function will not generate children nodes. To include children generation, 219 | * please use {@link createVdomFromExistingElement}. 220 | * @param node Element to create VNode from. 221 | * @returns The generated VNode object. 222 | */ 223 | export const createVNodeFromElement = (node: Element): VNode => { 224 | return h(node.tagName.toLowerCase(), getAttributesOfElement(node), [], node); 225 | }; 226 | -------------------------------------------------------------------------------- /test/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Bob", 3 | "age": "14", 4 | "language": "English" 5 | } -------------------------------------------------------------------------------- /test/test-module/index.tnt.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bug-Duck/tntjs/8a91c1e480ba169b2b743368901d8c848d4f9499/test/test-module/index.tnt.xml -------------------------------------------------------------------------------- /test/test-module/tnt.module.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test", 3 | "tag": "test" 4 | } -------------------------------------------------------------------------------- /test/todo-demo/style.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;700&display=swap"); 2 | #root, 3 | #root * { 4 | font-family: "Poppins", sans-serif; 5 | } 6 | 7 | #root { 8 | display: flex; 9 | align-items: center; 10 | justify-content: center; 11 | } 12 | 13 | .container { 14 | display: block; 15 | width: 500px; 16 | } 17 | 18 | button { 19 | background-color: #ef4444; 20 | color: #fff; 21 | border-radius: 10px; 22 | border: none; 23 | padding: 10px; 24 | } 25 | 26 | button:hover { 27 | cursor: pointer; 28 | } 29 | 30 | p { 31 | font-size: 20px; 32 | } 33 | 34 | input { 35 | padding: 10px; 36 | width: 200px; 37 | border-radius: 10px; 38 | border: 2px solid #d4d4d8; 39 | transition: all 0.1s; 40 | } 41 | 42 | input:focus { 43 | border: 2px solid #ef4444; 44 | outline: none; 45 | } 46 | 47 | .header { 48 | margin-bottom: 40px; 49 | margin-top: 50px; 50 | } 51 | 52 | .header input { 53 | width: calc(100% - 24px); 54 | } 55 | 56 | .header button { 57 | display: block; 58 | width: 100%; 59 | margin-top: 10px; 60 | margin-right: 0px !important; 61 | } 62 | 63 | .completed { 64 | text-decoration: line-through; 65 | } 66 | 67 | .completed-text { 68 | color: #71717a; 69 | } 70 | 71 | .actions button { 72 | margin-right: 10px; 73 | } 74 | 75 | .edit { 76 | margin-top: 10px; 77 | } 78 | 79 | @media (prefers-color-scheme: dark) { 80 | body, 81 | #root { 82 | background-color: #0f172a; 83 | color: #e2e8f0; 84 | } 85 | 86 | input { 87 | background-color: #0f172a; 88 | border-color: #475569; 89 | color: #e2e8f0; 90 | } 91 | 92 | .completed-text { 93 | color: #64748b; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /test/todo-demo/todo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Todo App - TNTjs 8 | 9 | 10 | 11 |
12 |
13 |
14 |

Todo App

15 |

A simple todo app built with TNTjs.

16 | 17 | 18 |
19 | 20 |
21 |

22 | 23 | 24 | (completed) 25 | 26 |

27 |
28 | 29 | 30 | 31 | 32 | 33 | 36 | 37 |
38 | 39 |
40 | 46 | 47 |
48 |
49 |
50 |
51 |
52 |
53 | 54 | 57 | 58 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "removeComments": true, 5 | "baseUrl": "./", 6 | "sourceMap": true, 7 | "target": "es2017", 8 | "paths": { 9 | "runtime/*": [ 10 | "src/runtime/*" 11 | ], 12 | "plugins/*": [ 13 | "src/plugins/*" 14 | ], 15 | "lib/*": [ 16 | "src/lib/*" 17 | ] 18 | }, 19 | "declaration": true, 20 | "outDir": "./dist/src" 21 | }, 22 | "include": ["./src/**/*.ts"], 23 | "exclude": ["./tnt.d.ts"], 24 | "lib": ["es2020"] 25 | } 26 | --------------------------------------------------------------------------------