From 95e760d1d33c4572a9f528a89071f385540ef2ee Mon Sep 17 00:00:00 2001 From: Joseph HENRY Date: Mon, 17 Nov 2025 17:58:05 +0100 Subject: [PATCH] readme, license and scripts --- LICENSE.md | 9 + README.md | 123 ++++++++++- bblloader.ts | 42 ---- bblplugin.ts | 24 --- img/tb_ts_compilation_diagram.png | Bin 0 -> 87819 bytes img/toonboom.png | Bin 0 -> 1903 bytes package-lock.json | 328 +----------------------------- package.json | 9 +- src/lib/console.ts | 2 + src/scripts/arrow-function.ts | 2 + src/scripts/generator.ts | 2 +- src/scripts/uniq.ts | 33 --- webpack.config.ts | 20 +- 13 files changed, 156 insertions(+), 438 deletions(-) create mode 100644 LICENSE.md delete mode 100644 bblloader.ts delete mode 100644 bblplugin.ts create mode 100644 img/tb_ts_compilation_diagram.png create mode 100644 img/toonboom.png create mode 100644 src/lib/console.ts create mode 100644 src/scripts/arrow-function.ts delete mode 100644 src/scripts/uniq.ts diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..55811d5 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2025 Autour du Volcan + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 44d30cc..8b3b184 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,22 @@ # tb-harmony-modern-ts -This repository is a project template that allows you to code in modern TypeScript for ToonBoom Harmony. +![](./img/toonboom.png) ![](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white) ![](https://img.shields.io/badge/Webpack-8DD6F9?style=for-the-badge&logo=Webpack&logoColor=white) ![](https://img.shields.io/badge/Babel-F9DC3E?style=for-the-badge&logo=babel&logoColor=white) + +This repository is a project template that allows you to code in modern TypeScript (ES6) for ToonBoom Harmony. ## Example script +This script prints all the nodes recursively (following node groups) in the scene using JavaScript generators: + ```ts +// src/lib/console.ts +const console = { log: MessageLog.trace }; +``` + +```ts +// src/scripts/generator.ts +import console from "../lib/console"; + function* recursiveIterNodes(n: string): Generator { yield n; if (node.isGroup(n)) { @@ -31,16 +43,86 @@ You can script in two ways for ToonBoom Harmony: either with [Python](https://do [QtScript](https://doc.qt.io/archives/qt-5.15/qtscript-index.html) (scripting engine part of the Qt framework) is an old JavaScript dialect that is based on the [ECMAScript 3.0 standard](https://www-archive.mozilla.org/js/language/e262-3.pdf), therefore it lacks features like modules, modern syntax, arrow functions, etc... -Today we have [TypeScript](https://www.typescriptlang.org/) which is a superset of JavaScript with syntax for types, ES modules, async/await and more but how can we use those? +Today we have [TypeScript](https://www.typescriptlang.org/) which is a superset of JavaScript with syntax for types, ES modules, async/await. All those features provide better code organization, type checking and robustness. + +## Usage + +This template was built in a script-centric workflow. All the `.ts` scripts in the `src/scripts` directory are entrypoints and built into the `dist` directory as `.js` bundles. + +1. Clone and install the dependencies: + +```shell +❯ git clone https://git.autourdeminuit.com/autour_de_minuit/tb-harmony-modern-ts +❯ cd tb-harmony-modern-ts +❯ npm install +``` + +2. Then create a new script in `src/scripts`: + +```shell +❯ touch src/scripts/arrow-function.ts +``` + +```ts +// src/scripts/arrow-function.ts +const hello = (name: string) => MessageLog.trace(`Hello, ${name}!`); +hello("Alice"); +``` + +3. And build it: + +```shell +❯ npm run build # runs webpack +``` + +Then it's built as an [IIFE](https://developer.mozilla.org/en-US/docs/Glossary/IIFE) and transpiled into QtScript compatible syntax: + +```js +// dist/arrow-function.js +/******/ (function () { + // webpackBootstrap + var hello = function hello(name) { + return MessageLog.trace("Hello, ".concat(name, "!")); + }; + hello("Alice"); + /******/ +})(); +``` + +Then you can run it by starting Harmony with the `TOONBOOM_GLOBAL_SCRIPT_LOCATION` env variable pointing at the `dist` folder where you cloned this repo. + +For example you can also run this script from the command line in [batch mode](https://docs.toonboom.com/help/harmony-24/scripting/script/index.html#batch_mode) (in PowerShell): + +```powershell +❯ $env:TOONBOOM_GLOBAL_SCRIPT_LOCATION="tb-harmony-modern-ts/dist" +❯ &"path\to\HarmonyPremium.exe" -scene "scene.xstage" -batch -compile "dist/arrow-function.js" +# ... +# Loading script: tb-harmony-modern-ts\dist\arrow-function.js +# Hello, Alice! +``` ## How +Based on the above example, here is a diagram that shows the compilation/transpilation process (simplified): + +![](./img/tb_ts_compilation_diagram.png) + ### TypeScript and type definitions We can code in TypeScript but in order to use Harmony's QtScript API, we need type definitions (`.d.ts` files describing the types). Luckily for us, Bryan Fordney made scripts to generate them: [tba-types](https://github.com/bryab/tba-types) (Typescript definitions for Toon Boom Harmony and Storyboard Pro) +We can now type-check our code with the right classes and members accessible in the global QtScript scope. Those type definitions still have a few quirks but they can be improved through PRs! + +### ES6 syntax and polyfill + +The JavaScript language specification is moving fast. What if you want to use the newest features but your runtime isn't as recent? Here comes [Babel](https://babeljs.io/), it's a JavaScript compiler that allows us to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments. + +This is perfect because QtScript is like ES3 and we want to use ES6 features. + +A key feature of Babel is that it integrates with [core-js](https://github.com/zloirock/core-js), providing polyfills for modern JavaScript features. For example QtScript don't have `async`/`await` but core-js can inject the [Regenerator runtime](https://www.npmjs.com/package/regenerator-runtime) to make it work. + ### Modules and imports In Harmony's QtScript you can import code from another file in two ways: @@ -70,4 +152,39 @@ module.test(); Which is a [CommonJS](https://nodejs.org/api/modules.html#modules-commonjs-modules) "like" custom implementation from ToonBoom without the same semantics. It's also used to define [ToonBoom packages](https://docs.toonboom.com/help/harmony-24/scripting/extended/index.html#create_package) by exporting a `configure` function from a `configure.js` file. --> In today's modern JavaScript, the official standard package format is [ECMAScript modules](https://nodejs.org/api/esm.html#modules-ecmascript-modules) (or ESM/ES6 modules) with `import`/`export`. +In today's modern JavaScript, the official standard package format is [ECMAScript modules](https://nodejs.org/api/esm.html#modules-ecmascript-modules) (or ESM/ES6 modules) with `import`/`export`. + +### Module bundling + +We use WebPack as the [module bundler](https://webpack.js.org/concepts/). This is a common technique to organize and combine many files into a single JavaScript file. It resolves imports and optimize the bundles. + +Since ToonBoom Harmony's QtScript module system is not that advanced, it allows us to use ES modules (and CommonJS too) to split code into separate files without having to manually import files. + +This also means that we can use and import NPM packages with Harmony! (if they use a compatible standard library thought). + +#### QtScript syntax fixes (custom Webpack plugin) + +In QtScript, this syntax is not valid: + +```js +var obj = { for: 0 }; // Unexpected keyword "for" for literal property name +obj.for = 1; // Same here as property name +``` + +```js +var re = /[^\s(/]/; // Syntax error, / is not escaped +// The correct syntax is /[^\s(\/]/ +``` + +Most of the time, those expressions are injected from corejs polyfills. In order to patch this, I created a custom [`FindReplacePlugin`](./webpack.config.ts) for Webpack that does simple regex find/replace to fix those syntax errors. + +## Acknowledgements + +- [OpenHarmony](https://cfourney.github.io/OpenHarmony/) - The Toonboom Harmony Open Source DOM Library created by Mathieu Chaptel and Chris Fourney. + This library is like PyMEL but for ToonBoom Harmony and a huge source of knowledge about the details of scripting in Harmony. 🙏 +- [tba-types](https://github.com/bryab/tba-types) - Typescript definitions for Toon Boom Harmony and Storyboard Pro created by Bryan Fordney. + These are generated types scrapped from the ToonBoom documentation itself. + +## License + +[MIT](./LICENSE.md) diff --git a/bblloader.ts b/bblloader.ts deleted file mode 100644 index dcc5d99..0000000 --- a/bblloader.ts +++ /dev/null @@ -1,42 +0,0 @@ -import babelLoader from "babel-loader"; -import { ConfigItem } from "@babel/core"; - -export default babelLoader.custom(() => { - // Extract the custom options in the custom plugin - function myPlugin() { - return { - visitor: {}, - }; - } - - return { - // Passed the loader options. - // customOptions({ opt1, opt2, ...loader }) { - // return { - // // Pull out any custom options that the loader might have. - // custom: { opt1, opt2 }, - // - // // Pass the options back with the two custom options removed. - // loader, - // }; - // }, - - // Passed Babel's 'PartialConfig' object. - config(cfg: ConfigItem) { - return { - ...cfg.options, - plugins: [ - ...((cfg.options && cfg.options["plugins"]) || []), - [myPlugin], - ], - }; - }, - - // result(result) { - // return { - // ...result, - // code: result.code + "\n// Generated by some custom loader", - // }; - // }, - }; -}); diff --git a/bblplugin.ts b/bblplugin.ts deleted file mode 100644 index 3734ae1..0000000 --- a/bblplugin.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Example from: https://github.com/babel/babel/blob/main/packages/babel-plugin-transform-reserved-words/src/index.ts -import { declare } from "@babel/helper-plugin-utils"; -import { types as t, type NodePath } from "@babel/core"; -import { isIdentifierName } from "@babel/helper-validator-identifier"; - -const QT_SCRIPT_RESERVED_WORDS = new Set(["for"]); - -function isQtScriptReservedWord(name: string): boolean { - return isIdentifierName(name) && QT_SCRIPT_RESERVED_WORDS.has(name); -} - -export default declare((_api) => { - return { - name: "test", - visitor: { - Identifier(path: NodePath) { - if (isQtScriptReservedWord(path.node.name)) { - console.log(path.node.name); - path.scope.rename(path.node.name); - } - }, - }, - }; -}); diff --git a/img/tb_ts_compilation_diagram.png b/img/tb_ts_compilation_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..2f839e26bc51d1055a587b13cead5ac5b364573a GIT binary patch literal 87819 zcmeEP2|Sc*+t;d+R4NsvjmS2eEh0NHc4Y}!$1sd$hB0HS6s1CvLTDvQl3kX{R#~$q zTOv!=?0et+jG2zkIqx~W@AtiDdB6Ak`kk5Qp69uj>-t~oecg`>+L|h?YqqapVq#)d zQ&rSuVq*4WVp>wYYAI-WlyR+*iOE`&q-02PbhE|cY?yeE3Jc$O5HLGDk;H>kK$UAuKe42_blpN<1(*&^7cAsX$*0xNx#? zq(7?-)*}Q)hn9x5UU*a+iMMmJ(mtk(MA@minrjk`)rmjvjnSv0n+n0g*$$1jw!wie ztlj8SLLtN!I<=-Ow1|t+Cy602#-R@jHRxffjK$CJ(!`4V(r^8-<1mi2-my_;R(txzK68 z&_E;9l!_}YGDxaPjG<4#2K<@w-^kP^c7psL5TU* zJw%5eVHCKB&gb7=0;IWq28Ung0bLvyk=(`_0G`ePJb`3~$KahTa7sV5%KyX^pg!b( zx<><#2OObs%HD=VqR^$+!i9wYo>2f(1d1WJ6?&d_VFXj7Q4u0FbhSWe zXo8>tT>J`3=}knu3xS3baM!Oc97(^CWI@0H9Zu`+S8rTE>2Fi}R{=w?!C8>7uHR4f zFT{EA1!{gLePTF33VCa+D-S{p1AWzXaRNGip&4Lr(JzeFMNL>IM&r+Kh2Z@&h-p|@ z0@LuF{953!7|5hq0Z2ghN*-7_5*FxQIrRRk^c#r;wj&U+0-L6(2{f5p*<6Vlua&9s1H`cu#kzmF-#U^HZX1MY86 z^Z(u^F$D3CwMj^2Nks*u(w}6IP(NUhkYaxigM|81!kh*0|DRZbAB|T2L+t?Sm%)mf zlNHVdN(Iq0%+CzO-!8aV0O)V4HHIqu&Vc_ET)@O7=qRVFUpi)f*u?+H=s(SYq5B!S z{qGoR&?)qtR{uo^3=+FG1PctQ!!Hy6SEp9+N*garz#|9u%U#Lw-6&fvR>C4lU8FF@PP#ywDe^e1lZ_BV{Xm;xVBS!;57aLG4)Bepx#ek@%737Z z7Y*{gp8rwJZ;Pj8>}(e{HGUdh0c5bTAgO?WY1)u~YW`07GiD0)Ap|m_AT2lgYKq0I`cBW(-xTk@UeOKanaSkl6Vvn8HH!aG6| z1mQ*A!pZ?d^FbIXR%;tu3l|z*exAN3LEA&}7DVTTjagf)8?>`0Pa9B<(F&!|=u=R% zBaxtOU4Ut2@Q;R1d!jHF+91a|Vi--rL{|)W=#TJiM8$uG2slbuf*zYJ0tEvn4D~`w zhKLC>vIu`22ZtUod4lO?U zPBQ+w3e(0KOM-SZ6^KM#7aXlVM)<%YMQUw9vH(zC(5nb#NMR!6-9X_4LP1+q6Jbn| zceFU>M%30j;$n#q#i?QC@y5q+P8O;!AfRhO)Vm2kC2S|c@_tf(4}k`!Z#1O=@q zN7g_>W2=F=XsaH<86kBr#*R3mB^W`Cigwea+Sx-RTc{j$Hb&UNe(L=Q3i^�JB2i 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 literal 0 HcmV?d00001 diff --git a/img/toonboom.png b/img/toonboom.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0bb00de82085f9067df5d069ab80e16e061d9c GIT binary patch literal 1903 zcmV-#2ax!QP)EX>4Tx04R}tkv&MmKp2MKwn{~-4t5Z62vVIaf{HlSDionYs1;guFuC*(nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~E;uQ=NQvJig%&a1aoodu-}`d+9pJB*nQC^#09CV$ zR3a{9va3Sy6+P&qIf4m^nfjb4CgC~0?&0J6U6f~e*Znzqm7K`{pFkXAx?vG-5YKE{ zI_G`jFe^$5@j3ChK^G)`um6cZ^rk9+us9KT2|nOr3> zax9<%6_Voz|AXJXHS<%GZc-=?biUa3$0!io1sXNm{yw(t#t9I32ClT0zfuQgKS{5( zw8#mKj!YVX^>HO>D00L$`n$^tPDxc~qF24YJ`L;(K){{a7>y{D4^000SaNLh0L z01ejw01ejxLMWSf00007bV*G`2k8qD2^1j@{2he=00nDFL_t(&-tC&*Pg`{u$3Len z6bfyDLV4?CV_RVp*v6JIL!53i&Zxmemw4liS-jO-6R%8+{t?D3W;4dNVR?n%Ydn=$OC#59xP09RcTgyOL!^ERKG$w)x)^hVnGx#IS$gGf3Fz?p$= zj&EzFT3?1JNsRkl{5&zFczL6VA5O**B?+}EdvNeXg8XC~$c(-5D4z{qM#zMG1sgK# z+am$a4PRL{l*_Wrm}i<#2QCp8)63*}MfeRL_6Phx_?jzRQejbq2bu?NpW+h$P~iA0J@Q z?_6}xYMe&Bi8uBh=9=R!-`j2i@K)Pl#(YkGpB@9CP^ISG&Mp8XNg|Sr(>HyGOEY)Z z^sHPsFK=t3-LjptgS`v|T$E}Gd8gwAW`cfB4R)_j&QHq{*S!v|dmT&Wbm{_*KG96G zc?-Hi?LDW+GR}~np2-o0=iCou+$RH^gPr0@JY|O-3`XKG}gS=*1BYK6HD+@p+m} zbqobuv{hP&C6kXvwQthuIJx&3+ATXW!UL!TfqJ8f6D?11)Y6pq&{b7bf>~e2uMuhO#Wb0t}3c+SmyDoJgLF)#KwLw@Rv_j)HgO|{qq z?)4F0Bd9o3y_K%UJsjK8M1{6^(cFn$9hB?zSr--rfzGYFa&qK@phjmPEsFRO|JEj< zcnni<>6$p1hLp?Bo|=Z$9VZC1nd&Ig6yk`?<;5OJmhi_S>?*59uPw$K3$IVkZz?nM zymen@++M$fuZDWDh5hWUvQVurTXk_k5a?`Zrr+zxTLD<0(jZFW;#4I`6sR?8;$+14 zP4n!w7R*H@S)ci4`;m+|eN%UEE~tMVwmoA$C(mtfWopj5e$~Dp2#dzW1%}WbsWETjyJI0VYBeUUE^|$<)#00u ztckM_e>!bgtLm3*fd9TE_DF!qIS-BH=DgVx7t?&$b8gu}cU{GoWf@VHR;+}VgDB_k z)IS@K;)w(~*039WftDi{D}@>jL%x|caTdaxh!TiJs4OwAnDc9O2I>ta0`X{G?Rg~H zyRLA6a4LZ(8l+rTn)3@Y8OrY$y>CbUqRYCUw+|jCnuznmNMEMqycW(v^t&e5QeKrc z=S#9gJe9;AnB~IMNZ#$q2ZU^YVFb#=}0v%NuRyuZDRs#pzo;9H@GN zwweYiOO2=nfoL*;JupkRV-(MVLP)_T691p$&Xrj^S7z;~1r=&RASH>)7rn= 0.4" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001753", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", @@ -2377,18 +2278,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -2487,15 +2376,6 @@ } } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -2506,20 +2386,6 @@ "node": ">=0.3.1" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.245", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.245.tgz", @@ -2554,24 +2420,6 @@ "node": ">=4" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", @@ -2579,33 +2427,6 @@ "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2744,46 +2565,11 @@ "flat": "cli.js" } }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2799,43 +2585,6 @@ "node": ">=6.9.0" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -2843,18 +2592,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2872,37 +2609,11 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3113,15 +2824,6 @@ "dev": true, "license": "ISC" }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -3133,6 +2835,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -3142,6 +2845,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -3326,12 +3030,6 @@ "node": ">=8" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -3413,16 +3111,6 @@ "regjsparser": "bin/parser" } }, - "node_modules/replace-text-in-bundle-plugin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/replace-text-in-bundle-plugin/-/replace-text-in-bundle-plugin-1.0.3.tgz", - "integrity": "sha512-DZJgonL3NaB6Sz1ti3bJQrKNRvt/YMWHxMPeQo0eA5742Tct98tpzjIqsOsjYJJAlXJ8diy8Q0uzzasOSKAlmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "webpack": "^5.85.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", diff --git a/package.json b/package.json index a347828..64984c7 100644 --- a/package.json +++ b/package.json @@ -13,25 +13,18 @@ "license": "MIT", "devDependencies": { "@babel/core": "^7.28.5", - "@babel/helper-validator-identifier": "^7.28.5", "@babel/preset-env": "^7.28.5", "@babel/preset-typescript": "^7.28.5", - "@types/babel__helper-plugin-utils": "^7.10.3", - "@types/babel__helper-validator-identifier": "^7.15.2", - "@types/node": "^24.10.0", + "@types/node": "^24.10.1", "@types/webpack": "^5.28.5", "babel-loader": "^10.0.0", "core-js": "^3.46.0", "cross-env": "^10.1.0", - "replace-text-in-bundle-plugin": "^1.0.3", "tba-types": "github:bryab/tba-types", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "typescript": "^5.9.3", "webpack": "^5.102.1", "webpack-cli": "^6.0.1" - }, - "dependencies": { - "axios": "^1.13.2" } } diff --git a/src/lib/console.ts b/src/lib/console.ts new file mode 100644 index 0000000..41ebfa7 --- /dev/null +++ b/src/lib/console.ts @@ -0,0 +1,2 @@ +const console = { log: MessageLog.trace }; +export default console; diff --git a/src/scripts/arrow-function.ts b/src/scripts/arrow-function.ts new file mode 100644 index 0000000..17ca77d --- /dev/null +++ b/src/scripts/arrow-function.ts @@ -0,0 +1,2 @@ +const hello = (name: string) => MessageLog.trace(`Hello, ${name}!`); +hello("Alice"); diff --git a/src/scripts/generator.ts b/src/scripts/generator.ts index 7c6b8ad..4347b40 100644 --- a/src/scripts/generator.ts +++ b/src/scripts/generator.ts @@ -1,4 +1,4 @@ -const console = { log: MessageLog.trace }; +import console from "../lib/console"; function* recursiveIterNodes(n: string): Generator { yield n; diff --git a/src/scripts/uniq.ts b/src/scripts/uniq.ts deleted file mode 100644 index 7e6919c..0000000 --- a/src/scripts/uniq.ts +++ /dev/null @@ -1,33 +0,0 @@ -class Node { - name: string; - - constructor(name: string) { - this.name = name; - } - - static root() { - return new Node(node.root()); - } - - get isGroup() { - return node.isGroup(this.name); - } - - *subNodesRecursive(): Generator { - for (let i = 0; i < node.numberOfSubNodes(this.name); i++) { - const subNode = new Node(node.subNode(this.name, i)); - yield subNode; - yield* subNode.subNodesRecursive(); - } - } -} - -function main() { - const root = Node.root(); - - for (const node of root.subNodesRecursive()) { - MessageLog.trace(node.name); - } -} - -main(); diff --git a/webpack.config.ts b/webpack.config.ts index 831c787..14117c4 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -38,12 +38,11 @@ class FindReplacePlugin { // For every regex pattern, replace it in the source content for (const { from, to } of this.options.replace) { const matches = replaced.match(from); - logger.info( - from, - to, - `Found ${matches ? matches.length : 0} matches`, - matches, - ); + + if (matches) { + matches[0]; + logger.info(`${from} | Found ${matches.length} matches`); + } replaced = replaced.replace(from, to); } @@ -68,12 +67,15 @@ class FindReplacePlugin { const babelRule: RuleSetRule = { test: /\.(ts|js)$/, + // Excluding node_modules is really important to avoid Babel injecting corejs in corejs files themselves + exclude: /node_modules/, use: { loader: "babel-loader", options: { targets: "defaults", sourceType: "unambiguous", presets: [ + // Parse TypeScript ["@babel/preset-typescript"], [ "@babel/preset-env", @@ -81,6 +83,7 @@ const babelRule: RuleSetRule = { // Use this to cover the lowest possible syntax requirement for QtScript // See: https://browsersl.ist/ targets: "cover 100%", + // Adds at the top of each file imports of polyfills only for features used in the current and not supported by target environments useBuiltIns: "usage", corejs: "3.46.0", }, @@ -133,7 +136,10 @@ const config: Configuration = { * For example { for: 0 } -> { "for": 0 } */ { from: /(for|return):/g, to: '"$1":' }, - { from: /\/(.*)\[([^\]]*)\/([^\]]*)\](.*)\//g, to: "/$1[$2\/$3]$4/" }, + /** + * Some Regexp uses "/" character in character sets but must be escaped in QtScript syntax (don't know why) + */ + { from: /\[\^\\s\(\/\]/g, to: "[^\\s(\\/]" }, ], }), ],