mikuru 1.0.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 (51) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +142 -0
  3. package/dist/compiler/analyzeTemplate.d.ts +7 -0
  4. package/dist/compiler/analyzeTemplate.js +161 -0
  5. package/dist/compiler/analyzeTemplate.js.map +1 -0
  6. package/dist/compiler/compile.d.ts +2 -0
  7. package/dist/compiler/compile.js +24 -0
  8. package/dist/compiler/compile.js.map +1 -0
  9. package/dist/compiler/errors.d.ts +17 -0
  10. package/dist/compiler/errors.js +51 -0
  11. package/dist/compiler/errors.js.map +1 -0
  12. package/dist/compiler/generate.d.ts +2 -0
  13. package/dist/compiler/generate.js +982 -0
  14. package/dist/compiler/generate.js.map +1 -0
  15. package/dist/compiler/index.d.ts +9 -0
  16. package/dist/compiler/index.js +8 -0
  17. package/dist/compiler/index.js.map +1 -0
  18. package/dist/compiler/parseExpression.d.ts +14 -0
  19. package/dist/compiler/parseExpression.js +273 -0
  20. package/dist/compiler/parseExpression.js.map +1 -0
  21. package/dist/compiler/parseSfc.d.ts +2 -0
  22. package/dist/compiler/parseSfc.js +38 -0
  23. package/dist/compiler/parseSfc.js.map +1 -0
  24. package/dist/compiler/parseTemplate.d.ts +8 -0
  25. package/dist/compiler/parseTemplate.js +266 -0
  26. package/dist/compiler/parseTemplate.js.map +1 -0
  27. package/dist/compiler/sourceMap.d.ts +2 -0
  28. package/dist/compiler/sourceMap.js +66 -0
  29. package/dist/compiler/sourceMap.js.map +1 -0
  30. package/dist/compiler/types.d.ts +89 -0
  31. package/dist/compiler/types.js +2 -0
  32. package/dist/compiler/types.js.map +1 -0
  33. package/dist/index.d.ts +4 -0
  34. package/dist/index.js +3 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/runtime/dom.d.ts +3 -0
  37. package/dist/runtime/dom.js +46 -0
  38. package/dist/runtime/dom.js.map +1 -0
  39. package/dist/runtime/index.d.ts +6 -0
  40. package/dist/runtime/index.js +4 -0
  41. package/dist/runtime/index.js.map +1 -0
  42. package/dist/runtime/lifecycle.d.ts +10 -0
  43. package/dist/runtime/lifecycle.js +79 -0
  44. package/dist/runtime/lifecycle.js.map +1 -0
  45. package/dist/runtime/reactivity.d.ts +11 -0
  46. package/dist/runtime/reactivity.js +84 -0
  47. package/dist/runtime/reactivity.js.map +1 -0
  48. package/dist/vite.d.ts +7 -0
  49. package/dist/vite.js +39 -0
  50. package/dist/vite.js.map +1 -0
  51. package/package.json +80 -0
