mikuru 1.0.13 → 1.0.14

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/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 1.0.14 - 2026-05-06
6
+
7
+ - Added `mikuru/router` with route matching, hash/history/memory histories, guards, `RouterView`, and `RouterLink`.
8
+ - Added a router example app with E2E coverage.
9
+ - Added generated DOM router integration coverage plus `RouterLink` `replace`, `activeClass`, and `exactActiveClass` props.
10
+
5
11
  ## 1.0.13 - 2026-05-06
6
12
 
7
13
  - Added component-tree scoped `provide` / `inject` during Mikuru component mounting.
package/README.md CHANGED
@@ -136,6 +136,7 @@ declare const Greeting: MikuruComponent<GreetingProps>;
136
136
  - `v-model` for common form controls and child components
137
137
  - Component props, events, `defineProps`, `defineEmits`, default slots, named slots, and slot props
138
138
  - Runtime helpers including `ref`, `computed`, `effect`, `watch` with `immediate` and cleanup callbacks, `nextTick`, lifecycle callbacks, `provide`, and `inject`
139
+ - Routing through `mikuru/router` with route matching, history/hash/memory histories, guards, `RouterView`, and `RouterLink`
139
140
  - Style injection and basic `<style scoped>` selector rewriting
140
141
  - Compile errors with filenames, line/column information, and code frames
141
142
 
@@ -153,6 +154,12 @@ The Vite plugin is available from `mikuru/vite`:
153
154
  import { mikuru } from "mikuru/vite";
154
155
  ```
155
156
 
157
+ The router is available from `mikuru/router`:
158
+
159
+ ```ts
160
+ import { createRouter, createWebHashHistory, RouterLink, RouterView } from "mikuru/router";
161
+ ```
162
+
156
163
  The `.mikuru` TypeScript declaration is available from `mikuru/env`:
157
164
 
158
165
  ```ts
@@ -216,4 +223,5 @@ npm run dev:mikuru-vue-like
216
223
  - `CHANGELOG.md` lists published package changes.
217
224
  - `docs/npm-usage.md` shows a manual Vite setup for package consumers.
218
225
  - `docs/app-architecture.md` describes how to keep larger Mikuru apps split across components, API modules, stores, forms, auth, and tests.
226
+ - `docs/router.md` documents the runtime router.
219
227
  - `docs/v1-api-contract.md` describes the v1 compatibility boundary used by this repository.
