@meekojs/meeko 0.0.3 → 0.1.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 (188) hide show
  1. package/README.md +35 -16
  2. package/dist/autoimports-ts.d.ts +26 -0
  3. package/dist/autoimports-ts.js +183 -0
  4. package/dist/autoimports-ts.js.map +1 -0
  5. package/dist/autoimports.d.ts +21 -0
  6. package/dist/autoimports.js +301 -0
  7. package/dist/autoimports.js.map +1 -0
  8. package/dist/check.js +74 -33
  9. package/dist/check.js.map +1 -0
  10. package/dist/cli.js +67 -5
  11. package/dist/cli.js.map +1 -0
  12. package/dist/compiler/events.d.ts +2 -0
  13. package/dist/compiler/events.js +6 -0
  14. package/dist/compiler/events.js.map +1 -0
  15. package/dist/compiler/import-graph.d.ts +8 -0
  16. package/dist/compiler/import-graph.js +33 -0
  17. package/dist/compiler/import-graph.js.map +1 -0
  18. package/dist/compiler/mapping.js +1 -0
  19. package/dist/compiler/mapping.js.map +1 -0
  20. package/dist/compiler/project-root.d.ts +2 -0
  21. package/dist/compiler/project-root.js +18 -0
  22. package/dist/compiler/project-root.js.map +1 -0
  23. package/dist/compiler/props.d.ts +12 -0
  24. package/dist/compiler/props.js +32 -0
  25. package/dist/compiler/props.js.map +1 -0
  26. package/dist/compiler/sfc.js +1 -0
  27. package/dist/compiler/sfc.js.map +1 -0
  28. package/dist/compiler/sourcemap.d.ts +3 -0
  29. package/dist/compiler/sourcemap.js +75 -0
  30. package/dist/compiler/sourcemap.js.map +1 -0
  31. package/dist/compiler/template.js +1 -0
  32. package/dist/compiler/template.js.map +1 -0
  33. package/dist/compiler.js +66 -17
  34. package/dist/compiler.js.map +1 -0
  35. package/dist/component-errors.d.ts +18 -0
  36. package/dist/component-errors.js +65 -0
  37. package/dist/component-errors.js.map +1 -0
  38. package/dist/devtools-ui/index.js +1 -0
  39. package/dist/devtools-ui/index.js.map +1 -0
  40. package/dist/devtools.js +3 -4
  41. package/dist/devtools.js.map +1 -0
  42. package/dist/dom.d.ts +18 -5
  43. package/dist/dom.js +295 -90
  44. package/dist/dom.js.map +1 -0
  45. package/dist/error-observer.d.ts +6 -0
  46. package/dist/error-observer.js +41 -0
  47. package/dist/error-observer.js.map +1 -0
  48. package/dist/framework/check-app.d.ts +5 -0
  49. package/dist/framework/check-app.js +214 -0
  50. package/dist/framework/check-app.js.map +1 -0
  51. package/dist/framework/check-project.d.ts +4 -0
  52. package/dist/framework/check-project.js +42 -0
  53. package/dist/framework/check-project.js.map +1 -0
  54. package/dist/framework/client.d.ts +48 -0
  55. package/dist/framework/client.js +249 -0
  56. package/dist/framework/client.js.map +1 -0
  57. package/dist/framework/clients.d.ts +82 -0
  58. package/dist/framework/clients.js +190 -0
  59. package/dist/framework/clients.js.map +1 -0
  60. package/dist/framework/config-type.d.ts +10 -0
  61. package/dist/framework/config-type.js +4 -0
  62. package/dist/framework/config-type.js.map +1 -0
  63. package/dist/framework/config.d.ts +15 -0
  64. package/dist/framework/config.js +138 -0
  65. package/dist/framework/config.js.map +1 -0
  66. package/dist/framework/contracts-generate.d.ts +8 -0
  67. package/dist/framework/contracts-generate.js +290 -0
  68. package/dist/framework/contracts-generate.js.map +1 -0
  69. package/dist/framework/generate.d.ts +7 -0
  70. package/dist/framework/generate.js +67 -0
  71. package/dist/framework/generate.js.map +1 -0
  72. package/dist/framework/init.d.ts +2 -0
  73. package/dist/framework/init.js +183 -0
  74. package/dist/framework/init.js.map +1 -0
  75. package/dist/framework/middleware.d.ts +14 -0
  76. package/dist/framework/middleware.js +16 -0
  77. package/dist/framework/middleware.js.map +1 -0
  78. package/dist/framework/modules.d.ts +22 -0
  79. package/dist/framework/modules.js +29 -0
  80. package/dist/framework/modules.js.map +1 -0
  81. package/dist/framework/page-contracts-check.d.ts +8 -0
  82. package/dist/framework/page-contracts-check.js +110 -0
  83. package/dist/framework/page-contracts-check.js.map +1 -0
  84. package/dist/framework/page-contracts-generate.d.ts +2 -0
  85. package/dist/framework/page-contracts-generate.js +94 -0
  86. package/dist/framework/page-contracts-generate.js.map +1 -0
  87. package/dist/framework/page.d.ts +64 -0
  88. package/dist/framework/page.js +44 -0
  89. package/dist/framework/page.js.map +1 -0
  90. package/dist/framework/prerender.d.ts +14 -0
  91. package/dist/framework/prerender.js +110 -0
  92. package/dist/framework/prerender.js.map +1 -0
  93. package/dist/framework/project-templates.d.ts +3 -0
  94. package/dist/framework/project-templates.js +119 -0
  95. package/dist/framework/project-templates.js.map +1 -0
  96. package/dist/framework/project.d.ts +9 -0
  97. package/dist/framework/project.js +272 -0
  98. package/dist/framework/project.js.map +1 -0
  99. package/dist/framework/router.d.ts +41 -0
  100. package/dist/framework/router.js +259 -0
  101. package/dist/framework/router.js.map +1 -0
  102. package/dist/framework/server.d.ts +65 -0
  103. package/dist/framework/server.js +239 -0
  104. package/dist/framework/server.js.map +1 -0
  105. package/dist/framework/socket-contracts-generate.d.ts +5 -0
  106. package/dist/framework/socket-contracts-generate.js +162 -0
  107. package/dist/framework/socket-contracts-generate.js.map +1 -0
  108. package/dist/framework/socket.d.ts +72 -0
  109. package/dist/framework/socket.js +252 -0
  110. package/dist/framework/socket.js.map +1 -0
  111. package/dist/framework/standard-schema-types.d.ts +7 -0
  112. package/dist/framework/standard-schema-types.js +69 -0
  113. package/dist/framework/standard-schema-types.js.map +1 -0
  114. package/dist/framework/state.d.ts +22 -0
  115. package/dist/framework/state.js +136 -0
  116. package/dist/framework/state.js.map +1 -0
  117. package/dist/framework/styles.d.ts +2 -0
  118. package/dist/framework/styles.js +6 -0
  119. package/dist/framework/styles.js.map +1 -0
  120. package/dist/framework/type-declarations.d.ts +5 -0
  121. package/dist/framework/type-declarations.js +84 -0
  122. package/dist/framework/type-declarations.js.map +1 -0
  123. package/dist/framework-server/auto-clients.d.ts +3 -0
  124. package/dist/framework-server/auto-clients.js +27 -0
  125. package/dist/framework-server/auto-clients.js.map +1 -0
  126. package/dist/framework-server/context.d.ts +21 -0
  127. package/dist/framework-server/context.js +22 -0
  128. package/dist/framework-server/context.js.map +1 -0
  129. package/dist/framework-server/contracts.d.ts +73 -0
  130. package/dist/framework-server/contracts.js +184 -0
  131. package/dist/framework-server/contracts.js.map +1 -0
  132. package/dist/framework-server/discovery.d.ts +43 -0
  133. package/dist/framework-server/discovery.js +257 -0
  134. package/dist/framework-server/discovery.js.map +1 -0
  135. package/dist/framework-server/local.d.ts +21 -0
  136. package/dist/framework-server/local.js +100 -0
  137. package/dist/framework-server/local.js.map +1 -0
  138. package/dist/framework-server/middleware.d.ts +4 -0
  139. package/dist/framework-server/middleware.js +56 -0
  140. package/dist/framework-server/middleware.js.map +1 -0
  141. package/dist/framework-server/node-upgrade.d.ts +23 -0
  142. package/dist/framework-server/node-upgrade.js +96 -0
  143. package/dist/framework-server/node-upgrade.js.map +1 -0
  144. package/dist/framework-server/node-websocket.d.ts +16 -0
  145. package/dist/framework-server/node-websocket.js +127 -0
  146. package/dist/framework-server/node-websocket.js.map +1 -0
  147. package/dist/framework-server/openapi.d.ts +17 -0
  148. package/dist/framework-server/openapi.js +118 -0
  149. package/dist/framework-server/openapi.js.map +1 -0
  150. package/dist/framework-server/session-stores.d.ts +73 -0
  151. package/dist/framework-server/session-stores.js +122 -0
  152. package/dist/framework-server/session-stores.js.map +1 -0
  153. package/dist/framework-server/sessions.d.ts +70 -0
  154. package/dist/framework-server/sessions.js +167 -0
  155. package/dist/framework-server/sessions.js.map +1 -0
  156. package/dist/framework-server/socket.d.ts +83 -0
  157. package/dist/framework-server/socket.js +196 -0
  158. package/dist/framework-server/socket.js.map +1 -0
  159. package/dist/framework-server.d.ts +23 -0
  160. package/dist/framework-server.js +13 -0
  161. package/dist/framework-server.js.map +1 -0
  162. package/dist/framework.d.ts +31 -0
  163. package/dist/framework.js +14 -0
  164. package/dist/framework.js.map +1 -0
  165. package/dist/hmr.js +75 -24
  166. package/dist/hmr.js.map +1 -0
  167. package/dist/index.d.ts +5 -3
  168. package/dist/index.js +3 -1
  169. package/dist/index.js.map +1 -0
  170. package/dist/init.js +31 -3
  171. package/dist/init.js.map +1 -0
  172. package/dist/internal.d.ts +2 -2
  173. package/dist/internal.js +3 -2
  174. package/dist/internal.js.map +1 -0
  175. package/dist/node.d.ts +16 -0
  176. package/dist/node.js +122 -0
  177. package/dist/node.js.map +1 -0
  178. package/dist/reactivity.d.ts +22 -1
  179. package/dist/reactivity.js +132 -18
  180. package/dist/reactivity.js.map +1 -0
  181. package/dist/server.js +1 -0
  182. package/dist/server.js.map +1 -0
  183. package/dist/types.d.ts +2 -0
  184. package/dist/types.js +26 -9
  185. package/dist/types.js.map +1 -0
  186. package/dist/vite.js +112 -7
  187. package/dist/vite.js.map +1 -0
  188. package/package.json +15 -4
