ultra-light-js 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +1 -1
- package/README.md +6 -6
- package/dist/ultra-light.d.ts.map +1 -1
- package/dist/ultra-light.js +26 -24
- package/package.json +1 -1
package/LICENSE.md
CHANGED
|
@@ -631,7 +631,7 @@ to attach them to the start of each source file to most effectively
|
|
|
631
631
|
state the exclusion of warranty; and each file should have at least
|
|
632
632
|
the "copyright" line and a pointer to where the full notice is found.
|
|
633
633
|
|
|
634
|
-
ultra-light
|
|
634
|
+
ultra-light-js - A lightweight JavaScript framework for building reactive, state-management, and SPA applications.
|
|
635
635
|
Copyright (C) 2026 Amín Pérez
|
|
636
636
|
|
|
637
637
|
This program is free software: you can redistribute it and/or modify
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Ultra Light Framework
|
|
2
2
|
|
|
3
3
|
[](https://github.com/EvilPrime98/ultra-light-js/actions/workflows/ci.yml)
|
|
4
|
-
[](https://www.npmjs.com/package/ultra-light-js)
|
|
5
5
|
|
|
6
6
|
An ultra-lightweight and reactive mini framework for modern web development, with zero dependencies.
|
|
7
7
|
|
|
@@ -19,14 +19,14 @@ An ultra-lightweight and reactive mini framework for modern web development, wit
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npm install ultra-light
|
|
22
|
+
npm install ultra-light-js
|
|
23
23
|
# or
|
|
24
|
-
pnpm add ultra-light
|
|
24
|
+
pnpm add ultra-light-js
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
## Quick Start
|
|
28
28
|
```javascript
|
|
29
|
-
import { ultraState, UltraComponent } from 'ultra-light
|
|
29
|
+
import { ultraState, UltraComponent } from 'ultra-light-js';
|
|
30
30
|
|
|
31
31
|
function Counter(){
|
|
32
32
|
|
|
@@ -227,7 +227,7 @@ subscribeToCache(() => console.log('cache changed:', cache()));
|
|
|
227
227
|
|
|
228
228
|
Creates a router for SPA navigation.
|
|
229
229
|
```javascript
|
|
230
|
-
import { UltraRouter, UltraLink } from 'ultra-light
|
|
230
|
+
import { UltraRouter, UltraLink } from 'ultra-light-js';
|
|
231
231
|
|
|
232
232
|
const Home = () => '<div><h1>Home</h1></div>';
|
|
233
233
|
const About = () => '<div><h1>About</h1></div>';
|
|
@@ -354,7 +354,7 @@ ultraPortal('#app', '<div class="modal">Hello from a portal</div>');
|
|
|
354
354
|
|
|
355
355
|
### Complete Todo App
|
|
356
356
|
```javascript
|
|
357
|
-
import { ultraState, UltraComponent, ultraStyles } from 'ultra-light
|
|
357
|
+
import { ultraState, UltraComponent, ultraStyles } from 'ultra-light-js';
|
|
358
358
|
|
|
359
359
|
const styles = ultraStyles(`
|
|
360
360
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ultra-light.d.ts","sourceRoot":"","sources":["../src/ultra-light.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAEvB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAElB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,aAAa,EAChB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACR,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,sBAAsB,EACzB,CAAA;AAkBD,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,EACvC,QAAQ,CAAC,EAAE,QAAQ,GACpB,WAAW,GAAG,IAAI,GAAG,IAAI,CAmB3B;AAmCD,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAgBpE;AAWD,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,UAAQ,GAAG;IAC5D,MAAM,CAAC;IACP,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI;IACrB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI;CACzC,CAoCA;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC1B,YAAY,EAAE,CAAC,EACf,WAAW,CAAC,EAAE,MAAM,GACrB,kBAAkB,CAAC,CAAC,CAAC,CAoEvB;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOzD;
|
|
1
|
+
{"version":3,"file":"ultra-light.d.ts","sourceRoot":"","sources":["../src/ultra-light.ts"],"names":[],"mappings":"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"}
|
package/dist/ultra-light.js
CHANGED
|
@@ -205,13 +205,6 @@ function matchRoute(routePath, currentPath) {
|
|
|
205
205
|
}
|
|
206
206
|
return { params, matched: true };
|
|
207
207
|
}
|
|
208
|
-
function reconcileRouteScope(hasTargetComponent, wildcardComponent, targetDispose, wildcardDispose) {
|
|
209
|
-
if (!hasTargetComponent && wildcardComponent) {
|
|
210
|
-
return wildcardDispose;
|
|
211
|
-
}
|
|
212
|
-
wildcardDispose?.();
|
|
213
|
-
return targetDispose;
|
|
214
|
-
}
|
|
215
208
|
export function UltraRouter(...routes) {
|
|
216
209
|
const paths = routes.map(r => r.path);
|
|
217
210
|
const duplicates = paths.filter((p, i) => paths.indexOf(p) !== i && p !== '/*');
|
|
@@ -232,27 +225,24 @@ export function UltraRouter(...routes) {
|
|
|
232
225
|
}
|
|
233
226
|
const currentPath = window.location.pathname;
|
|
234
227
|
let targetComponent = null;
|
|
235
|
-
let
|
|
236
|
-
|
|
237
|
-
let targetDispose = null;
|
|
238
|
-
let wildcardDispose = null;
|
|
239
|
-
routes.forEach(route => {
|
|
228
|
+
let scopeDispose = null;
|
|
229
|
+
for (const route of routes) {
|
|
240
230
|
const match = matchRoute(route.path, currentPath);
|
|
241
|
-
if (match.matched && !match.isWildcard
|
|
242
|
-
routeParams = match.params;
|
|
231
|
+
if (match.matched && !match.isWildcard) {
|
|
232
|
+
const routeParams = match.params;
|
|
243
233
|
const [component, dispose] = ultraScope(() => route.component(routeParams));
|
|
244
234
|
targetComponent = parseHTMLString(component);
|
|
245
|
-
|
|
235
|
+
scopeDispose = dispose;
|
|
236
|
+
break;
|
|
246
237
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
238
|
+
}
|
|
239
|
+
if (!targetComponent) {
|
|
240
|
+
const wildcardRoute = routes.find(route => matchRoute(route.path, currentPath).isWildcard);
|
|
241
|
+
if (wildcardRoute) {
|
|
242
|
+
const [component, dispose] = ultraScope(() => wildcardRoute.component());
|
|
243
|
+
targetComponent = parseHTMLString(component);
|
|
244
|
+
scopeDispose = dispose;
|
|
251
245
|
}
|
|
252
|
-
});
|
|
253
|
-
const scopeDispose = reconcileRouteScope(!!targetComponent, wildcardComponent, targetDispose, wildcardDispose);
|
|
254
|
-
if (!targetComponent && wildcardComponent) {
|
|
255
|
-
targetComponent = wildcardComponent;
|
|
256
246
|
}
|
|
257
247
|
container.innerHTML = '';
|
|
258
248
|
if (targetComponent) {
|
|
@@ -378,6 +368,10 @@ export function UltraComponent({ component, eventHandler = {}, attributes = {},
|
|
|
378
368
|
return document.createElement('div');
|
|
379
369
|
}
|
|
380
370
|
const cleanupFunctions = [];
|
|
371
|
+
let disposed = false;
|
|
372
|
+
registerInScope(() => {
|
|
373
|
+
disposed = true;
|
|
374
|
+
});
|
|
381
375
|
Object.keys(eventHandler).forEach((event) => {
|
|
382
376
|
const handler = eventHandler[event];
|
|
383
377
|
if (handler) {
|
|
@@ -424,11 +418,19 @@ export function UltraComponent({ component, eventHandler = {}, attributes = {},
|
|
|
424
418
|
onMount.forEach(fn => {
|
|
425
419
|
requestAnimationFrame(() => {
|
|
426
420
|
void (async () => {
|
|
421
|
+
if (disposed)
|
|
422
|
+
return;
|
|
427
423
|
try {
|
|
428
424
|
const result = fn(node);
|
|
429
425
|
const cleanup = result instanceof Promise ? await result : result;
|
|
430
|
-
if (cleanup)
|
|
426
|
+
if (!cleanup)
|
|
427
|
+
return;
|
|
428
|
+
if (disposed) {
|
|
429
|
+
cleanup();
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
431
432
|
cleanupFunctions.push(cleanup);
|
|
433
|
+
}
|
|
432
434
|
}
|
|
433
435
|
catch (error) {
|
|
434
436
|
console.error('Error while executing onMount function(s):', error);
|
package/package.json
CHANGED