@@ -0,0 +1,67 @@
1
+ import type { Ref } from "../runtime/index.js";
2
+ export type RouteParams = Record<string, string>;
3
+ export type RouteQuery = Record<string, string | string[] | undefined>;
4
+ export type RouteComponent = {
5
+ mount(target: Element | DocumentFragment, props?: Record<string, unknown>): {
6
+ element: Element | Comment;
7
+ unmount(): void;
8
+ };
9
+ };
10
+ export type RouteRecord = {
11
+ path: string;
12
+ name?: string;
13
+ component?: RouteComponent;
14
+ meta?: Record<string, unknown>;
15
+ };
16
+ export type RouteLocation = {
17
+ path: string;
18
+ fullPath: string;
19
+ query: RouteQuery;
20
+ hash: string;
21
+ params: RouteParams;
22
+ matched?: RouteRecord;
23
+ name?: string;
24
+ meta: Record<string, unknown>;
25
+ };
26
+ export type RouteLocationRaw = string | {
27
+ path: string;
28
+ query?: RouteQuery;
29
+ hash?: string;
30
+ };
31
+ export type NavigationGuardResult = void | boolean | string | RouteLocationRaw;
32
+ export type NavigationGuard = (to: RouteLocation, from: RouteLocation) => NavigationGuardResult | Promise<NavigationGuardResult>;
33
+ export type AfterNavigationHook = (to: RouteLocation, from: RouteLocation) => void;
34
+ export type RouterHistory = {
35
+ mode: "hash" | "history" | "memory";
36
+ location(): string;
37
+ push(path: string): void;
38
+ replace(path: string): void;
39
+ listen(fn: () => void): () => void;
40
+ createHref(path: string): string;
41
+ back(): void;
42
+ forward(): void;
43
+ };
44
+ export type RouterOptions = {
45
+ history?: RouterHistory;
46
+ routes: RouteRecord[];
47
+ notFound?: RouteComponent;
48
+ };
49
+ export type Router = {
50
+ currentRoute: Ref<RouteLocation>;
51
+ routes: RouteRecord[];
52
+ push(to: RouteLocationRaw): Promise<RouteLocation>;
53
+ replace(to: RouteLocationRaw): Promise<RouteLocation>;
54
+ back(): void;
55
+ forward(): void;
56
+ resolve(to: RouteLocationRaw): RouteLocation;
57
+ beforeEach(guard: NavigationGuard): () => void;
58
+ afterEach(hook: AfterNavigationHook): () => void;
59
+ listen(): () => void;
60
+ createHref(to: RouteLocationRaw): string;
61
+ };
62
+ export declare function createRouter(options: RouterOptions): Router;
63
+ export declare function createWebHistory(base?: string): RouterHistory;
64
+ export declare function createWebHashHistory(base?: string): RouterHistory;
65
+ export declare function createMemoryHistory(initial?: string): RouterHistory;
66
+ export declare const RouterView: RouteComponent;
67
+ export declare const RouterLink: RouteComponent;
@@ -0,0 +1,372 @@
1
+ import { effect, ref, unwrap } from "../runtime/index.js";
2
+ const notFoundRoute = { path: "/:pathMatch(.*)*", name: "not-found" };
3
+ export function createRouter(options) {
4
+ const history = options.history ?? createWebHashHistory();
5
+ const routes = options.notFound ? [...options.routes, { ...notFoundRoute, component: options.notFound }] : options.routes.slice();
6
+ const matcher = createMatcher(routes);
7
+ const beforeGuards = [];
8
+ const afterHooks = [];
9
+ const initial = resolveLocation(history.location(), matcher);
10
+ const currentRoute = ref(initial);
11
+ let listeningStop;
12
+ let navigationId = 0;
13
+ async function navigate(to, replace) {
14
+ const target = resolveLocation(stringifyLocation(to), matcher);
15
+ const from = currentRoute.value;
16
+ const id = ++navigationId;
17
+ for (const guard of beforeGuards) {
18
+ const result = await guard(target, from);
19
+ if (id !== navigationId)
20
+ return currentRoute.value;
21
+ if (result === false)
22
+ return from;
23
+ if (typeof result === "string" || (result && typeof result === "object")) {
24
+ return navigate(result, true);
25
+ }
26
+ }
27
+ if (replace)
28
+ history.replace(target.fullPath);
29
+ else
30
+ history.push(target.fullPath);
31
+ currentRoute.value = target;
32
+ for (const hook of afterHooks) {
33
+ hook(target, from);
34
+ }
35
+ return target;
36
+ }
37
+ function syncFromHistory() {
38
+ currentRoute.value = resolveLocation(history.location(), matcher);
39
+ }
40
+ return {
41
+ currentRoute,
42
+ routes,
43
+ push(to) {
44
+ return navigate(to, false);
45
+ },
46
+ replace(to) {
47
+ return navigate(to, true);
48
+ },
49
+ back() {
50
+ history.back();
51
+ },
52
+ forward() {
53
+ history.forward();
54
+ },
55
+ resolve(to) {
56
+ return resolveLocation(stringifyLocation(to), matcher);
57
+ },
58
+ beforeEach(guard) {
59
+ beforeGuards.push(guard);
60
+ return () => removeItem(beforeGuards, guard);
61
+ },
62
+ afterEach(hook) {
63
+ afterHooks.push(hook);
64
+ return () => removeItem(afterHooks, hook);
65
+ },
66
+ listen() {
67
+ if (listeningStop)
68
+ return listeningStop;
69
+ listeningStop = history.listen(syncFromHistory);
70
+ syncFromHistory();
71
+ return () => {
72
+ listeningStop?.();
73
+ listeningStop = undefined;
74
+ };
75
+ },
76
+ createHref(to) {
77
+ return history.createHref(stringifyLocation(to));
78
+ }
79
+ };
80
+ }
81
+ export function createWebHistory(base = "") {
82
+ const normalizedBase = normalizeBase(base);
83
+ return {
84
+ mode: "history",
85
+ location() {
86
+ const path = stripBase(globalThis.location?.pathname ?? "/", normalizedBase);
87
+ return `${path || "/"}${globalThis.location?.search ?? ""}${globalThis.location?.hash ?? ""}`;
88
+ },
89
+ push(path) {
90
+ globalThis.history?.pushState({}, "", `${normalizedBase}${path.replace(/^\//, "")}`);
91
+ },
92
+ replace(path) {
93
+ globalThis.history?.replaceState({}, "", `${normalizedBase}${path.replace(/^\//, "")}`);
94
+ },
95
+ listen(fn) {
96
+ globalThis.addEventListener?.("popstate", fn);
97
+ return () => globalThis.removeEventListener?.("popstate", fn);
98
+ },
99
+ createHref(path) {
100
+ return `${normalizedBase}${path.replace(/^\//, "")}`;
101
+ },
102
+ back() {
103
+ globalThis.history?.back();
104
+ },
105
+ forward() {
106
+ globalThis.history?.forward();
107
+ }
108
+ };
109
+ }
110
+ export function createWebHashHistory(base = "") {
111
+ const normalizedBase = normalizeBase(base);
112
+ return {
113
+ mode: "hash",
114
+ location() {
115
+ const hash = globalThis.location?.hash ?? "";
116
+ return normalizePath(hash.startsWith("#") ? hash.slice(1) : hash);
117
+ },
118
+ push(path) {
119
+ globalThis.location.hash = `${normalizedBase.replace(/\/$/, "")}#${normalizePath(path)}`;
120
+ },
121
+ replace(path) {
122
+ const url = `${globalThis.location?.pathname ?? ""}${globalThis.location?.search ?? ""}${normalizedBase.replace(/\/$/, "")}#${normalizePath(path)}`;
123
+ globalThis.location?.replace?.(url);
124
+ },
125
+ listen(fn) {
126
+ globalThis.addEventListener?.("hashchange", fn);
127
+ return () => globalThis.removeEventListener?.("hashchange", fn);
128
+ },
129
+ createHref(path) {
130
+ return `${normalizedBase.replace(/\/$/, "")}#${normalizePath(path)}`;
131
+ },
132
+ back() {
133
+ globalThis.history?.back();
134
+ },
135
+ forward() {
136
+ globalThis.history?.forward();
137
+ }
138
+ };
139
+ }
140
+ export function createMemoryHistory(initial = "/") {
141
+ const stack = [normalizePath(initial)];
142
+ const listeners = new Set();
143
+ let index = 0;
144
+ function notify() {
145
+ for (const listener of listeners)
146
+ listener();
147
+ }
148
+ return {
149
+ mode: "memory",
150
+ location() {
151
+ return stack[index] ?? "/";
152
+ },
153
+ push(path) {
154
+ stack.splice(index + 1);
155
+ stack.push(normalizePath(path));
156
+ index = stack.length - 1;
157
+ notify();
158
+ },
159
+ replace(path) {
160
+ stack[index] = normalizePath(path);
161
+ notify();
162
+ },
163
+ listen(fn) {
164
+ listeners.add(fn);
165
+ return () => listeners.delete(fn);
166
+ },
167
+ createHref(path) {
168
+ return normalizePath(path);
169
+ },
170
+ back() {
171
+ if (index > 0) {
172
+ index -= 1;
173
+ notify();
174
+ }
175
+ },
176
+ forward() {
177
+ if (index < stack.length - 1) {
178
+ index += 1;
179
+ notify();
180
+ }
181
+ }
182
+ };
183
+ }
184
+ export const RouterView = {
185
+ mount(target, props = {}) {
186
+ const anchor = document.createComment("mikuru-router-view");
187
+ const cleanup = [];
188
+ let child;
189
+ target.appendChild(anchor);
190
+ const stop = effect(() => {
191
+ const router = getRouterProp(props);
192
+ const route = router.currentRoute.value;
193
+ const component = route.matched?.component;
194
+ child?.unmount();
195
+ child = undefined;
196
+ if (!component)
197
+ return;
198
+ const fragment = document.createDocumentFragment();
199
+ child = component.mount(fragment, { route, router, __mikuru_context: props.__mikuru_context });
200
+ anchor.parentNode?.insertBefore(fragment, anchor);
201
+ });
202
+ cleanup.push(stop, () => child?.unmount(), () => anchor.remove());
203
+ return {
204
+ element: anchor,
205
+ unmount() {
206
+ for (const fn of cleanup.splice(0).reverse())
207
+ fn();
208
+ }
209
+ };
210
+ }
211
+ };
212
+ export const RouterLink = {
213
+ mount(target, props = {}) {
214
+ const anchor = document.createElement("a");
215
+ const cleanup = [];
216
+ const text = () => String(unwrap(props.label) ?? unwrap(props.childrenText) ?? unwrap(props.to) ?? "");
217
+ const navigate = (event) => {
218
+ const router = getRouterProp(props);
219
+ const to = String(unwrap(props.to) ?? "/");
220
+ event.preventDefault();
221
+ void (unwrap(props.replace) ? router.replace(to) : router.push(to));
222
+ };
223
+ anchor.addEventListener("click", navigate);
224
+ cleanup.push(() => anchor.removeEventListener("click", navigate));
225
+ const stop = effect(() => {
226
+ const router = getRouterProp(props);
227
+ const to = stringifyLocation(String(unwrap(props.to) ?? "/"));
228
+ const targetRoute = router.resolve(to);
229
+ const activeClass = String(unwrap(props.activeClass) ?? "router-link-active");
230
+ const exactActiveClass = String(unwrap(props.exactActiveClass) ?? "router-link-exact-active");
231
+ const isExactActive = router.currentRoute.value.fullPath === targetRoute.fullPath;
232
+ const isActive = isExactActive || isPathActive(router.currentRoute.value.path, targetRoute.path);
233
+ anchor.href = router.createHref(to);
234
+ anchor.textContent = text();
235
+ anchor.classList.toggle(activeClass, isActive);
236
+ anchor.classList.toggle(exactActiveClass, isExactActive);
237
+ if (isExactActive) {
238
+ anchor.setAttribute("aria-current", "page");
239
+ }
240
+ else {
241
+ anchor.removeAttribute("aria-current");
242
+ }
243
+ });
244
+ cleanup.push(stop, () => anchor.remove());
245
+ target.appendChild(anchor);
246
+ return {
247
+ element: anchor,
248
+ unmount() {
249
+ for (const fn of cleanup.splice(0).reverse())
250
+ fn();
251
+ }
252
+ };
253
+ }
254
+ };
255
+ function getRouterProp(props) {
256
+ const router = unwrap(props.router);
257
+ if (!router || typeof router !== "object" || !("currentRoute" in router)) {
258
+ throw new Error("RouterView and RouterLink require a router prop.");
259
+ }
260
+ return router;
261
+ }
262
+ function createMatcher(routes) {
263
+ return routes.map((record) => {
264
+ const keys = [];
265
+ const source = record.path
266
+ .replace(/\/:([^/(]+)\(\.\*\)\*/g, (_match, key) => {
267
+ keys.push(key);
268
+ return "/(.*)";
269
+ })
270
+ .replace(/:([^/]+)/g, (_match, key) => {
271
+ keys.push(key);
272
+ return "([^/]+)";
273
+ });
274
+ return {
275
+ record,
276
+ keys,
277
+ pattern: new RegExp(`^${source.replace(/\//g, "\\/")}$`)
278
+ };
279
+ });
280
+ }
281
+ function resolveLocation(raw, matcher) {
282
+ const fullPath = normalizePath(raw);
283
+ const parsed = parsePath(fullPath);
284
+ const matched = matcher.find((route) => route.pattern.test(parsed.path));
285
+ const params = {};
286
+ if (matched) {
287
+ const match = matched.pattern.exec(parsed.path);
288
+ matched.keys.forEach((key, index) => {
289
+ params[key] = decodeURIComponent(match?.[index + 1] ?? "");
290
+ });
291
+ }
292
+ return {
293
+ path: parsed.path,
294
+ fullPath,
295
+ query: parsed.query,
296
+ hash: parsed.hash,
297
+ params,
298
+ matched: matched?.record,
299
+ name: matched?.record.name,
300
+ meta: matched?.record.meta ?? {}
301
+ };
302
+ }
303
+ function parsePath(fullPath) {
304
+ const [pathAndQuery, rawHash = ""] = fullPath.split("#", 2);
305
+ const [path = "/", rawQuery = ""] = pathAndQuery.split("?", 2);
306
+ return {
307
+ path: normalizePath(path),
308
+ query: parseQuery(rawQuery),
309
+ hash: rawHash ? `#${rawHash}` : ""
310
+ };
311
+ }
312
+ function stringifyLocation(to) {
313
+ if (typeof to === "string")
314
+ return normalizePath(to);
315
+ const path = normalizePath(to.path);
316
+ const query = stringifyQuery(to.query ?? {});
317
+ const hash = to.hash ? (to.hash.startsWith("#") ? to.hash : `#${to.hash}`) : "";
318
+ return `${path}${query}${hash}`;
319
+ }
320
+ function parseQuery(raw) {
321
+ const query = {};
322
+ const search = new URLSearchParams(raw);
323
+ for (const [key, value] of search) {
324
+ const current = query[key];
325
+ if (Array.isArray(current))
326
+ current.push(value);
327
+ else if (current !== undefined)
328
+ query[key] = [current, value];
329
+ else
330
+ query[key] = value;
331
+ }
332
+ return query;
333
+ }
334
+ function stringifyQuery(query) {
335
+ const search = new URLSearchParams();
336
+ for (const [key, value] of Object.entries(query)) {
337
+ if (Array.isArray(value)) {
338
+ for (const item of value)
339
+ search.append(key, item);
340
+ }
341
+ else if (value !== undefined) {
342
+ search.set(key, value);
343
+ }
344
+ }
345
+ const result = search.toString();
346
+ return result ? `?${result}` : "";
347
+ }
348
+ function normalizePath(path) {
349
+ const normalized = path.trim() || "/";
350
+ return normalized.startsWith("/") ? normalized : `/${normalized}`;
351
+ }
352
+ function normalizeBase(base) {
353
+ if (!base)
354
+ return "/";
355
+ return base.endsWith("/") ? base : `${base}/`;
356
+ }
357
+ function stripBase(path, base) {
358
+ if (base === "/")
359
+ return path;
360
+ return path.startsWith(base) ? path.slice(base.length - 1) : path;
361
+ }
362
+ function isPathActive(currentPath, targetPath) {
363
+ if (targetPath === "/")
364
+ return currentPath === "/";
365
+ return currentPath === targetPath || currentPath.startsWith(`${targetPath}/`);
366
+ }
367
+ function removeItem(items, item) {
368
+ const index = items.indexOf(item);
369
+ if (index >= 0)
370
+ items.splice(index, 1);
371
+ }
372
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mikuru",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "A compile-first JavaScript framework with Vue-like authoring and Svelte-like generated DOM updates.",
@@ -21,11 +21,15 @@
21
21
  "types": "./dist/compiler/index.d.ts",
22
22
  "default": "./dist/compiler/index.js"
23
23
  },