package/dist/cli.js CHANGED
@@ -1,25 +1,86 @@
1
1
  #!/usr/bin/env node
2
- import { readFile, writeFile } from "node:fs/promises";
2
+ import { readFile, stat, writeFile } from "node:fs/promises";
3
3
  import { existsSync } from "node:fs";
4
4
  import { join, resolve } from "node:path";
5
5
  import { checkSource } from "./check.js";
6
6
  import { compile } from "./compiler.js";
7
7
  import { generateTypes } from "./types.js";
8
8
  import { initProject } from "./init.js";
9
+ import { initFrameworkProject } from "./framework/init.js";
10
+ import { generateRoutes } from "./framework/generate.js";
11
+ import { generateServerContracts } from "./framework/contracts-generate.js";
12
+ import { checkApp, generateAppTypes } from "./framework/check-app.js";
13
+ import { prerenderProject } from "./framework/prerender.js";
14
+ import { generateTypeScriptAutoImports } from "./autoimports-ts.js";
15
+ import { buildProject, startProject } from "./framework/project.js";
16
+ import { checkFrameworkProject, prepareFrameworkTypes } from "./framework/check-project.js";
9
17
  const [command, input, output] = process.argv.slice(2);
10
- if ((command !== "compile" && command !== "check" && command !== "types" && command !== "init") || !input || (command === "compile" && !output) || (command === "check" && output !== undefined && output !== "--json") || ((command === "types" || command === "init") && output !== undefined)) {
11
- process.stderr.write("Usage: meeko check <component.meeko> [--json]\n meeko compile <component.meeko> <output.ts>\n meeko types <component.meeko>\n meeko init <directory>\n");
18
+ const projectCommand = command === "dev" || command === "build" || command === "start";
19
+ const legacyCommand = command === "compile" || command === "check-app" || command === "types" || command === "init" || command === "init-framework" || command === "routes" || command === "prerender";
20
+ if ((!projectCommand && !legacyCommand && command !== "check") || (!projectCommand && command !== "check" && !input) || (command === "compile" && !output) || (command === "check" && output !== undefined && output !== "--json") || (command !== "compile" && command !== "check" && output !== undefined)) {
21
+ process.stderr.write("Usage: meeko dev [project-directory]\n meeko check [project-directory | component.meeko] [--json]\n meeko build [project-directory]\n meeko start [project-directory]\n meeko check-app <project-directory>\n meeko compile <component.meeko> <output.ts>\n meeko types <component.meeko>\n meeko routes <project-directory>\n meeko prerender <project-directory>\n meeko init <directory>\n meeko init-framework <directory>\n");
12
22
  process.exitCode = 1;
13
23
  }
14
24
  else {
15
25
  try {
16
- if (command === "init") {
17
- const target = await initProject(input);
26
+ if (projectCommand) {
27
+ const root = input ?? ".";
28
+ if (command === "dev") {
29
+ await prepareFrameworkTypes(root);
30
+ await startProject(root, false);
31
+ }
32
+ else if (command === "start")
33
+ await startProject(root, true);
34
+ else {
35
+ await checkFrameworkProject(root);
36
+ await buildProject(root);
37
+ }
38
+ }
39
+ else if (command === "check" && (!input || (await stat(input).catch(() => undefined))?.isDirectory())) {
40
+ if (output)
41
+ throw new Error("--json is available only for a .meeko component");
42
+ await checkFrameworkProject(input ?? ".");
43
+ process.stdout.write(`${resolve(input ?? ".")}: OK\n`);
44
+ }
45
+ else if (command === "init" || command === "init-framework") {
46
+ if (!input)
47
+ throw new Error("Missing destination directory");
48
+ const target = command === "init" ? await initProject(input) : await initFrameworkProject(input);
18
49
  const manager = existsSync(join(target, "pnpm-lock.yaml")) ? "pnpm" : "npm";
19
50
  const prefix = target === resolve(".") ? "" : `cd ${target} && `;
20
51
  process.stdout.write(`Created ${target}\nNext: ${prefix}${manager} install && ${manager} run dev\n`);
21
52
  }
53
+ else if (command === "routes") {
54
+ if (!input)
55
+ throw new Error("Missing project directory");
56
+ const generated = await generateRoutes(input);
57
+ const server = await generateServerContracts(input);
58
+ const components = await generateAppTypes(input);
59
+ const imports = await generateTypeScriptAutoImports(input);
60
+ process.stdout.write(`${generated.types}\n${generated.manifest}\n${server.types}\n${server.manifest}\n${components.map((file) => `${file}\n`).join("")}${imports.client}\n${imports.server}\n${imports.shared}\n`);
61
+ }
62
+ else if (command === "prerender") {
63
+ if (!input)
64
+ throw new Error("Missing project directory");
65
+ for (const file of await prerenderProject(input))
66
+ process.stdout.write(`${file}\n`);
67
+ }
68
+ else if (command === "check-app") {
69
+ if (!input)
70
+ throw new Error("Missing project directory");
71
+ const diagnostics = await checkApp(input);
72
+ for (const diagnostic of diagnostics) {
73
+ const { line, column } = diagnostic.location;
74
+ process.stderr.write(`${diagnostic.filename}:${line}:${column} ${diagnostic.code}: ${diagnostic.message}\n`);
75
+ }
76
+ if (diagnostics.length > 0)
77
+ process.exitCode = 1;
78
+ else
79
+ process.stdout.write(`${input}: OK\n`);
80
+ }
22
81
  else {
82
+ if (!input)
83
+ throw new Error("Missing component path");
23
84
  const source = await readFile(input, "utf8");
24
85
  const diagnostics = await checkSource(source, input);
25
86
  if (command === "check" && output === "--json") {
@@ -52,3 +113,4 @@ else {
52
113
  process.exitCode = 1;
53
114
  }
54
115
  }
116
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { checkSource } from \"./check.js\";\nimport { compile } from \"./compiler.js\";\nimport { generateTypes } from \"./types.js\";\nimport { initProject } from \"./init.js\";\nimport { initFrameworkProject } from \"./framework/init.js\";\nimport { generateRoutes } from \"./framework/generate.js\";\nimport { generateServerContracts } from \"./framework/contracts-generate.js\";\nimport { checkApp, generateAppTypes } from \"./framework/check-app.js\";\nimport { prerenderProject } from \"./framework/prerender.js\";\nimport { generateTypeScriptAutoImports } from \"./autoimports-ts.js\";\nimport { buildProject, startProject } from \"./framework/project.js\";\nimport { checkFrameworkProject, prepareFrameworkTypes } from \"./framework/check-project.js\";\n\nconst [command, input, output] = process.argv.slice(2);\nconst projectCommand = command === \"dev\" || command === \"build\" || command === \"start\";\nconst legacyCommand = command === \"compile\" || command === \"check-app\" || command === \"types\" || command === \"init\" || command === \"init-framework\" || command === \"routes\" || command === \"prerender\";\nif ((!projectCommand && !legacyCommand && command !== \"check\") || (!projectCommand && command !== \"check\" && !input) || (command === \"compile\" && !output) || (command === \"check\" && output !== undefined && output !== \"--json\") || (command !== \"compile\" && command !== \"check\" && output !== undefined)) {\n process.stderr.write(\"Usage: meeko dev [project-directory]\\n meeko check [project-directory | component.meeko] [--json]\\n meeko build [project-directory]\\n meeko start [project-directory]\\n meeko check-app <project-directory>\\n meeko compile <component.meeko> <output.ts>\\n meeko types <component.meeko>\\n meeko routes <project-directory>\\n meeko prerender <project-directory>\\n meeko init <directory>\\n meeko init-framework <directory>\\n\");\n process.exitCode = 1;\n} else {\n try {\n if (projectCommand) {\n const root = input ?? \".\";\n if (command === \"dev\") {\n await prepareFrameworkTypes(root);\n await startProject(root, false);\n }\n else if (command === \"start\") await startProject(root, true);\n else {\n await checkFrameworkProject(root);\n await buildProject(root);\n }\n } else if (command === \"check\" && (!input || (await stat(input).catch(() => undefined))?.isDirectory())) {\n if (output) throw new Error(\"--json is available only for a .meeko component\");\n await checkFrameworkProject(input ?? \".\");\n process.stdout.write(`${resolve(input ?? \".\")}: OK\\n`);\n } else if (command === \"init\" || command === \"init-framework\") {\n if (!input) throw new Error(\"Missing destination directory\");\n const target = command === \"init\" ? await initProject(input) : await initFrameworkProject(input);\n const manager = existsSync(join(target, \"pnpm-lock.yaml\")) ? \"pnpm\" : \"npm\";\n const prefix = target === resolve(\".\") ? \"\" : `cd ${target} && `;\n process.stdout.write(`Created ${target}\\nNext: ${prefix}${manager} install && ${manager} run dev\\n`);\n } else if (command === \"routes\") {\n if (!input) throw new Error(\"Missing project directory\");\n const generated = await generateRoutes(input);\n const server = await generateServerContracts(input);\n const components = await generateAppTypes(input);\n const imports = await generateTypeScriptAutoImports(input);\n process.stdout.write(`${generated.types}\\n${generated.manifest}\\n${server.types}\\n${server.manifest}\\n${components.map((file) => `${file}\\n`).join(\"\")}${imports.client}\\n${imports.server}\\n${imports.shared}\\n`);\n } else if (command === \"prerender\") {\n if (!input) throw new Error(\"Missing project directory\");\n for (const file of await prerenderProject(input)) process.stdout.write(`${file}\\n`);\n } else if (command === \"check-app\") {\n if (!input) throw new Error(\"Missing project directory\");\n const diagnostics = await checkApp(input);\n for (const diagnostic of diagnostics) {\n const { line, column } = diagnostic.location;\n process.stderr.write(`${diagnostic.filename}:${line}:${column} ${diagnostic.code}: ${diagnostic.message}\\n`);\n }\n if (diagnostics.length > 0) process.exitCode = 1;\n else process.stdout.write(`${input}: OK\\n`);\n } else {\n if (!input) throw new Error(\"Missing component path\");\n const source = await readFile(input, \"utf8\");\n const diagnostics = await checkSource(source, input);\n if (command === \"check\" && output === \"--json\") {\n process.stdout.write(`${JSON.stringify(diagnostics)}\\n`);\n } else if (diagnostics.length > 0) {\n for (const diagnostic of diagnostics) {\n const { line, column } = diagnostic.location;\n process.stderr.write(`${diagnostic.filename}:${line}:${column} ${diagnostic.code}: ${diagnostic.message}\\n`);\n }\n } else if (command === \"compile\") {\n const result = compile(source, input);\n await writeFile(output!, result.code, \"utf8\");\n process.stdout.write(`${output}\\n`);\n } else if (command === \"types\") {\n for (const generated of await generateTypes(source, input)) process.stdout.write(`${generated}\\n`);\n } else {\n process.stdout.write(`${input}: OK\\n`);\n }\n if (diagnostics.length > 0) process.exitCode = 1;\n }\n } catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ /** Keeps CLI and editor callback contracts aligned for template events. */
2
+ export declare function templateEventType(name: string): string;
@@ -0,0 +1,6 @@
1
+ const typedEvents = new Set(["click", "input", "change", "submit", "keydown", "keyup", "focus", "blur"]);
2
+ /** Keeps CLI and editor callback contracts aligned for template events. */
3
+ export function templateEventType(name) {
4
+ return typedEvents.has(name) ? `GlobalEventHandlersEventMap[${JSON.stringify(name)}]` : "Event";
5
+ }
6
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/compiler/events.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzG,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAClG,CAAC","sourcesContent":["const typedEvents = new Set([\"click\", \"input\", \"change\", \"submit\", \"keydown\", \"keyup\", \"focus\", \"blur\"]);\n\n/** Keeps CLI and editor callback contracts aligned for template events. */\nexport function templateEventType(name: string): string {\n return typedEvents.has(name) ? `GlobalEventHandlersEventMap[${JSON.stringify(name)}]` : \"Event\";\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export interface ModuleSpecifier {
2
+ value: string;
3
+ start: number;
4
+ end: number;
5
+ }
6
+ /** Read static ESM edges from TypeScript instead of matching source text. */
7
+ export declare function moduleSpecifiers(code: string, filename: string): ModuleSpecifier[];
8
+ export declare function replaceModuleSpecifiers(code: string, filename: string, convert: (specifier: ModuleSpecifier) => string): string;
@@ -0,0 +1,33 @@
1
+ import ts from "@typescript/typescript6";
2
+ /** Read static ESM edges from TypeScript instead of matching source text. */
3
+ export function moduleSpecifiers(code, filename) {
4
+ const file = ts.createSourceFile(filename, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
5
+ const result = [];
6
+ for (const statement of file.statements) {
7
+ if (!ts.isImportDeclaration(statement) && !ts.isExportDeclaration(statement))
8
+ continue;
9
+ const literal = statement.moduleSpecifier;
10
+ if (!literal || !ts.isStringLiteral(literal))
11
+ continue;
12
+ result.push({ value: literal.text, start: literal.getStart(file) + 1, end: literal.getEnd() - 1 });
13
+ }
14
+ const visit = (node) => {
15
+ if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword && node.arguments.length === 1 && ts.isStringLiteral(node.arguments[0])) {
16
+ const literal = node.arguments[0];
17
+ result.push({ value: literal.text, start: literal.getStart(file) + 1, end: literal.getEnd() - 1 });
18
+ }
19
+ ts.forEachChild(node, visit);
20
+ };
21
+ visit(file);
22
+ result.sort((a, b) => a.start - b.start);
23
+ return result;
24
+ }
25
+ export function replaceModuleSpecifiers(code, filename, convert) {
26
+ let output = code;
27
+ for (const specifier of moduleSpecifiers(code, filename).reverse()) {
28
+ const replacement = convert(specifier);
29
+ output = output.slice(0, specifier.start) + replacement + output.slice(specifier.end);
30
+ }
31
+ return output;
32
+ }
33
+ //# sourceMappingURL=import-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-graph.js","sourceRoot":"","sources":["../../src/compiler/import-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAQzC,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAgB;IAC7D,MAAM,IAAI,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAAE,SAAS;QACvF,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC;QAC1C,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;YAAE,SAAS;QACvD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACpC,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC/J,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,QAAgB,EAAE,OAA+C;IACrH,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACnE,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import ts from \"@typescript/typescript6\";\n\nexport interface ModuleSpecifier {\n value: string;\n start: number;\n end: number;\n}\n\n/** Read static ESM edges from TypeScript instead of matching source text. */\nexport function moduleSpecifiers(code: string, filename: string): ModuleSpecifier[] {\n const file = ts.createSourceFile(filename, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);\n const result: ModuleSpecifier[] = [];\n for (const statement of file.statements) {\n if (!ts.isImportDeclaration(statement) && !ts.isExportDeclaration(statement)) continue;\n const literal = statement.moduleSpecifier;\n if (!literal || !ts.isStringLiteral(literal)) continue;\n result.push({ value: literal.text, start: literal.getStart(file) + 1, end: literal.getEnd() - 1 });\n }\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword && node.arguments.length === 1 && ts.isStringLiteral(node.arguments[0]!)) {\n const literal = node.arguments[0];\n result.push({ value: literal.text, start: literal.getStart(file) + 1, end: literal.getEnd() - 1 });\n }\n ts.forEachChild(node, visit);\n };\n visit(file);\n result.sort((a, b) => a.start - b.start);\n return result;\n}\n\nexport function replaceModuleSpecifiers(code: string, filename: string, convert: (specifier: ModuleSpecifier) => string): string {\n let output = code;\n for (const specifier of moduleSpecifiers(code, filename).reverse()) {\n const replacement = convert(specifier);\n output = output.slice(0, specifier.start) + replacement + output.slice(specifier.end);\n }\n return output;\n}\n"]}
@@ -46,3 +46,4 @@ export function originalOffset(mappings, generatedOffset) {
46
46
  return span.originalStart + Math.min(generatedOffset - span.generatedStart, Math.max(0, span.originalLength - 1));
47
47
  }
48
48
  import { randomUUID } from "node:crypto";
49
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/compiler/mapping.ts"],"names":[],"mappings":"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","sourcesContent":["/** Segmento que relaciona una porción del módulo generado con el archivo .meeko. */\nexport interface SourceMapping {\n generatedStart: number;\n generatedEnd: number;\n originalStart: number;\n originalLength: number;\n}\n\nconst markerToken = randomUUID().replaceAll(\"-\", \"\");\nconst marker = new RegExp(`/\\\\*__MEEK_SOURCE_${markerToken}_(START|END):(\\\\d+):(\\\\d+)__\\\\*/`, \"g\");\n\n/** Marca código conservando la ubicación de su expresión o declaración original. */\nexport function markSource(code: string, originalStart: number, originalLength = code.length): string {\n return `/*__MEEK_SOURCE_${markerToken}_START:${originalStart}:${originalLength}__*/${code}/*__MEEK_SOURCE_${markerToken}_END:${originalStart}:${originalLength}__*/`;\n}\n\n/** Retira marcas internas y produce el mapa de segmentos del módulo emitido. */\nexport function extractSourceMappings(markedCode: string): { code: string; mappings: SourceMapping[] } {\n const mappings: SourceMapping[] = [];\n const open: Array<{ generatedStart: number; originalStart: number; originalLength: number }> = [];\n const parts: string[] = [];\n let generatedOffset = 0;\n let cursor = 0;\n for (const match of markedCode.matchAll(marker)) {\n const index = match.index;\n const chunk = markedCode.slice(cursor, index);\n parts.push(chunk);\n generatedOffset += chunk.length;\n const originalStart = Number(match[2]);\n const originalLength = Number(match[3]);\n if (match[1] === \"START\") {\n open.push({ generatedStart: generatedOffset, originalStart, originalLength });\n } else {\n const span = open.pop();\n if (!span || span.originalStart !== originalStart || span.originalLength !== originalLength) {\n throw new Error(\"Invalid Meeko source mapping markers\");\n }\n mappings.push({ ...span, generatedEnd: generatedOffset });\n }\n cursor = index + match[0].length;\n }\n const tail = markedCode.slice(cursor);\n parts.push(tail);\n if (open.length !== 0) throw new Error(\"Unclosed Meeko source mapping marker\");\n return { code: parts.join(\"\"), mappings: mappings.sort((a, b) => a.generatedStart - b.generatedStart) };\n}\n\n/** Convierte un desplazamiento generado en uno del archivo .meeko si existe origen preciso. */\nexport function originalOffset(mappings: readonly SourceMapping[], generatedOffset: number): number | undefined {\n const span = mappings\n .filter((entry) => generatedOffset >= entry.generatedStart && generatedOffset < entry.generatedEnd)\n .sort((a, b) => (a.generatedEnd - a.generatedStart) - (b.generatedEnd - b.generatedStart))[0];\n if (!span) return undefined;\n return span.originalStart + Math.min(generatedOffset - span.generatedStart, Math.max(0, span.originalLength - 1));\n}\nimport { randomUUID } from \"node:crypto\";\n"]}
@@ -0,0 +1,2 @@
1
+ /** The package owns generated Meeko artifacts; a standalone TS project is a fallback. */
2
+ export declare function projectRoot(filename: string): string;
@@ -0,0 +1,18 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, parse, resolve } from "node:path";
3
+ /** The package owns generated Meeko artifacts; a standalone TS project is a fallback. */
4
+ export function projectRoot(filename) {
5
+ let directory = dirname(resolve(filename));
6
+ let tsProject;
7
+ for (;;) {
8
+ if (existsSync(resolve(directory, "package.json")))
9
+ return directory;
10
+ if (!tsProject && existsSync(resolve(directory, "tsconfig.json")))
11
+ tsProject = directory;
12
+ const parent = dirname(directory);
13
+ if (parent === directory || directory === parse(directory).root)
14
+ return tsProject ?? dirname(resolve(filename));
15
+ directory = parent;
16
+ }
17
+ }
18
+ //# sourceMappingURL=project-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/compiler/project-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,yFAAyF;AACzF,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,IAAI,SAA6B,CAAC;IAClC,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACrE,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAAE,SAAS,GAAG,SAAS,CAAC;QACzF,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI;YAAE,OAAO,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChH,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;AACH,CAAC","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, parse, resolve } from \"node:path\";\n\n/** The package owns generated Meeko artifacts; a standalone TS project is a fallback. */\nexport function projectRoot(filename: string): string {\n let directory = dirname(resolve(filename));\n let tsProject: string | undefined;\n for (;;) {\n if (existsSync(resolve(directory, \"package.json\"))) return directory;\n if (!tsProject && existsSync(resolve(directory, \"tsconfig.json\"))) tsProject = directory;\n const parent = dirname(directory);\n if (parent === directory || directory === parse(directory).root) return tsProject ?? dirname(resolve(filename));\n directory = parent;\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import ts from "@typescript/typescript6";
2
+ /** AST analysis shared by the compiler and the editor for defineProps defaults. */
3
+ export interface PropsDefaults {
4
+ readonly argument: ts.ObjectLiteralExpression;
5
+ readonly keys: readonly string[];
6
+ }
7
+ export declare class PropsDefaultsError extends Error {
8
+ readonly code: string;
9
+ readonly node: ts.Node;
10
+ constructor(code: string, message: string, node: ts.Node);
11
+ }
12
+ export declare function analyzePropsDefaults(call: ts.CallExpression): PropsDefaults | undefined;
@@ -0,0 +1,32 @@
1
+ import ts from "@typescript/typescript6";
2
+ export class PropsDefaultsError extends Error {
3
+ code;
4
+ node;
5
+ constructor(code, message, node) {
6
+ super(message);
7
+ this.code = code;
8
+ this.node = node;
9
+ }
10
+ }
11
+ export function analyzePropsDefaults(call) {
12
+ if (call.arguments.length === 0)
13
+ return undefined;
14
+ if (call.arguments.length !== 1 || !ts.isObjectLiteralExpression(call.arguments[0])) {
15
+ throw new PropsDefaultsError("MEEK040", "defineProps defaults require one object literal", call.arguments[0] ?? call);
16
+ }
17
+ const argument = call.arguments[0];
18
+ const keys = [];
19
+ for (const property of argument.properties) {
20
+ if (!ts.isPropertyAssignment(property) ||
21
+ !(ts.isIdentifier(property.name) || ts.isStringLiteral(property.name))) {
22
+ throw new PropsDefaultsError("MEEK041", "defineProps defaults require named properties", property);
23
+ }
24
+ const key = property.name.text;
25
+ if (key === "__proto__" || keys.includes(key)) {
26
+ throw new PropsDefaultsError("MEEK042", `Duplicate or unsafe default prop: ${key}`, property.name);
27
+ }
28
+ keys.push(key);
29
+ }
30
+ return { argument, keys };
31
+ }
32
+ //# sourceMappingURL=props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.js","sourceRoot":"","sources":["../../src/compiler/props.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAQzC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACtB,IAAI;IAAoC,IAAI;IAAjE,YAAqB,IAAY,EAAE,OAAe,EAAW,IAAa;QACxE,KAAK,CAAC,OAAO,CAAC,CAAC;oBADI,IAAI;oBAAoC,IAAI;IAEjE,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,iDAAiD,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACxH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC;YACpC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,+CAA+C,EAAE,QAAQ,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,IAAI,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,qCAAqC,GAAG,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC","sourcesContent":["import ts from \"@typescript/typescript6\";\n\n/** AST analysis shared by the compiler and the editor for defineProps defaults. */\nexport interface PropsDefaults {\n readonly argument: ts.ObjectLiteralExpression;\n readonly keys: readonly string[];\n}\n\nexport class PropsDefaultsError extends Error {\n constructor(readonly code: string, message: string, readonly node: ts.Node) {\n super(message);\n }\n}\n\nexport function analyzePropsDefaults(call: ts.CallExpression): PropsDefaults | undefined {\n if (call.arguments.length === 0) return undefined;\n if (call.arguments.length !== 1 || !ts.isObjectLiteralExpression(call.arguments[0]!)) {\n throw new PropsDefaultsError(\"MEEK040\", \"defineProps defaults require one object literal\", call.arguments[0] ?? call);\n }\n const argument = call.arguments[0];\n const keys: string[] = [];\n for (const property of argument.properties) {\n if (!ts.isPropertyAssignment(property) ||\n !(ts.isIdentifier(property.name) || ts.isStringLiteral(property.name))) {\n throw new PropsDefaultsError(\"MEEK041\", \"defineProps defaults require named properties\", property);\n }\n const key = property.name.text;\n if (key === \"__proto__\" || keys.includes(key)) {\n throw new PropsDefaultsError(\"MEEK042\", `Duplicate or unsafe default prop: ${key}`, property.name);\n }\n keys.push(key);\n }\n return { argument, keys };\n}\n"]}
@@ -68,3 +68,4 @@ export function parseSfc(source, filename = "anonymous.meeko") {
68
68
  const style = sections.get("style");
69
69
  return style ? { script, template, style } : { script, template };
70
70
  }
71
+ //# sourceMappingURL=sfc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfc.js","sourceRoot":"","sources":["../../src/compiler/sfc.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseFragment } from \"parse5\";\n\n/** Ubicación de un diagnóstico en el archivo .meeko original. */\nexport interface SourceLocation {\n offset: number;\n line: number;\n column: number;\n}\n\n/** Error de compilación con ubicación y código estable para herramientas. */\nexport interface CompileDiagnostic {\n code: string;\n message: string;\n filename: string;\n location: SourceLocation;\n}\n\n/** Error que conserva el diagnóstico estructurado para CLI y editor. */\nexport class MeekoCompileError extends Error {\n readonly diagnostic: CompileDiagnostic;\n\n constructor(diagnostic: CompileDiagnostic) {\n super(`${diagnostic.filename}:${diagnostic.location.line}:${diagnostic.location.column} ${diagnostic.code}: ${diagnostic.message}`);\n this.name = \"MeekoCompileError\";\n this.diagnostic = diagnostic;\n }\n}\n\ninterface ParseLocation {\n startOffset: number;\n endOffset: number;\n startTag?: { endOffset: number };\n endTag?: { startOffset: number };\n}\n\ninterface ParsedNode {\n nodeName: string;\n tagName?: string;\n value?: string;\n attrs?: Array<{ name: string; value: string }>;\n sourceCodeLocation?: ParseLocation;\n childNodes?: ParsedNode[];\n}\n\n/** Una sección SFC con posiciones conservadas en el archivo fuente. */\nexport interface SfcSection {\n name: \"script\" | \"template\" | \"style\";\n start: number;\n end: number;\n content: string;\n contentStart: number;\n contentEnd: number;\n attributes: ReadonlyArray<{ name: string; value: string }>;\n}\n\n/** Estructura validada de las secciones de un componente. */\nexport interface SfcDocument {\n script: SfcSection;\n template: SfcSection;\n style?: SfcSection;\n}\n\n/** Convierte un desplazamiento UTF-16 en línea y columna, empezando en uno. */\nexport function locate(source: string, offset: number): SourceLocation {\n const before = source.slice(0, offset);\n const lines = before.split(/\\r\\n|\\r|\\n/);\n return { offset, line: lines.length, column: (lines.at(-1)?.length ?? 0) + 1 };\n}\n\n/** Crea un error de compilación asociado al archivo original. */\nexport function compileError(source: string, filename: string, code: string, message: string, offset: number): MeekoCompileError {\n return new MeekoCompileError({ code, message, filename, location: locate(source, offset) });\n}\n\n/** Analiza y valida las secciones superiores de un archivo .meeko. */\nexport function parseSfc(source: string, filename = \"anonymous.meeko\"): SfcDocument {\n const parseErrors: Array<{ code: string; startOffset: number }> = [];\n const root = parseFragment(source, {\n sourceCodeLocationInfo: true,\n onParseError(error) {\n parseErrors.push({ code: error.code, startOffset: error.startOffset });\n },\n }) as unknown as ParsedNode;\n if (parseErrors[0]) {\n const error = parseErrors[0];\n throw compileError(source, filename, \"MEEK001\", `Invalid component HTML: ${error.code}`, error.startOffset);\n }\n\n const sections = new Map<SfcSection[\"name\"], SfcSection>();\n for (const node of root.childNodes ?? []) {\n if (node.nodeName === \"#comment\" || (node.nodeName === \"#text\" && !(node.value ?? \"\").trim())) continue;\n const tag = node.tagName;\n const location = node.sourceCodeLocation;\n if (tag !== \"script\" && tag !== \"template\" && tag !== \"style\") {\n throw compileError(source, filename, \"MEEK002\", \"Only script, template and style sections are allowed at the top level\", location?.startOffset ?? 0);\n }\n if (!location?.startTag || !location.endTag) {\n throw compileError(source, filename, \"MEEK003\", `Section <${tag}> must have a closing tag`, location?.startOffset ?? 0);\n }\n if (sections.has(tag)) {\n throw compileError(source, filename, \"MEEK004\", `Duplicate <${tag}> section`, location.startOffset);\n }\n sections.set(tag, {\n name: tag,\n start: location.startOffset,\n end: location.endOffset,\n content: source.slice(location.startTag.endOffset, location.endTag.startOffset),\n contentStart: location.startTag.endOffset,\n contentEnd: location.endTag.startOffset,\n attributes: node.attrs ?? [],\n });\n }\n\n const script = sections.get(\"script\");\n const template = sections.get(\"template\");\n if (!script) throw compileError(source, filename, \"MEEK005\", \"A <script lang=\\\"ts\\\"> section is required\", 0);\n if (!script.attributes.some((attribute) => attribute.name === \"lang\" && attribute.value === \"ts\")) {\n throw compileError(source, filename, \"MEEK006\", \"The script section must use lang=\\\"ts\\\"\", script.contentStart);\n }\n if (!template) throw compileError(source, filename, \"MEEK007\", \"A <template> section is required\", source.length);\n const style = sections.get(\"style\");\n return style ? { script, template, style } : { script, template };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { SourceMapping } from "./mapping.js";
2
+ /** Input sourcemap for Oxc: generated TypeScript locations point to the original SFC. */
3
+ export declare function sourceMapForCompiled(code: string, source: string, filename: string, mappings: readonly SourceMapping[]): object;
@@ -0,0 +1,75 @@
1
+ const base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2
+ function vlq(value) {
3
+ let bits = value < 0 ? (-value << 1) | 1 : value << 1;
4
+ let output = "";
5
+ do {
6
+ let digit = bits & 31;
7
+ bits >>>= 5;
8
+ if (bits)
9
+ digit |= 32;
10
+ output += base64[digit];
11
+ } while (bits);
12
+ return output;
13
+ }
14
+ function lineStarts(source) {
15
+ const starts = [0];
16
+ for (let index = 0; index < source.length; index++)
17
+ if (source[index] === "\n")
18
+ starts.push(index + 1);
19
+ return starts;
20
+ }
21
+ function position(starts, offset) {
22
+ let low = 0;
23
+ let high = starts.length;
24
+ while (low + 1 < high) {
25
+ const middle = (low + high) >>> 1;
26
+ if (starts[middle] <= offset)
27
+ low = middle;
28
+ else
29
+ high = middle;
30
+ }
31
+ return { line: low, column: offset - starts[low] };
32
+ }
33
+ /** Input sourcemap for Oxc: generated TypeScript locations point to the original SFC. */
34
+ export function sourceMapForCompiled(code, source, filename, mappings) {
35
+ const offsets = new Array(code.length);
36
+ // Broad marks first; nested expression marks override them.
37
+ for (const span of [...mappings].sort((a, b) => (b.generatedEnd - b.generatedStart) - (a.generatedEnd - a.generatedStart))) {
38
+ for (let generated = span.generatedStart; generated < span.generatedEnd; generated++) {
39
+ offsets[generated] = span.originalStart + Math.min(generated - span.generatedStart, Math.max(0, span.originalLength - 1));
40
+ }
41
+ }
42
+ const sourceLines = lineStarts(source);
43
+ const generatedLines = lineStarts(code);
44
+ const rows = [];
45
+ let previousOriginalLine = 0;
46
+ let previousOriginalColumn = 0;
47
+ for (let line = 0; line < generatedLines.length; line++) {
48
+ const begin = generatedLines[line];
49
+ const end = generatedLines[line + 1] === undefined ? code.length : generatedLines[line + 1] - 1;
50
+ const segments = [];
51
+ let previousGeneratedColumn = 0;
52
+ let mapped = false;
53
+ for (let offset = begin; offset < end; offset++) {
54
+ const original = offsets[offset];
55
+ const generatedColumn = offset - begin;
56
+ if (original === undefined) {
57
+ if (mapped) {
58
+ segments.push(vlq(generatedColumn - previousGeneratedColumn));
59
+ previousGeneratedColumn = generatedColumn;
60
+ mapped = false;
61
+ }
62
+ continue;
63
+ }
64
+ const { line: originalLine, column: originalColumn } = position(sourceLines, original);
65
+ segments.push(vlq(generatedColumn - previousGeneratedColumn) + vlq(0) + vlq(originalLine - previousOriginalLine) + vlq(originalColumn - previousOriginalColumn));
66
+ previousGeneratedColumn = generatedColumn;
67
+ previousOriginalLine = originalLine;
68
+ previousOriginalColumn = originalColumn;
69
+ mapped = true;
70
+ }
71
+ rows.push(segments.join(","));
72
+ }
73
+ return { version: 3, file: `${filename}.ts`, sources: [filename], sourcesContent: [source], names: [], mappings: rows.join(";") };
74
+ }
75
+ //# 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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","sourcesContent":["import type { SourceMapping } from \"./mapping.js\";\n\nconst base64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nfunction vlq(value: number): string {\n let bits = value < 0 ? (-value << 1) | 1 : value << 1;\n let output = \"\";\n do {\n let digit = bits & 31;\n bits >>>= 5;\n if (bits) digit |= 32;\n output += base64[digit]!;\n } while (bits);\n return output;\n}\n\nfunction lineStarts(source: string): number[] {\n const starts = [0];\n for (let index = 0; index < source.length; index++) if (source[index] === \"\\n\") starts.push(index + 1);\n return starts;\n}\n\nfunction position(starts: readonly number[], offset: number): { line: number; column: number } {\n let low = 0;\n let high = starts.length;\n while (low + 1 < high) {\n const middle = (low + high) >>> 1;\n if (starts[middle]! <= offset) low = middle;\n else high = middle;\n }\n return { line: low, column: offset - starts[low]! };\n}\n\n/** Input sourcemap for Oxc: generated TypeScript locations point to the original SFC. */\nexport function sourceMapForCompiled(code: string, source: string, filename: string, mappings: readonly SourceMapping[]): object {\n const offsets: Array<number | undefined> = new Array(code.length);\n // Broad marks first; nested expression marks override them.\n for (const span of [...mappings].sort((a, b) => (b.generatedEnd - b.generatedStart) - (a.generatedEnd - a.generatedStart))) {\n for (let generated = span.generatedStart; generated < span.generatedEnd; generated++) {\n offsets[generated] = span.originalStart + Math.min(generated - span.generatedStart, Math.max(0, span.originalLength - 1));\n }\n }\n const sourceLines = lineStarts(source);\n const generatedLines = lineStarts(code);\n const rows: string[] = [];\n let previousOriginalLine = 0;\n let previousOriginalColumn = 0;\n for (let line = 0; line < generatedLines.length; line++) {\n const begin = generatedLines[line]!;\n const end = generatedLines[line + 1] === undefined ? code.length : generatedLines[line + 1]! - 1;\n const segments: string[] = [];\n let previousGeneratedColumn = 0;\n let mapped = false;\n for (let offset = begin; offset < end; offset++) {\n const original = offsets[offset];\n const generatedColumn = offset - begin;\n if (original === undefined) {\n if (mapped) {\n segments.push(vlq(generatedColumn - previousGeneratedColumn));\n previousGeneratedColumn = generatedColumn;\n mapped = false;\n }\n continue;\n }\n const { line: originalLine, column: originalColumn } = position(sourceLines, original);\n segments.push(vlq(generatedColumn - previousGeneratedColumn) + vlq(0) + vlq(originalLine - previousOriginalLine) + vlq(originalColumn - previousOriginalColumn));\n previousGeneratedColumn = generatedColumn;\n previousOriginalLine = originalLine;\n previousOriginalColumn = originalColumn;\n mapped = true;\n }\n rows.push(segments.join(\",\"));\n }\n return { version: 3, file: `${filename}.ts`, sources: [filename], sourcesContent: [source], names: [], mappings: rows.join(\";\") };\n}\n"]}
@@ -42,3 +42,4 @@ export function parseTemplate(source, template, filename) {
42
42
  throw compileError(source, filename, "MEEK008", `Invalid template HTML: ${error.code}`, template.contentStart + error.startOffset);
43
43
  return normalize(parsed, template);
44
44
  }
45
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/compiler/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA0CxC,SAAS,SAAS,CAAC,IAAgB,EAAE,QAAoB;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,KAAK,EAAE,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,QAAQ,EAAE,WAAW,IAAI,CAAC,CAAC;YAChF,GAAG,EAAE,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ,EAAE,SAAS,IAAI,CAAC,CAAC;SAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAiB;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,QAAQ,CAAC,YAAY,GAAG,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC,CAAC;QAC3D,GAAG,EAAE,QAAQ,CAAC,YAAY,GAAG,CAAC,QAAQ,EAAE,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;KAC9E,CAAC;IACF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9D,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACxD,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClH,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC5I,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACjE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAoB,EAAE,QAAgB;IAClF,MAAM,MAAM,GAAiD,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC7C,sBAAsB,EAAE,IAAI;QAC5B,YAAY,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;KAC3F,CAA0B,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,KAAK;QAAE,MAAM,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,0BAA0B,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9I,OAAO,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import { parseFragment } from \"parse5\";\nimport { compileError } from \"./sfc.js\";\nimport type { SfcSection } from \"./sfc.js\";\n\n/** Atributo normalizado de una etiqueta de plantilla. */\nexport interface TemplateAttribute {\n name: string;\n value: string;\n start: number;\n end: number;\n}\n\n/** Nodo propio de plantilla con límites absolutos en el archivo .meeko. */\nexport interface TemplateNode {\n nodeName: string;\n tagName?: string;\n value?: string;\n attrs?: TemplateAttribute[];\n childNodes?: TemplateNode[];\n content?: { childNodes: TemplateNode[] };\n start: number;\n end: number;\n sourceCodeLocation?: {\n startOffset: number;\n endOffset: number;\n attrs?: Record<string, { startOffset: number; endOffset: number }>;\n };\n}\n\ninterface ParsedNode {\n nodeName: string;\n tagName?: string;\n value?: string;\n attrs?: Array<{ name: string; value: string }>;\n childNodes?: ParsedNode[];\n content?: { childNodes?: ParsedNode[] };\n sourceCodeLocation?: {\n startOffset: number;\n endOffset: number;\n attrs?: Record<string, { startOffset: number; endOffset: number }>;\n };\n}\n\nfunction normalize(node: ParsedNode, template: SfcSection): TemplateNode {\n const location = node.sourceCodeLocation;\n const attrs = node.attrs?.map((attribute) => {\n const span = location?.attrs?.[attribute.name];\n return {\n name: attribute.name,\n value: attribute.value,\n start: template.contentStart + (span?.startOffset ?? location?.startOffset ?? 0),\n end: template.contentStart + (span?.endOffset ?? location?.endOffset ?? 0),\n };\n });\n const result: TemplateNode = {\n nodeName: node.nodeName,\n start: template.contentStart + (location?.startOffset ?? 0),\n end: template.contentStart + (location?.endOffset ?? template.content.length),\n };\n if (node.tagName !== undefined) result.tagName = node.tagName;\n if (node.value !== undefined) result.value = node.value;\n if (attrs !== undefined) result.attrs = attrs;\n if (node.childNodes !== undefined) result.childNodes = node.childNodes.map((child) => normalize(child, template));\n if (node.content !== undefined) result.content = { childNodes: (node.content.childNodes ?? []).map((child) => normalize(child, template)) };\n if (location !== undefined) result.sourceCodeLocation = location;\n return result;\n}\n\n/** Analiza HTML y entrega un AST independiente del parser con posiciones originales. */\nexport function parseTemplate(source: string, template: SfcSection, filename: string): TemplateNode {\n const errors: Array<{ code: string; startOffset: number }> = [];\n const parsed = parseFragment(template.content, {\n sourceCodeLocationInfo: true,\n onParseError(error) { errors.push({ code: error.code, startOffset: error.startOffset }); },\n }) as unknown as ParsedNode;\n const error = errors[0];\n if (error) throw compileError(source, filename, \"MEEK008\", `Invalid template HTML: ${error.code}`, template.contentStart + error.startOffset);\n return normalize(parsed, template);\n}\n"]}