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.
Files changed (80) hide show
  1. package/README.md +2 -2
  2. package/bin/snice.js +4 -5
  3. package/bin/templates/CLAUDE.md +25 -3
  4. package/bin/templates/pwa/README.md +188 -0
  5. package/bin/templates/pwa/global.d.ts +10 -0
  6. package/bin/templates/pwa/index.html +16 -0
  7. package/bin/templates/pwa/package.json +32 -0
  8. package/bin/templates/pwa/public/icons/.gitkeep +6 -0
  9. package/bin/templates/pwa/src/daemons/notifications.ts +148 -0
  10. package/bin/templates/pwa/src/fetcher.ts +15 -0
  11. package/bin/templates/pwa/src/guards/auth.ts +12 -0
  12. package/bin/templates/pwa/src/main.ts +42 -0
  13. package/bin/templates/pwa/src/middleware/auth.ts +16 -0
  14. package/bin/templates/pwa/src/middleware/error.ts +36 -0
  15. package/bin/templates/pwa/src/middleware/retry.ts +31 -0
  16. package/bin/templates/pwa/src/pages/dashboard.ts +143 -0
  17. package/bin/templates/pwa/src/pages/login.ts +161 -0
  18. package/bin/templates/pwa/src/pages/notifications.ts +156 -0
  19. package/bin/templates/pwa/src/pages/profile.ts +164 -0
  20. package/bin/templates/pwa/src/router.ts +20 -0
  21. package/bin/templates/pwa/src/services/auth.ts +48 -0
  22. package/bin/templates/pwa/src/services/jwt.ts +35 -0
  23. package/bin/templates/pwa/src/services/storage.ts +24 -0
  24. package/bin/templates/pwa/src/styles/global.css +55 -0
  25. package/bin/templates/pwa/src/types/auth.ts +21 -0
  26. package/bin/templates/pwa/src/types/notifications.ts +9 -0
  27. package/bin/templates/pwa/tests/helpers/test-utils.ts +84 -0
  28. package/bin/templates/pwa/tests/middleware/auth.test.ts +67 -0
  29. package/bin/templates/pwa/tests/middleware/error.test.ts +105 -0
  30. package/bin/templates/pwa/tests/middleware/retry.test.ts +103 -0
  31. package/bin/templates/pwa/tests/services/auth.test.ts +89 -0
  32. package/bin/templates/pwa/tests/services/jwt.test.ts +76 -0
  33. package/bin/templates/pwa/tests/services/storage.test.ts +69 -0
  34. package/bin/templates/{social → pwa}/tsconfig.json +11 -10
  35. package/bin/templates/pwa/vite.config.ts +94 -0
  36. package/bin/templates/{social/vite.config.ts → pwa/vitest.config.ts} +12 -17
  37. package/dist/components/music-player/snice-music-player.d.ts +72 -0
  38. package/dist/components/music-player/snice-music-player.js +730 -0
  39. package/dist/components/music-player/snice-music-player.js.map +1 -0
  40. package/dist/components/music-player/snice-music-player.types.d.ts +43 -0
  41. package/dist/components/timer/snice-timer.d.ts +27 -0
  42. package/dist/components/timer/snice-timer.js +197 -0
  43. package/dist/components/timer/snice-timer.js.map +1 -0
  44. package/dist/components/timer/snice-timer.types.d.ts +10 -0
  45. package/dist/fetcher.d.ts +65 -0
  46. package/dist/index.cjs +92 -3
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.esm.js +92 -4
  50. package/dist/index.esm.js.map +1 -1
  51. package/dist/index.iife.js +92 -3
  52. package/dist/index.iife.js.map +1 -1
  53. package/dist/symbols.cjs +1 -1
  54. package/dist/symbols.esm.js +1 -1
  55. package/dist/transitions.cjs +1 -1
  56. package/dist/transitions.esm.js +1 -1
  57. package/dist/types/context.d.ts +7 -1
  58. package/dist/types/router-options.d.ts +6 -0
  59. package/docs/ai/api.md +33 -1
  60. package/docs/ai/components/music-player.md +134 -0
  61. package/docs/ai/components/timer.md +43 -0
  62. package/docs/ai/patterns.md +48 -1
  63. package/docs/components/music-player.md +314 -0
  64. package/docs/components/timer.md +143 -0
  65. package/docs/fetcher.md +447 -0
  66. package/docs/routing.md +11 -8
  67. package/package.json +2 -1
  68. package/bin/templates/social/README.md +0 -42
  69. package/bin/templates/social/global.d.ts +0 -14
  70. package/bin/templates/social/index.html +0 -13
  71. package/bin/templates/social/package.json +0 -21
  72. package/bin/templates/social/src/main.ts +0 -33
  73. package/bin/templates/social/src/pages/feed-page.ts +0 -111
  74. package/bin/templates/social/src/pages/messages-page.ts +0 -102
  75. package/bin/templates/social/src/pages/not-found-page.ts +0 -46
  76. package/bin/templates/social/src/pages/profile-page.ts +0 -99
  77. package/bin/templates/social/src/pages/settings-page.ts +0 -119
  78. package/bin/templates/social/src/router.ts +0 -9
  79. package/bin/templates/social/src/styles/global.css +0 -156
  80. /package/bin/templates/{social → pwa}/public/vite.svg +0 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v3.5.0
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;