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,266 @@
1
+ import { createCompileError, getSourceLocation } from "./errors.js";
2
+ import { validateTemplateExpression } from "./parseExpression.js";
3
+ const voidElements = new Set([
4
+ "area",
5
+ "base",
6
+ "br",
7
+ "col",
8
+ "embed",
9
+ "hr",
10
+ "img",
11
+ "input",
12
+ "link",
13
+ "meta",
14
+ "param",
15
+ "source",
16
+ "track",
17
+ "wbr"
18
+ ]);
19
+ export function parseTemplate(template, options = {}) {
20
+ const context = {
21
+ filename: options.filename,
22
+ source: options.source ?? template,
23
+ offset: options.offset ?? 0
24
+ };
25
+ const root = {
26
+ type: "element",
27
+ tag: "root",
28
+ attrs: [],
29
+ children: []
30
+ };
31
+ const stack = [root];
32
+ for (const token of tokenizeTemplate(template, context)) {
33
+ if (token.type === "text") {
34
+ const textNode = parseText(token.value, token.start, context);
35
+ if (textNode) {
36
+ currentParent(stack).children.push(textNode);
37
+ }
38
+ continue;
39
+ }
40
+ if (token.value.startsWith("</")) {
41
+ closeElement(token.value, token.start, stack, context);
42
+ continue;
43
+ }
44
+ const { element, selfClosing } = parseElement(token.value, token.start, context);
45
+ currentParent(stack).children.push(element);
46
+ if (!selfClosing && !voidElements.has(element.tag.toLowerCase())) {
47
+ stack.push(element);
48
+ }
49
+ }
50
+ if (stack.length !== 1) {
51
+ const openElement = stack.at(-1);
52
+ throw createCompileError(`Unclosed template element <${openElement?.tag ?? "unknown"}>`, context.source, openElement?.loc?.offset ?? context.offset, context.filename);
53
+ }
54
+ const children = root.children.filter((node) => node.type !== "text" || hasMeaningfulText(node));
55
+ if (children.length !== 1 || children[0]?.type !== "element") {
56
+ throw createCompileError("Template must contain exactly one root element", context.source, context.offset, context.filename);
57
+ }
58
+ return children[0];
59
+ }
60
+ function tokenizeTemplate(template, context) {
61
+ const tokens = [];
62
+ let cursor = 0;
63
+ while (cursor < template.length) {
64
+ const tagStart = template.indexOf("<", cursor);
65
+ if (tagStart === -1) {
66
+ tokens.push({ type: "text", value: template.slice(cursor), start: cursor });
67
+ break;
68
+ }
69
+ if (tagStart > cursor) {
70
+ tokens.push({ type: "text", value: template.slice(cursor, tagStart), start: cursor });
71
+ }
72
+ if (template.startsWith("<!--", tagStart)) {
73
+ const commentEnd = template.indexOf("-->", tagStart + 4);
74
+ if (commentEnd === -1) {
75
+ throw createCompileError("Unclosed HTML comment in template", context.source, context.offset + tagStart, context.filename);
76
+ }
77
+ cursor = commentEnd + 3;
78
+ continue;
79
+ }
80
+ const tagEnd = findTagEnd(template, tagStart);
81
+ if (tagEnd === -1) {
82
+ throw createCompileError(`Unclosed template tag near: ${template.slice(tagStart, tagStart + 20)}`, context.source, context.offset + tagStart, context.filename);
83
+ }
84
+ tokens.push({ type: "tag", value: template.slice(tagStart, tagEnd + 1), start: tagStart });
85
+ cursor = tagEnd + 1;
86
+ }
87
+ return tokens;
88
+ }
89
+ function findTagEnd(template, tagStart) {
90
+ let quote;
91
+ for (let index = tagStart + 1; index < template.length; index += 1) {
92
+ const char = template[index];
93
+ if (quote) {
94
+ if (char === quote) {
95
+ quote = undefined;
96
+ }
97
+ continue;
98
+ }
99
+ if (char === "\"" || char === "'") {
100
+ quote = char;
101
+ continue;
102
+ }
103
+ if (char === ">") {
104
+ return index;
105
+ }
106
+ }
107
+ return -1;
108
+ }
109
+ function parseElement(token, tokenStart, context) {
110
+ const inner = token
111
+ .replace(/^</, "")
112
+ .replace(/>$/, "")
113
+ .trim();
114
+ const selfClosing = /\/\s*$/.test(inner);
115
+ const source = selfClosing ? inner.replace(/\/\s*$/, "").trim() : inner;
116
+ const tagMatch = /^([^\s/>]+)/.exec(source);
117
+ if (!tagMatch) {
118
+ throw createCompileError(`Invalid template element: ${token}`, context.source, context.offset + tokenStart, context.filename);
119
+ }
120
+ const tag = tagMatch[1];
121
+ if (!/^[A-Za-z][\w:-]*$/.test(tag)) {
122
+ throw createCompileError(`Invalid template tag name: ${tag}`, context.source, context.offset + tokenStart + 1, context.filename);
123
+ }
124
+ const rawAttrSource = source.slice(tag.length);
125
+ const attrLeadingWhitespace = rawAttrSource.length - rawAttrSource.trimStart().length;
126
+ const attrSource = rawAttrSource.trim();
127
+ const attrSourceStart = tokenStart + 1 + tag.length + attrLeadingWhitespace;
128
+ return {
129
+ element: {
130
+ type: "element",
131
+ tag,
132
+ attrs: parseAttributes(attrSource, attrSourceStart, context),
133
+ children: [],
134
+ loc: toLocation(tokenStart, context)
135
+ },
136
+ selfClosing
137
+ };
138
+ }
139
+ function parseAttributes(source, sourceStart, context) {
140
+ const attrs = [];
141
+ const seen = new Set();
142
+ let cursor = 0;
143
+ while (cursor < source.length) {
144
+ cursor = skipWhitespace(source, cursor);
145
+ if (cursor >= source.length) {
146
+ break;
147
+ }
148
+ const nameStart = cursor;
149
+ while (cursor < source.length && !/[\s=]/.test(source[cursor])) {
150
+ cursor += 1;
151
+ }
152
+ const name = source.slice(nameStart, cursor);
153
+ if (!name) {
154
+ break;
155
+ }
156
+ if (!/^[^\s="'<>/]+$/.test(name)) {
157
+ throw createCompileError(`Invalid template attribute name: ${name}`, context.source, context.offset + sourceStart + nameStart, context.filename);
158
+ }
159
+ if (seen.has(name)) {
160
+ throw createCompileError(`Duplicate template attribute: ${name}`, context.source, context.offset + sourceStart + nameStart, context.filename);
161
+ }
162
+ seen.add(name);
163
+ cursor = skipWhitespace(source, cursor);
164
+ if (source[cursor] !== "=") {
165
+ attrs.push({ name, value: true, loc: toLocation(sourceStart + nameStart, context) });
166
+ continue;
167
+ }
168
+ cursor += 1;
169
+ cursor = skipWhitespace(source, cursor);
170
+ const parsedValue = parseAttributeValue(source, cursor, sourceStart, context);
171
+ attrs.push({
172
+ name,
173
+ value: parsedValue.value,
174
+ loc: toLocation(sourceStart + nameStart, context),
175
+ valueLoc: toLocation(sourceStart + parsedValue.valueStart, context)
176
+ });
177
+ cursor = parsedValue.cursor;
178
+ }
179
+ return attrs;
180
+ }
181
+ function parseAttributeValue(source, cursor, sourceStart, context) {
182
+ const quote = source[cursor];
183
+ if (quote === "\"" || quote === "'") {
184
+ const valueStart = cursor + 1;
185
+ const valueEnd = source.indexOf(quote, valueStart);
186
+ if (valueEnd === -1) {
187
+ throw createCompileError(`Unclosed attribute value near: ${source.slice(cursor, cursor + 20)}`, context.source, context.offset + sourceStart + cursor, context.filename);
188
+ }
189
+ return {
190
+ value: source.slice(valueStart, valueEnd),
191
+ valueStart,
192
+ cursor: valueEnd + 1
193
+ };
194
+ }
195
+ const valueStart = cursor;
196
+ while (cursor < source.length && !/\s/.test(source[cursor])) {
197
+ cursor += 1;
198
+ }
199
+ return {
200
+ value: source.slice(valueStart, cursor),
201
+ valueStart,
202
+ cursor
203
+ };
204
+ }
205
+ function skipWhitespace(source, cursor) {
206
+ while (cursor < source.length && /\s/.test(source[cursor])) {
207
+ cursor += 1;
208
+ }
209
+ return cursor;
210
+ }
211
+ function parseText(token, tokenStart, context) {
212
+ if (!token.trim()) {
213
+ return undefined;
214
+ }
215
+ const parts = [];
216
+ const interpolationPattern = /\{\{\s*([\s\S]*?)\s*\}\}/g;
217
+ let cursor = 0;
218
+ let match;
219
+ while ((match = interpolationPattern.exec(token))) {
220
+ if (match.index > cursor) {
221
+ parts.push({ type: "static", value: token.slice(cursor, match.index) });
222
+ }
223
+ const rawExpression = match[1];
224
+ const leadingWhitespace = rawExpression.length - rawExpression.trimStart().length;
225
+ const expressionStart = tokenStart + match.index + match[0].indexOf(rawExpression) + leadingWhitespace;
226
+ parts.push({
227
+ type: "expression",
228
+ value: validateTemplateExpression(rawExpression, "interpolation", {
229
+ source: context.source,
230
+ offset: context.offset + expressionStart,
231
+ filename: context.filename
232
+ }),
233
+ loc: toLocation(expressionStart, context)
234
+ });
235
+ cursor = match.index + match[0].length;
236
+ }
237
+ if (cursor < token.length) {
238
+ parts.push({ type: "static", value: token.slice(cursor) });
239
+ }
240
+ return {
241
+ type: "text",
242
+ parts,
243
+ loc: toLocation(tokenStart, context)
244
+ };
245
+ }
246
+ function closeElement(token, tokenStart, stack, context) {
247
+ const tag = token.replace(/^<\//, "").replace(/>$/, "").trim();
248
+ const current = stack.pop();
249
+ if (!current || current.tag !== tag) {
250
+ throw createCompileError(`Unexpected closing tag </${tag}>`, context.source, context.offset + tokenStart, context.filename);
251
+ }
252
+ }
253
+ function currentParent(stack) {
254
+ const parent = stack.at(-1);
255
+ if (!parent) {
256
+ throw new Error("Template parser stack is empty");
257
+ }
258
+ return parent;
259
+ }
260
+ function hasMeaningfulText(node) {
261
+ return node.parts.some((part) => part.type === "expression" || part.value.trim().length > 0);
262
+ }
263
+ function toLocation(localOffset, context) {
264
+ return getSourceLocation(context.source, context.offset + localOffset, context.filename);
265
+ }
266
+ //# sourceMappingURL=parseTemplate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTemplate.js","sourceRoot":"","sources":["../../src/compiler/parseTemplate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { SfcDescriptor, SourceMap } from "./types.js";
2
+ export declare function createSourceMap(code: string, descriptor: SfcDescriptor): SourceMap;
@@ -0,0 +1,66 @@
1
+ import { getSourceLocation } from "./errors.js";
2
+ const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3
+ export function createSourceMap(code, descriptor) {
4
+ const source = descriptor.source ?? "";
5
+ const filename = descriptor.filename ?? "anonymous.mikuru";
6
+ const templateLocation = getSourceLocation(source, descriptor.templateOffset ?? 0, filename);
7
+ const scriptLocation = descriptor.scriptOffset === undefined ? templateLocation : getSourceLocation(source, descriptor.scriptOffset, filename);
8
+ const styleLocation = descriptor.styleOffset === undefined ? templateLocation : getSourceLocation(source, descriptor.styleOffset, filename);
9
+ const generatedLines = code.split("\n");
10
+ const mappings = [];
11
+ let previousSourceIndex = 0;
12
+ let previousSourceLine = 0;
13
+ let previousSourceColumn = 0;
14
+ for (const line of generatedLines) {
15
+ const original = pickOriginalLocation(line, templateLocation, scriptLocation, styleLocation);
16
+ const generatedColumn = Math.max(0, line.length - line.trimStart().length);
17
+ const sourceIndex = 0;
18
+ const originalLine = original.line - 1;
19
+ const originalColumn = original.column - 1;
20
+ mappings.push([
21
+ [
22
+ generatedColumn,
23
+ sourceIndex - previousSourceIndex,
24
+ originalLine - previousSourceLine,
25
+ originalColumn - previousSourceColumn
26
+ ]
27
+ ]);
28
+ previousSourceIndex = sourceIndex;
29
+ previousSourceLine = originalLine;
30
+ previousSourceColumn = originalColumn;
31
+ }
32
+ return {
33
+ version: 3,
34
+ file: descriptor.filename ? `${descriptor.filename}.js` : undefined,
35
+ sources: [filename],
36
+ sourcesContent: [source],
37
+ names: [],
38
+ mappings: mappings.map((segments) => segments.map((segment) => segment.map(encodeVlq).join("")).join(",")).join(";")
39
+ };
40
+ }
41
+ function pickOriginalLocation(generatedLine, templateLocation, scriptLocation, styleLocation) {
42
+ if (generatedLine.includes("style.") || generatedLine.includes("data-mikuru-style")) {
43
+ return styleLocation;
44
+ }
45
+ if (generatedLine.includes("__mikuru_emit") ||
46
+ generatedLine.includes("const ") ||
47
+ generatedLine.includes("function ") ||
48
+ generatedLine.includes("return ")) {
49
+ return scriptLocation;
50
+ }
51
+ return templateLocation;
52
+ }
53
+ function encodeVlq(value) {
54
+ let vlq = value < 0 ? ((-value) << 1) + 1 : value << 1;
55
+ let encoded = "";
56
+ do {
57
+ let digit = vlq & 31;
58
+ vlq >>>= 5;
59
+ if (vlq > 0) {
60
+ digit |= 32;
61
+ }
62
+ encoded += base64Chars[digit];
63
+ } while (vlq > 0);
64
+ return encoded;
65
+ }
66
+ //# sourceMappingURL=sourceMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceMap.js","sourceRoot":"","sources":["../../src/compiler/sourceMap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import type { SourceLocation } from "./errors.js";
2
+ export type SfcDescriptor = {
3
+ filename?: string;
4
+ source?: string;
5
+ template: string;
6
+ templateOffset?: number;
7
+ script?: string;
8
+ scriptOffset?: number;
9
+ style?: string;
10
+ styleOffset?: number;
11
+ styleScoped?: boolean;
12
+ };
13
+ export type TemplateNode = ElementNode | TextNode;
14
+ export type ElementNode = {
15
+ type: "element";
16
+ tag: string;
17
+ attrs: TemplateAttribute[];
18
+ children: TemplateNode[];
19
+ loc?: SourceLocation;
20
+ };
21
+ export type TextNode = {
22
+ type: "text";
23
+ parts: TextPart[];
24
+ loc?: SourceLocation;
25
+ };
26
+ export type TextPart = {
27
+ type: "static";
28
+ value: string;
29
+ } | {
30
+ type: "expression";
31
+ value: string;
32
+ loc?: SourceLocation;
33
+ };
34
+ export type TemplateAttribute = {
35
+ name: string;
36
+ value: string | true;
37
+ loc?: SourceLocation;
38
+ valueLoc?: SourceLocation;
39
+ };
40
+ export type Binding = {
41
+ type: "text";
42
+ expression: string;
43
+ } | {
44
+ type: "event";
45
+ event: string;
46
+ handler: string;
47
+ modifiers?: string[];
48
+ } | {
49
+ type: "attribute";
50
+ name: string;
51
+ expression: string;
52
+ } | {
53
+ type: "model";
54
+ expression: string;
55
+ } | {
56
+ type: "if";
57
+ expression: string;
58
+ } | {
59
+ type: "else-if";
60
+ expression: string;
61
+ } | {
62
+ type: "else";
63
+ } | {
64
+ type: "show";
65
+ expression: string;
66
+ } | {
67
+ type: "for";
68
+ item: string;
69
+ index?: string;
70
+ source: string;
71
+ };
72
+ export type CompileOptions = {
73
+ filename?: string;
74
+ };
75
+ export type CompileResult = {
76
+ code: string;
77
+ map: SourceMap;
78
+ descriptor: SfcDescriptor;
79
+ ast: ElementNode;
80
+ bindings: Binding[];
81
+ };
82
+ export type SourceMap = {
83
+ version: 3;
84
+ file?: string;
85
+ sources: string[];
86
+ sourcesContent: string[];
87
+ names: string[];
88
+ mappings: string;
89
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/compiler/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export { compile } from "./compiler/index.js";
2
+ export type { CompileOptions, CompileResult } from "./compiler/index.js";
3
+ export { computed, effect, ref, unwrap } from "./runtime/index.js";
4
+ export type { ComputedRef, EffectFn, Ref } from "./runtime/index.js";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { compile } from "./compiler/index.js";
2
+ export { computed, effect, ref, unwrap } from "./runtime/index.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type ClassValue = string | number | boolean | null | undefined | ClassValue[] | Record<string, unknown>;
2
+ export declare function setAttribute(element: Element, name: string, value: unknown): void;
3
+ export declare function normalizeClass(value: ClassValue): string;
@@ -0,0 +1,46 @@
1
+ export function setAttribute(element, name, value) {
2
+ if (value === null || value === undefined || value === false) {
3
+ element.removeAttribute(name);
4
+ return;
5
+ }
6
+ if (name === "class") {
7
+ element.setAttribute(name, normalizeClass(value));
8
+ return;
9
+ }
10
+ if (value === true) {
11
+ element.setAttribute(name, "");
12
+ return;
13
+ }
14
+ element.setAttribute(name, String(value));
15
+ }
16
+ export function normalizeClass(value) {
17
+ if (isRefLike(value)) {
18
+ return normalizeClass(value.value);
19
+ }
20
+ if (value === null || value === undefined || value === false) {
21
+ return "";
22
+ }
23
+ if (typeof value === "string" || typeof value === "number") {
24
+ return String(value).trim();
25
+ }
26
+ if (Array.isArray(value)) {
27
+ return value.map((item) => normalizeClass(item)).filter(Boolean).join(" ");
28
+ }
29
+ if (typeof value === "object") {
30
+ return Object.entries(value)
31
+ .filter(([, enabled]) => isClassEnabled(enabled))
32
+ .map(([name]) => name)
33
+ .join(" ");
34
+ }
35
+ return "";
36
+ }
37
+ function isClassEnabled(value) {
38
+ if (isRefLike(value)) {
39
+ return Boolean(value.value);
40
+ }
41
+ return Boolean(value);
42
+ }
43
+ function isRefLike(value) {
44
+ return typeof value === "object" && value !== null && "value" in value;
45
+ }
46
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/runtime/dom.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,IAAY,EAAE,KAAc;IACzE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAC7D,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,KAAmB,CAAC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,cAAc,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAC7D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;aACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,CAAC;AACzE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { normalizeClass, setAttribute } from "./dom.js";
2
+ export type { ClassValue } from "./dom.js";
3
+ export { computed, effect, ref, unwrap } from "./reactivity.js";
4
+ export type { ComputedRef, EffectFn, Ref } from "./reactivity.js";
5
+ export { nextTick, watch, onMounted, onBeforeUnmount, onUnmounted, provide, inject } from "./lifecycle.js";
6
+ export type { WatchSource } from "./lifecycle.js";
@@ -0,0 +1,4 @@
1
+ export { normalizeClass, setAttribute } from "./dom.js";
2
+ export { computed, effect, ref, unwrap } from "./reactivity.js";
3
+ export { nextTick, watch, onMounted, onBeforeUnmount, onUnmounted, provide, inject } from "./lifecycle.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type WatchSource<T = unknown> = (() => T) | {
2
+ value: T;
3
+ } | T;
4
+ export declare function nextTick(fn?: () => void): Promise<void>;
5
+ export declare function watch<T = unknown>(source: WatchSource<T> | WatchSource<T>[], cb: (newV: T | unknown, oldV: T | unknown) => void): () => void;
6
+ export declare function onMounted(fn: () => void): void;
7
+ export declare function onBeforeUnmount(fn: () => void): void;
8
+ export declare function onUnmounted(fn: () => void): void;
9
+ export declare function provide<T = unknown>(key: any, value: T): void;
10
+ export declare function inject<T = unknown>(key: any, fallback?: T): T | undefined;
@@ -0,0 +1,79 @@
1
+ import { effect } from "./reactivity.js";
2
+ export function nextTick(fn) {
3
+ const p = Promise.resolve().then(() => {
4
+ try {
5
+ fn?.();
6
+ }
7
+ catch (e) {
8
+ setTimeout(() => { throw e; });
9
+ }
10
+ });
11
+ return p;
12
+ }
13
+ function isRefLike(value) {
14
+ return typeof value === "object" && value !== null && "value" in value;
15
+ }
16
+ export function watch(source, cb) {
17
+ const sources = Array.isArray(source) ? source : [source];
18
+ let oldVals = sources.map((s) => (isRefLike(s) ? s.value : typeof s === "function" ? s() : s));
19
+ let stopped = false;
20
+ const stopEffect = effect(() => {
21
+ if (stopped)
22
+ return;
23
+ const nextVals = sources.map((s) => (isRefLike(s) ? s.value : typeof s === "function" ? s() : s));
24
+ let changed = false;
25
+ for (let i = 0; i < nextVals.length; i++) {
26
+ if (!Object.is(nextVals[i], oldVals[i])) {
27
+ changed = true;
28
+ break;
29
+ }
30
+ }
31
+ if (changed) {
32
+ const prev = oldVals.length === 1 ? oldVals[0] : oldVals.slice();
33
+ const curr = nextVals.length === 1 ? nextVals[0] : nextVals.slice();
34
+ oldVals = nextVals;
35
+ try {
36
+ cb(curr, prev);
37
+ }
38
+ catch (e) {
39
+ setTimeout(() => { throw e; });
40
+ }
41
+ }
42
+ });
43
+ return () => {
44
+ stopped = true;
45
+ stopEffect();
46
+ };
47
+ }
48
+ export function onMounted(fn) {
49
+ const reg = globalThis.__mikuru_currentRegistrar;
50
+ if (reg && typeof reg.registerMounted === "function") {
51
+ reg.registerMounted(fn);
52
+ }
53
+ else {
54
+ // best-effort: call on nextTick if not in a mount context
55
+ nextTick(fn);
56
+ }
57
+ }
58
+ export function onBeforeUnmount(fn) {
59
+ const reg = globalThis.__mikuru_currentRegistrar;
60
+ if (reg && typeof reg.registerBeforeUnmount === "function") {
61
+ reg.registerBeforeUnmount(fn);
62
+ }
63
+ }
64
+ export function onUnmounted(fn) {
65
+ const reg = globalThis.__mikuru_currentRegistrar;
66
+ if (reg && typeof reg.registerUnmounted === "function") {
67
+ reg.registerUnmounted(fn);
68
+ }
69
+ }
70
+ const __mikuru_provide_map = new Map();
71
+ export function provide(key, value) {
72
+ __mikuru_provide_map.set(key, value);
73
+ }
74
+ export function inject(key, fallback) {
75
+ if (__mikuru_provide_map.has(key))
76
+ return __mikuru_provide_map.get(key);
77
+ return fallback;
78
+ }
79
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/runtime/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type EffectFn = () => void;
2
+ export type Ref<T> = {
3
+ value: T;
4
+ };
5
+ export type ComputedRef<T> = {
6
+ readonly value: T;
7
+ };
8
+ export declare function ref<T>(initialValue: T): Ref<T>;
9
+ export declare function computed<T>(getter: () => T): ComputedRef<T>;
10
+ export declare function effect(fn: EffectFn): () => void;
11
+ export declare function unwrap<T>(value: T | Ref<T> | ComputedRef<T>): T;