snice 3.6.0 → 3.8.0
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/README.md +2 -2
- package/bin/snice.js +4 -5
- package/bin/templates/CLAUDE.md +25 -3
- package/bin/templates/pwa/README.md +188 -0
- package/bin/templates/pwa/global.d.ts +10 -0
- package/bin/templates/pwa/index.html +16 -0
- package/bin/templates/pwa/package.json +32 -0
- package/bin/templates/pwa/public/icons/.gitkeep +6 -0
- package/bin/templates/pwa/src/daemons/notifications.ts +148 -0
- package/bin/templates/pwa/src/fetcher.ts +15 -0
- package/bin/templates/pwa/src/guards/auth.ts +12 -0
- package/bin/templates/pwa/src/main.ts +42 -0
- package/bin/templates/pwa/src/middleware/auth.ts +16 -0
- package/bin/templates/pwa/src/middleware/error.ts +36 -0
- package/bin/templates/pwa/src/middleware/retry.ts +31 -0
- package/bin/templates/pwa/src/pages/dashboard.ts +143 -0
- package/bin/templates/pwa/src/pages/login.ts +161 -0
- package/bin/templates/pwa/src/pages/notifications.ts +156 -0
- package/bin/templates/pwa/src/pages/profile.ts +164 -0
- package/bin/templates/pwa/src/router.ts +20 -0
- package/bin/templates/pwa/src/services/auth.ts +48 -0
- package/bin/templates/pwa/src/services/jwt.ts +35 -0
- package/bin/templates/pwa/src/services/storage.ts +24 -0
- package/bin/templates/pwa/src/styles/global.css +55 -0
- package/bin/templates/pwa/src/types/auth.ts +21 -0
- package/bin/templates/pwa/src/types/notifications.ts +9 -0
- package/bin/templates/pwa/tests/helpers/test-utils.ts +84 -0
- package/bin/templates/pwa/tests/middleware/auth.test.ts +67 -0
- package/bin/templates/pwa/tests/middleware/error.test.ts +105 -0
- package/bin/templates/pwa/tests/middleware/retry.test.ts +103 -0
- package/bin/templates/pwa/tests/services/auth.test.ts +89 -0
- package/bin/templates/pwa/tests/services/jwt.test.ts +76 -0
- package/bin/templates/pwa/tests/services/storage.test.ts +69 -0
- package/bin/templates/{social → pwa}/tsconfig.json +11 -10
- package/bin/templates/pwa/vite.config.ts +94 -0
- package/bin/templates/{social/vite.config.ts → pwa/vitest.config.ts} +12 -17
- package/dist/components/music-player/snice-music-player.d.ts +72 -0
- package/dist/components/music-player/snice-music-player.js +730 -0
- package/dist/components/music-player/snice-music-player.js.map +1 -0
- package/dist/components/music-player/snice-music-player.types.d.ts +43 -0
- package/dist/components/timer/snice-timer.d.ts +27 -0
- package/dist/components/timer/snice-timer.js +197 -0
- package/dist/components/timer/snice-timer.js.map +1 -0
- package/dist/components/timer/snice-timer.types.d.ts +10 -0
- package/dist/fetcher.d.ts +65 -0
- package/dist/index.cjs +92 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +92 -4
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +92 -3
- package/dist/index.iife.js.map +1 -1
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/dist/types/context.d.ts +7 -1
- package/dist/types/router-options.d.ts +6 -0
- package/docs/ai/api.md +33 -1
- package/docs/ai/components/music-player.md +134 -0
- package/docs/ai/components/timer.md +43 -0
- package/docs/ai/patterns.md +48 -1
- package/docs/components/music-player.md +314 -0
- package/docs/components/timer.md +143 -0
- package/docs/fetcher.md +447 -0
- package/docs/routing.md +11 -8
- package/package.json +2 -1
- package/bin/templates/social/README.md +0 -42
- package/bin/templates/social/global.d.ts +0 -14
- package/bin/templates/social/index.html +0 -13
- package/bin/templates/social/package.json +0 -21
- package/bin/templates/social/src/main.ts +0 -33
- package/bin/templates/social/src/pages/feed-page.ts +0 -111
- package/bin/templates/social/src/pages/messages-page.ts +0 -102
- package/bin/templates/social/src/pages/not-found-page.ts +0 -46
- package/bin/templates/social/src/pages/profile-page.ts +0 -99
- package/bin/templates/social/src/pages/settings-page.ts +0 -119
- package/bin/templates/social/src/router.ts +0 -9
- package/bin/templates/social/src/styles/global.css +0 -156
- /package/bin/templates/{social → pwa}/public/vite.svg +0 -0
package/dist/index.iife.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* snice v3.
|
|
2
|
+
* snice v3.7.0
|
|
3
3
|
* Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
|
|
4
4
|
* (c) 2024
|
|
5
5
|
* Released under the MIT License.
|
|
@@ -2367,7 +2367,7 @@ var Snice = (function (exports) {
|
|
|
2367
2367
|
* Represents the bundled router state that can notify registered elements of changes
|
|
2368
2368
|
*/
|
|
2369
2369
|
class Context {
|
|
2370
|
-
constructor(context = {}, placards = [], currentRoute = '', routeParams = {}) {
|
|
2370
|
+
constructor(context = {}, placards = [], currentRoute = '', routeParams = {}, fetcher) {
|
|
2371
2371
|
this[_a] = new WeakMap();
|
|
2372
2372
|
this[_b] = new Set();
|
|
2373
2373
|
this[_c] = false;
|
|
@@ -2378,6 +2378,16 @@ var Snice = (function (exports) {
|
|
|
2378
2378
|
route: currentRoute,
|
|
2379
2379
|
params: routeParams
|
|
2380
2380
|
};
|
|
2381
|
+
// Initialize fetch with middleware support or fallback to native fetch
|
|
2382
|
+
if (fetcher && typeof fetcher.create === 'function') {
|
|
2383
|
+
this.fetch = fetcher.create(this);
|
|
2384
|
+
}
|
|
2385
|
+
else if (typeof fetch === 'function') {
|
|
2386
|
+
this.fetch = fetch.bind(this);
|
|
2387
|
+
}
|
|
2388
|
+
else {
|
|
2389
|
+
throw new Error('No fetch implementation available');
|
|
2390
|
+
}
|
|
2381
2391
|
}
|
|
2382
2392
|
/**
|
|
2383
2393
|
* Register an element to receive context updates
|
|
@@ -4472,7 +4482,7 @@ var Snice = (function (exports) {
|
|
|
4472
4482
|
let currentLayoutTimestamp = null; // Track current layout timestamp
|
|
4473
4483
|
const context = options.context || {}; // Store context for guards
|
|
4474
4484
|
// Create Context instance for managing router state
|
|
4475
|
-
const navigationContext = new Context(context, [], '', {});
|
|
4485
|
+
const navigationContext = new Context(context, [], '', {}, options.fetcher);
|
|
4476
4486
|
function getCurrentLayoutElement(target) {
|
|
4477
4487
|
const noCurrentLayout = !currentLayoutName || !currentLayoutTimestamp;
|
|
4478
4488
|
if (noCurrentLayout) {
|
|
@@ -5401,7 +5411,86 @@ var Snice = (function (exports) {
|
|
|
5401
5411
|
}
|
|
5402
5412
|
}
|
|
5403
5413
|
|
|
5414
|
+
/**
|
|
5415
|
+
* Context-aware fetch implementation with middleware support
|
|
5416
|
+
*
|
|
5417
|
+
* @example
|
|
5418
|
+
* ```typescript
|
|
5419
|
+
* const fetcher = new ContextAwareFetcher();
|
|
5420
|
+
*
|
|
5421
|
+
* fetcher.use('request', function(request, next) {
|
|
5422
|
+
* const token = this.application.user?.token;
|
|
5423
|
+
* if (token) {
|
|
5424
|
+
* request.headers.set('Authorization', `Bearer ${token}`);
|
|
5425
|
+
* }
|
|
5426
|
+
* return next();
|
|
5427
|
+
* });
|
|
5428
|
+
*
|
|
5429
|
+
* fetcher.use('response', async function(response, next) {
|
|
5430
|
+
* if (!response.ok) {
|
|
5431
|
+
* throw new Error(`HTTP ${response.status}`);
|
|
5432
|
+
* }
|
|
5433
|
+
* return next();
|
|
5434
|
+
* });
|
|
5435
|
+
*
|
|
5436
|
+
* const router = Router({
|
|
5437
|
+
* target: '#app',
|
|
5438
|
+
* context: { user: null },
|
|
5439
|
+
* fetcher
|
|
5440
|
+
* });
|
|
5441
|
+
* ```
|
|
5442
|
+
*/
|
|
5443
|
+
class ContextAwareFetcher {
|
|
5444
|
+
constructor() {
|
|
5445
|
+
this.requestMiddlewares = [];
|
|
5446
|
+
this.responseMiddlewares = [];
|
|
5447
|
+
}
|
|
5448
|
+
use(type, middleware) {
|
|
5449
|
+
if (type === 'request') {
|
|
5450
|
+
this.requestMiddlewares.push(middleware);
|
|
5451
|
+
}
|
|
5452
|
+
else {
|
|
5453
|
+
this.responseMiddlewares.push(middleware);
|
|
5454
|
+
}
|
|
5455
|
+
}
|
|
5456
|
+
/**
|
|
5457
|
+
* Create a fetch function bound to the given Context instance
|
|
5458
|
+
* @param ctx - The Context instance to bind to
|
|
5459
|
+
* @returns A fetch function with middleware applied
|
|
5460
|
+
*/
|
|
5461
|
+
create(ctx) {
|
|
5462
|
+
const requestMiddlewares = this.requestMiddlewares;
|
|
5463
|
+
const responseMiddlewares = this.responseMiddlewares;
|
|
5464
|
+
const fetchFn = async function (input, init) {
|
|
5465
|
+
const request = new Request(input, init);
|
|
5466
|
+
// Request middleware chain
|
|
5467
|
+
let reqIndex = 0;
|
|
5468
|
+
const nextRequest = async () => {
|
|
5469
|
+
if (reqIndex < requestMiddlewares.length) {
|
|
5470
|
+
const middleware = requestMiddlewares[reqIndex++];
|
|
5471
|
+
return middleware.call(this, request, nextRequest);
|
|
5472
|
+
}
|
|
5473
|
+
// Execute actual fetch
|
|
5474
|
+
const response = await fetch(request);
|
|
5475
|
+
// Response middleware chain
|
|
5476
|
+
let resIndex = 0;
|
|
5477
|
+
const nextResponse = async () => {
|
|
5478
|
+
if (resIndex < responseMiddlewares.length) {
|
|
5479
|
+
const middleware = responseMiddlewares[resIndex++];
|
|
5480
|
+
return middleware.call(this, response, nextResponse);
|
|
5481
|
+
}
|
|
5482
|
+
return response;
|
|
5483
|
+
};
|
|
5484
|
+
return nextResponse();
|
|
5485
|
+
};
|
|
5486
|
+
return nextRequest();
|
|
5487
|
+
};
|
|
5488
|
+
return fetchFn.bind(ctx);
|
|
5489
|
+
}
|
|
5490
|
+
}
|
|
5491
|
+
|
|
5404
5492
|
exports.Context = Context;
|
|
5493
|
+
exports.ContextAwareFetcher = ContextAwareFetcher;
|
|
5405
5494
|
exports.IS_CONTROLLER_INSTANCE = IS_CONTROLLER_INSTANCE;
|
|
5406
5495
|
exports.Router = Router;
|
|
5407
5496
|
exports.SimpleArray = SimpleArray;
|