application.ts 1.0.3 → 1.0.4

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 CHANGED
@@ -154,10 +154,16 @@ export class MyComponent extends AppView {
154
154
  Wrap views with shared layouts:
155
155
 
156
156
  ```typescript
157
+ import { DefaultLayout } from './layouts/default.layout';
158
+
159
+ // Register and set default layout
160
+ app.registerLayout('default', DefaultLayout);
161
+ app.setDefaultLayout('default');
162
+
163
+ // Or specify layout per route
157
164
  app.router
158
165
  .map('/', HomeView)
159
- .map('/about', AboutView)
160
- .setLayout(DefaultLayout);
166
+ .map('/about', AboutView, { meta: { layout: 'default' } });
161
167
  ```
162
168
 
163
169
  ### 🎯 View Lifecycle
@@ -317,12 +323,20 @@ app.start() // Start the application
317
323
 
318
324
  ```typescript
319
325
  router.map(path: string, view: typeof AppView, options?: RouteOptions)
320
- router.setLayout(layout: typeof AppView)
321
326
  router.notFound(view: typeof AppView)
322
327
  router.navigate(path: string)
323
328
  router.start()
324
329
  ```
325
330
 
331
+ ### App
332
+
333
+ ```typescript
334
+ app.registerLayout(handler: string, layoutClass: typeof AppView)
335
+ app.setDefaultLayout(handler: string)
336
+ app.registerView(handler: string, viewClass: typeof AppView)
337
+ app.start()
338
+ ```
339
+
326
340
  ### AppView
327
341
 
328
342
  ```typescript
@@ -42,7 +42,7 @@ export declare class Router extends EventTarget {
42
42
  start(): void;
43
43
  /**
44
44
  * Navigate to a specific path
45
- * @param path - The path to navigate to (relative to basePath)
45
+ * @param path - The path to navigate to (relative to basePath), can include query string
46
46
  * @param replaceState - If true, replaces current history entry instead of pushing
47
47
  */
48
48
  navigate(path: string, replaceState?: boolean): Promise<void>;
@@ -89,4 +89,10 @@ export declare class Router extends EventTarget {
89
89
  * @returns The generated URL (with basePath) or null if route not found
90
90
  */
91
91
  generateUrl(path: string, params?: RouteParams): string | null;
92
+ /**
93
+ * Parse query string parameters from URL
94
+ * @param search - The query string (e.g., '?code=123&state=abc')
95
+ * @returns Object with query parameters
96
+ */
97
+ private parseQueryParams;
92
98
  }
@@ -22,7 +22,7 @@ export class Router extends EventTarget {
22
22
  const link = target.closest('a[href]');
23
23
  if (link && link.href.startsWith(window.location.origin) && !link.hasAttribute('target')) {
24
24
  e.preventDefault();
25
- this.navigate(link.pathname);
25
+ this.navigate(link.pathname + link.search);
26
26
  }
27
27
  });
28
28
  }
@@ -91,21 +91,27 @@ export class Router extends EventTarget {
91
91
  }
92
92
  /**
93
93
  * Navigate to a specific path
94
- * @param path - The path to navigate to (relative to basePath)
94
+ * @param path - The path to navigate to (relative to basePath), can include query string
95
95
  * @param replaceState - If true, replaces current history entry instead of pushing
96
96
  */
97
97
  async navigate(path, replaceState = false) {
98
+ // Split path and query string
99
+ const [pathPart, queryPart] = path.split('?');
98
100
  // Strip basePath if present to get route path
99
- const routePath = this.stripBasePath(path);
101
+ const routePath = this.stripBasePath(pathPart);
100
102
  // Find matching route
101
103
  const match = this.findRoute(routePath);
102
104
  if (!match) {
103
105
  this.emitNotFound(routePath);
104
106
  return;
105
107
  }
106
- const { route, handler, params } = match;
107
- // Check route guard
108
- const guardResult = await route.canEnter(params);
108
+ const { route, handler, params: pathParams } = match;
109
+ // Parse query string parameters
110
+ const queryParams = this.parseQueryParams(queryPart || '');
111
+ // Merge path params and query params (query params can override path params)
112
+ const allParams = { ...pathParams, ...queryParams };
113
+ // Check route guard with merged params
114
+ const guardResult = await route.canEnter(allParams);
109
115
  if (guardResult === false) {
110
116
  // Navigation denied
111
117
  console.warn(`Navigation to ${path} was denied by route guard`);
@@ -117,7 +123,7 @@ export class Router extends EventTarget {
117
123
  return;
118
124
  }
119
125
  // Add basePath to create full URL
120
- const fullPath = this.addBasePath(routePath);
126
+ const fullPath = this.addBasePath(routePath) + (queryPart ? '?' + queryPart : '');
121
127
  // Update browser history
122
128
  if (replaceState) {
123
129
  window.history.replaceState({ path: fullPath }, '', fullPath);
@@ -125,8 +131,8 @@ export class Router extends EventTarget {
125
131
  else {
126
132
  window.history.pushState({ path: fullPath }, '', fullPath);
127
133
  }
128
- // Emit navigation event for Application.ts to handle
129
- this.emitNavigation(routePath, params, handler, route.options.meta);
134
+ // Emit navigation event for Application.ts to handle with merged params
135
+ this.emitNavigation(routePath, allParams, handler, route.options.meta);
130
136
  }
131
137
  /**
132
138
  * Get the current path (route pattern)
@@ -164,7 +170,8 @@ export class Router extends EventTarget {
164
170
  */
165
171
  async handleRouteChange() {
166
172
  const routePath = this.stripBasePath(window.location.pathname);
167
- await this.navigate(routePath, true);
173
+ const fullPath = routePath + window.location.search;
174
+ await this.navigate(fullPath, true);
168
175
  }
169
176
  /**
170
177
  * Strip base path from a full path
@@ -242,5 +249,26 @@ export class Router extends EventTarget {
242
249
  const routePath = routeEntry.route.generate(params);
243
250
  return this.addBasePath(routePath);
244
251
  }
252
+ /**
253
+ * Parse query string parameters from URL
254
+ * @param search - The query string (e.g., '?code=123&state=abc')
255
+ * @returns Object with query parameters
256
+ */
257
+ parseQueryParams(search) {
258
+ const params = {};
259
+ if (!search || search.length <= 1) {
260
+ return params;
261
+ }
262
+ // Remove leading '?' if present
263
+ const queryString = search.startsWith('?') ? search.slice(1) : search;
264
+ // Parse each parameter
265
+ queryString.split('&').forEach(param => {
266
+ const [key, value] = param.split('=');
267
+ if (key) {
268
+ params[decodeURIComponent(key)] = value ? decodeURIComponent(value) : '';
269
+ }
270
+ });
271
+ return params;
272
+ }
245
273
  }
246
274
  //# sourceMappingURL=router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/navigation/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/navigation/router.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  /**
2
- * Route parameters extracted from URL path
2
+ * Route parameters extracted from URL path and query string
3
+ * Path params come from :param patterns in routes
4
+ * Query params come from ?key=value in the URL
3
5
  */
4
6
  export type RouteParams = Record<string, string>;
5
7
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"AAiEA;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,eAAe,EAAE,mBAAmB;IACpC,QAAQ,EAAE,qBAAqB;IAC/B,SAAS,EAAE,qBAAqB;CAC1B,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"AAmEA;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,eAAe,EAAE,mBAAmB;IACpC,QAAQ,EAAE,qBAAqB;IAC/B,SAAS,EAAE,qBAAqB;CAC1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "application.ts",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Simplified Web SPA app framework with vanilla JavaScript and CSS",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -65,12 +65,13 @@
65
65
  "template.ts": "^2.0.0"
66
66
  },
67
67
  "devDependencies": {
68
+ "@types/node": "^22.0.0",
68
69
  "@typescript-eslint/eslint-plugin": "^8.18.0",
69
70
  "@typescript-eslint/parser": "^8.18.0",
70
- "@types/node": "^22.0.0",
71
+ "eslint": "^8.57.0",
72
+ "terser": "^5.44.1",
71
73
  "typescript": "^5.9.3",
72
- "vite": "^7.2.4",
73
- "eslint": "^8.57.0"
74
+ "vite": "^7.2.4"
74
75
  },
75
76
  "eslintConfig": {
76
77
  "extends": [