@@ -0,0 +1,84 @@
1
+ const effectStack = [];
2
+ let activeEffect;
3
+ export function ref(initialValue) {
4
+ let currentValue = initialValue;
5
+ const dep = new Set();
6
+ return {
7
+ get value() {
8
+ track(dep);
9
+ return currentValue;
10
+ },
11
+ set value(nextValue) {
12
+ if (Object.is(currentValue, nextValue)) {
13
+ return;
14
+ }
15
+ currentValue = nextValue;
16
+ trigger(dep);
17
+ }
18
+ };
19
+ }
20
+ export function computed(getter) {
21
+ const result = ref(getter());
22
+ effect(() => {
23
+ result.value = getter();
24
+ });
25
+ return {
26
+ get value() {
27
+ return result.value;
28
+ }
29
+ };
30
+ }
31
+ export function effect(fn) {
32
+ const reactiveEffect = {
33
+ run: fn,
34
+ deps: new Set(),
35
+ active: true
36
+ };
37
+ runEffect(reactiveEffect);
38
+ return () => {
39
+ reactiveEffect.active = false;
40
+ cleanupEffect(reactiveEffect);
41
+ };
42
+ }
43
+ export function unwrap(value) {
44
+ if (isRefLike(value)) {
45
+ return value.value;
46
+ }
47
+ return value;
48
+ }
49
+ function track(dep) {
50
+ if (!activeEffect || !activeEffect.active) {
51
+ return;
52
+ }
53
+ dep.add(activeEffect);
54
+ activeEffect.deps.add(dep);
55
+ }
56
+ function trigger(dep) {
57
+ for (const reactiveEffect of [...dep]) {
58
+ if (reactiveEffect.active) {
59
+ runEffect(reactiveEffect);
60
+ }
61
+ }
62
+ }
63
+ function runEffect(reactiveEffect) {
64
+ cleanupEffect(reactiveEffect);
65
+ effectStack.push(reactiveEffect);
66
+ activeEffect = reactiveEffect;
67
+ try {
68
+ reactiveEffect.run();
69
+ }
70
+ finally {
71
+ effectStack.pop();
72
+ activeEffect = effectStack.at(-1);
73
+ }
74
+ }
75
+ function cleanupEffect(reactiveEffect) {
76
+ for (const dep of reactiveEffect.deps) {
77
+ dep.delete(reactiveEffect);
78
+ }
79
+ reactiveEffect.deps.clear();
80
+ }
81
+ function isRefLike(value) {
82
+ return typeof value === "object" && value !== null && "value" in value;
83
+ }
84
+ //# sourceMappingURL=reactivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactivity.js","sourceRoot":"","sources":["../../src/runtime/reactivity.ts"],"names":[],"mappings":"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"}
package/dist/vite.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import type { Plugin } from "vite";
2
+ export type MikuruPluginOptions = {
3
+ debug?: boolean;
4
+ include?: RegExp;
5
+ };
6
+ export declare function mikuru(options?: MikuruPluginOptions): Plugin;
7
+ export default mikuru;
package/dist/vite.js ADDED
@@ -0,0 +1,39 @@
1
+ import { compile, MikuruCompileError } from "./compiler/index.js";
2
+ export function mikuru(options = {}) {
3
+ const include = options.include ?? /\.mikuru$/;
4
+ return {
5
+ name: "mikuru",
6
+ transform(source, id) {
7
+ if (!include.test(id)) {
8
+ return null;
9
+ }
10
+ let result;
11
+ try {
12
+ result = compile(source, { filename: id });
13
+ }
14
+ catch (error) {
15
+ if (error instanceof MikuruCompileError) {
16
+ this.error({
17
+ message: error.message,
18
+ id,
19
+ loc: {
20
+ line: error.line,
21
+ column: error.column
22
+ },
23
+ frame: error.frame
24
+ });
25
+ }
26
+ throw error;
27
+ }
28
+ return {
29
+ code: options.debug ? `${result.code}\n//# sourceURL=${toGeneratedSourceUrl(id)}\n` : result.code,
30
+ map: result.map
31
+ };
32
+ }
33
+ };
34
+ }
35
+ export default mikuru;
36
+ function toGeneratedSourceUrl(id) {
37
+ return `${id.replace(/\\/g, "/")}?mikuru-generated`;
38
+ }
39
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAOlE,MAAM,UAAU,MAAM,CAAC,UAA+B,EAAE;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC;IAE/C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,SAAS,CAAC,MAAM,EAAE,EAAE;YAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,MAAkC,CAAC;YAEvC,IAAI,CAAC;gBACH,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;oBACxC,IAAI,CAAC,KAAK,CAAC;wBACT,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,EAAE;wBACF,GAAG,EAAE;4BACH,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,MAAM,EAAE,KAAK,CAAC,MAAM;yBACrB;wBACD,KAAK,EAAE,KAAK,CAAC,KAAK;qBACnB,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,mBAAmB,oBAAoB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;gBACjG,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,eAAe,MAAM,CAAC;AAEtB,SAAS,oBAAoB,CAAC,EAAU;IACtC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,mBAAmB,CAAC;AACtD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "mikuru",
3
+ "version": "1.0.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "A compile-first JavaScript framework with Vue-like authoring and Svelte-like generated DOM updates.",
7
+ "homepage": "https://github.com/miyagawayuu/mikuru#readme",
8
+ "bugs": {
9
+ "url": "https://github.com/miyagawayuu/mikuru/issues"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/miyagawayuu/mikuru.git"
14
+ },
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.js"
19
+ },
20
+ "./compiler": {
21
+ "types": "./dist/compiler/index.d.ts",
22
+ "default": "./dist/compiler/index.js"
23
+ },
24
+ "./runtime": {
25
+ "types": "./dist/runtime/index.d.ts",
26
+ "default": "./dist/runtime/index.js"
27
+ },
28
+ "./vite": {
29
+ "types": "./dist/vite.d.ts",
30
+ "default": "./dist/vite.js"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md",
36
+ "CHANGELOG.md"
37
+ ],
38
+ "engines": {
39
+ "node": ">=22"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc -p tsconfig.build.json",
43
+ "build:basic": "vite build --config examples/basic/vite.config.ts",
44
+ "build:dogfood": "vite build --config examples/dogfood/vite.config.ts",
45
+ "build:realworld": "vite build --config examples/realworld/vite.config.ts",
46
+ "build:mikuru-sample": "vite build --config examples/mikuru-sample/vite.config.ts",
47
+ "build:mikuru-vue-like": "vite build --config examples/mikuru-vue-like/vite.config.ts",
48
+ "ci": "npm run typecheck && npm test && npm run build && 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:dogfood",
49
+ "dev:basic": "vite --config examples/basic/vite.config.ts",
50
+ "dev:dogfood": "vite --config examples/dogfood/vite.config.ts",
51
+ "dev:realworld": "vite --config examples/realworld/vite.config.ts",
52
+ "dev:mikuru-sample": "vite --config examples/mikuru-sample/vite.config.ts",
53
+ "dev:mikuru-vue-like": "vite --config examples/mikuru-vue-like/vite.config.ts",
54
+ "test": "vitest run",
55
+ "test:e2e": "playwright test",
56
+ "test:e2e:dogfood": "playwright test --config playwright.dogfood.config.ts",
57
+ "test:pack": "node tests/npm-pack-smoke.mjs",
58
+ "test:package": "node tests/package-usage.mjs",
59
+ "typecheck": "tsc -p tsconfig.json --noEmit"
60
+ },
61
+ "keywords": [
62
+ "compiler",
63
+ "framework",
64
+ "sfc",
65
+ "vue",
66
+ "svelte"
67
+ ],
68
+ "license": "MIT",
69
+ "devDependencies": {
70
+ "@playwright/test": "^1.59.1",
71
+ "@types/node": "^25.6.0",
72
+ "happy-dom": "^20.9.0",
73
+ "typescript": "^6.0.3",
74
+ "vite": "^8.0.10",
75
+ "vitest": "^4.1.5"
76
+ },
77
+ "dependencies": {
78
+ "acorn": "^8.16.0"
79
+ }
80
+ }