24
- "./runtime": {
25
- "types": "./dist/runtime/index.d.ts",
26
- "default": "./dist/runtime/index.js"
27
- },
28
- "./env": {
24
+ "./runtime": {
25
+ "types": "./dist/runtime/index.d.ts",
26
+ "default": "./dist/runtime/index.js"
27
+ },
28
+ "./router": {
29
+ "types": "./dist/router/index.d.ts",
30
+ "default": "./dist/router/index.js"
31
+ },
32
+ "./env": {
29
33
  "types": "./types/env.d.ts",
30
34
  "default": "./dist/env.js"
31
35
  },
@@ -50,20 +54,23 @@
50
54
  "scripts": {
51
55
  "build": "tsc -p tsconfig.build.json",
52
56
  "build:basic": "vite build --config examples/basic/vite.config.ts",
53
- "build:dogfood": "vite build --config examples/dogfood/vite.config.ts",
54
- "build:realworld": "vite build --config examples/realworld/vite.config.ts",
57
+ "build:dogfood": "vite build --config examples/dogfood/vite.config.ts",
58
+ "build:realworld": "vite build --config examples/realworld/vite.config.ts",
59
+ "build:router": "vite build --config examples/router/vite.config.ts",
55
60
  "build:mikuru-sample": "vite build --config examples/mikuru-sample/vite.config.ts",
56
61
  "build:mikuru-vue-like": "vite build --config examples/mikuru-vue-like/vite.config.ts",
57
- "ci": "npm run typecheck && npm test && npm run test:templates && npm run test:docs && npm run build && npm run test:create && npm run build:basic && npm run build:realworld && npm run build:dogfood && npm run test:package && npm run test:pack && npm run test:e2e && npm run test:e2e:basic && npm run test:e2e:dogfood",
62
+ "ci": "npm run typecheck && npm test && npm run test:templates && npm run test:docs && npm run build && npm run test:create && npm run build:basic && npm run build:realworld && npm run build:dogfood && npm run build:router && npm run test:package && npm run test:pack && npm run test:e2e && npm run test:e2e:basic && npm run test:e2e:dogfood && npm run test:e2e:router",
58
63
  "dev:basic": "vite --config examples/basic/vite.config.ts",
59
- "dev:dogfood": "vite --config examples/dogfood/vite.config.ts",
60
- "dev:realworld": "vite --config examples/realworld/vite.config.ts",
64
+ "dev:dogfood": "vite --config examples/dogfood/vite.config.ts",
65
+ "dev:realworld": "vite --config examples/realworld/vite.config.ts",
66
+ "dev:router": "vite --config examples/router/vite.config.ts",
61
67
  "dev:mikuru-sample": "vite --config examples/mikuru-sample/vite.config.ts",
62
68
  "dev:mikuru-vue-like": "vite --config examples/mikuru-vue-like/vite.config.ts",
63
69
  "test": "vitest run",
64
70
  "test:e2e": "playwright test",
65
71
  "test:e2e:basic": "playwright test --config playwright.basic.config.ts",
66
- "test:e2e:dogfood": "playwright test --config playwright.dogfood.config.ts",
72
+ "test:e2e:dogfood": "playwright test --config playwright.dogfood.config.ts",
73
+ "test:e2e:router": "playwright test --config playwright.router.config.ts",
67
74
  "test:create": "node tests/create-cli-smoke.mjs",
68
75
  "test:docs": "node tests/docs-smoke.mjs",
69
76
  "test:pack": "node tests/npm-pack-smoke.mjs",