@geektech/tsone 0.0.1 → 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 (40) hide show
  1. package/README-zh.md +405 -0
  2. package/README.md +288 -32
  3. package/dist/core/animation/TransitionGroup.d.ts +7 -0
  4. package/dist/core/animation/index.d.ts +2 -0
  5. package/dist/core/animation/list-animation-controller.d.ts +16 -0
  6. package/dist/core/animation/transition-group-strategy.d.ts +15 -0
  7. package/dist/core/animation/types.d.ts +25 -0
  8. package/dist/core/app.d.ts +30 -8
  9. package/dist/core/component/base.d.ts +18 -1
  10. package/dist/core/component/index.d.ts +2 -2
  11. package/dist/core/document.d.ts +32 -0
  12. package/dist/core/form.d.ts +24 -0
  13. package/dist/core/index.d.ts +4 -0
  14. package/dist/core/model.d.ts +18 -0
  15. package/dist/core/reactive/types.d.ts +5 -0
  16. package/dist/core/reactive.d.ts +5 -2
  17. package/dist/core/renderer/element-strategy.d.ts +25 -0
  18. package/dist/core/renderer/types.d.ts +6 -1
  19. package/dist/core/renderer.d.ts +9 -23
  20. package/dist/core/vnode.d.ts +56 -16
  21. package/dist/{index-dgv88dz4.js → index-8wjswsye.js} +6 -2
  22. package/dist/index-8wjswsye.js.map +10 -0
  23. package/dist/index-vpx80nq5.js +32 -0
  24. package/dist/index-vpx80nq5.js.map +10 -0
  25. package/dist/{index-3j2jsdpc.js → index-wv9gyjqt.js} +858 -244
  26. package/dist/index-wv9gyjqt.js.map +25 -0
  27. package/dist/index.d.ts +3 -2
  28. package/dist/index.js +380 -20
  29. package/dist/index.js.map +8 -5
  30. package/dist/router/index.d.ts +1 -1
  31. package/dist/router/index.js +6 -4
  32. package/dist/router/index.js.map +1 -1
  33. package/dist/style/StyleManager.d.ts +1 -0
  34. package/dist/style/index.d.ts +1 -0
  35. package/dist/style/index.js +6 -2
  36. package/dist/style/index.js.map +1 -1
  37. package/dist/style/sheet.d.ts +13 -0
  38. package/package.json +4 -14
  39. package/dist/index-3j2jsdpc.js.map +0 -20
  40. package/dist/index-dgv88dz4.js.map +0 -10
package/dist/index.js CHANGED
@@ -1,49 +1,195 @@
1
1
  import {
2
+ A,
3
+ Article,
4
+ Aside,
5
+ Blockquote,
6
+ Button,
7
+ Code,
2
8
  Component,
3
9
  ComponentRenderStrategy,
10
+ Div,
4
11
  ElementRenderStrategy,
12
+ Em,
13
+ Footer,
14
+ Form,
15
+ H1,
16
+ H2,
17
+ H3,
18
+ H4,
19
+ H5,
20
+ H6,
21
+ Header,
22
+ Img,
23
+ Input,
24
+ Label,
25
+ Li,
26
+ Main,
27
+ ModelBindingController,
28
+ Nav,
29
+ Ol,
30
+ Option,
31
+ P,
32
+ Pre,
5
33
  ReactiveSystem,
6
34
  RendererContext,
7
35
  Router,
8
36
  RouterLink,
9
37
  RouterView,
38
+ Section,
39
+ Select,
10
40
  SlotRenderStrategy,
41
+ Small,
42
+ Span,
43
+ Strong,
44
+ Table,
45
+ Tag,
46
+ Tbody,
47
+ Td,
11
48
  TemplateEngine,
12
49
  TextRenderStrategy,
50
+ Textarea,
51
+ Th,
52
+ Thead,
53
+ Tr,
54
+ Ul,
13
55
  computed,
14
56
  createComponent,
15
57
  createRouter,
58
+ each,
16
59
  effect,
60
+ getModelValue,
17
61
  h,
18
62
  isComponentNode,
19
63
  isHTMLNode,
20
64
  isReactive,
21
65
  isReadonly,
66
+ isRef,
22
67
  isSlotProvider,
68
+ modelPath,
69
+ normalizeTransitionGroupProps,
23
70
  reactive,
24
71
  readonly,
72
+ ref,
73
+ setModelValue,
25
74
  slot,
26
- stop
27
- } from "./index-3j2jsdpc.js";
28
- import"./index-dgv88dz4.js";
75
+ stop,
76
+ unref,
77
+ useRouter,
78
+ validateTransitionGroupChildren
79
+ } from "./index-wv9gyjqt.js";
80
+ import {
81
+ renderStyleSheet
82
+ } from "./index-vpx80nq5.js";
83
+ import"./index-8wjswsye.js";
84
+
85
+ // lib/core/document.ts
86
+ var VOID_HEAD_TAGS = new Set(["base", "link", "meta"]);
87
+ function renderHtmlDocument(options) {
88
+ const lang = options.lang ?? "en";
89
+ const charset = options.charset ?? "utf-8";
90
+ const viewport = options.viewport ?? "width=device-width, initial-scale=1";
91
+ const htmlAttributes = renderAttributes({
92
+ lang,
93
+ ...options.htmlAttributes ?? {}
94
+ });
95
+ const bodyAttributes = renderAttributes(options.bodyAttributes);
96
+ const bodyHtml = renderDocumentBody(options.body);
97
+ return [
98
+ "<!doctype html>",
99
+ `<html${htmlAttributes}>`,
100
+ "<head>",
101
+ ` <meta charset="${escapeHtml(charset)}">`,
102
+ ` <meta name="viewport" content="${escapeHtml(viewport)}">`,
103
+ ` <title>${escapeHtml(options.title)}</title>`,
104
+ options.description ? ` <meta name="description" content="${escapeHtml(options.description)}">` : "",
105
+ ...(options.head ?? []).map((element) => ` ${renderHeadElement(element)}`),
106
+ options.styles && options.styles.length > 0 ? ` <style>${renderStyleSheet(options.styles)}</style>` : "",
107
+ "</head>",
108
+ `<body${bodyAttributes}>`,
109
+ bodyHtml,
110
+ ...(options.scripts ?? []).map((script) => ` ${renderScript(script)}`),
111
+ "</body>",
112
+ "</html>"
113
+ ].filter((line) => line !== "").join(`
114
+ `);
115
+ }
116
+ function renderDocumentBody(body) {
117
+ if (typeof document === "undefined") {
118
+ throw new Error("renderHtmlDocument requires a DOM-like document");
119
+ }
120
+ const container = document.createElement("div");
121
+ const renderer = new RendererContext;
122
+ const mountedComponents = new Set;
123
+ const renderables = Array.isArray(body) ? body : [body];
124
+ const context = {
125
+ templateEngine: new TemplateEngine({}),
126
+ renderer,
127
+ slots: { default: [] },
128
+ registerChild: (component) => {
129
+ mountedComponents.add(component);
130
+ },
131
+ unregisterChild: (component) => {
132
+ mountedComponents.delete(component);
133
+ }
134
+ };
135
+ renderables.forEach((renderable) => {
136
+ container.appendChild(renderer.mount(renderable, context));
137
+ });
138
+ const html = container.innerHTML;
139
+ mountedComponents.forEach((component) => {
140
+ component.unmount();
141
+ });
142
+ return html;
143
+ }
144
+ function renderHeadElement(element) {
145
+ const attributes = renderAttributes(element.attributes);
146
+ if (VOID_HEAD_TAGS.has(element.tag) && !element.text) {
147
+ return `<${element.tag}${attributes}>`;
148
+ }
149
+ return `<${element.tag}${attributes}>${escapeHtml(element.text ?? "")}</${element.tag}>`;
150
+ }
151
+ function renderScript(script) {
152
+ const attributes = renderAttributes({
153
+ type: script.type,
154
+ src: script.src,
155
+ async: script.async,
156
+ defer: script.defer,
157
+ ...script.attributes ?? {}
158
+ });
159
+ return `<script${attributes}></script>`;
160
+ }
161
+ function renderAttributes(attributes = {}) {
162
+ const rendered = Object.entries(attributes).flatMap(([name, value]) => {
163
+ if (value === false || value === null || value === undefined) {
164
+ return [];
165
+ }
166
+ return value === true ? [name] : [`${name}="${escapeHtml(String(value))}"`];
167
+ }).join(" ");
168
+ return rendered ? ` ${rendered}` : "";
169
+ }
170
+ function escapeHtml(value) {
171
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
172
+ }
29
173
 
30
174
  // lib/core/app.ts
175
+ var DEFAULT_ROOT_ELEMENT = "#app";
176
+
31
177
  class OneApp {
32
178
  options;
33
- container;
179
+ container = null;
34
180
  rootInstance = null;
35
181
  mounted = false;
36
182
  templateEngine = null;
37
183
  appContext;
184
+ providers = new Map;
38
185
  plugins = [];
39
186
  unmountedCallback;
40
187
  router;
41
188
  constructor(options = {}) {
42
189
  this.options = options;
43
- this.container = document.body;
44
190
  this.appContext = {
45
191
  app: this,
46
- version: "0.0.1",
192
+ version: "0.0.2",
47
193
  config: options.config || {}
48
194
  };
49
195
  }
@@ -52,6 +198,9 @@ class OneApp {
52
198
  this.renderErrorUI(error);
53
199
  }
54
200
  renderErrorUI(error) {
201
+ if (!this.container) {
202
+ return;
203
+ }
55
204
  this.container.innerHTML = `
56
205
  <div style="padding: 20px; background-color: #ffebee; color: #c62828; font-family: Arial, sans-serif;">
57
206
  <h3>应用错误</h3>
@@ -73,18 +222,15 @@ class OneApp {
73
222
  console.warn("应用已经处于运行状态");
74
223
  return;
75
224
  }
225
+ const mountContainer = this.resolveMountContainer();
226
+ if (!mountContainer) {
227
+ return;
228
+ }
76
229
  try {
230
+ this.container = mountContainer;
77
231
  globalThis.__APP__ = this;
78
- if (this.options.rootElement) {
79
- const rootElement = this.resolveRootElement(this.options.rootElement);
80
- if (rootElement) {
81
- this.container = rootElement;
82
- } else {
83
- throw new Error(`无法找到挂载点: ${this.options.rootElement}`);
84
- }
85
- }
86
232
  if (this.options.root) {
87
- this.rootInstance = new this.options.root;
233
+ this.rootInstance = new this.options.root(this.options.rootProps);
88
234
  if ("setAppContext" in this.rootInstance) {
89
235
  this.rootInstance.setAppContext(this.appContext);
90
236
  }
@@ -119,7 +265,9 @@ class OneApp {
119
265
  this.templateEngine.clearBindings();
120
266
  this.templateEngine = null;
121
267
  }
122
- this.container.innerHTML = "";
268
+ if (this.container) {
269
+ this.container.innerHTML = "";
270
+ }
123
271
  if (this.unmountedCallback) {
124
272
  this.unmountedCallback();
125
273
  }
@@ -161,6 +309,20 @@ class OneApp {
161
309
  getContext() {
162
310
  return this.appContext;
163
311
  }
312
+ provide(key, value) {
313
+ this.providers.set(key, value);
314
+ return this;
315
+ }
316
+ inject(key, fallback) {
317
+ const result = this.resolveInjection(key);
318
+ return result.found ? result.value : fallback;
319
+ }
320
+ resolveInjection(key) {
321
+ if (!this.providers.has(key)) {
322
+ return { found: false, value: undefined };
323
+ }
324
+ return { found: true, value: this.providers.get(key) };
325
+ }
164
326
  getState() {
165
327
  return this.options.state;
166
328
  }
@@ -175,14 +337,67 @@ class OneApp {
175
337
  this.unmountedCallback = callback;
176
338
  return this;
177
339
  }
340
+ renderHtmlDocument(options = {}) {
341
+ const appDocument = this.options.document ?? {};
342
+ const scripts = this.mergeDocumentScripts(appDocument.scripts, options.scripts);
343
+ return renderHtmlDocument({
344
+ ...appDocument,
345
+ ...options,
346
+ title: options.title ?? appDocument.title ?? "TSone App",
347
+ body: options.body ?? appDocument.body ?? this.createMountDocumentBody(),
348
+ scripts
349
+ });
350
+ }
178
351
  resolveRootElement(selector) {
179
352
  if (!selector) {
180
353
  return null;
181
354
  }
182
355
  if (typeof selector === "string") {
356
+ if (typeof document === "undefined") {
357
+ return null;
358
+ }
183
359
  return document.querySelector(selector);
184
360
  }
185
- return selector instanceof Element ? selector : null;
361
+ return typeof Element !== "undefined" && selector instanceof Element ? selector : null;
362
+ }
363
+ resolveMountContainer() {
364
+ if (typeof document === "undefined") {
365
+ return null;
366
+ }
367
+ const rootElement = this.resolveRootElement(this.options.rootElement ?? DEFAULT_ROOT_ELEMENT);
368
+ return rootElement instanceof HTMLElement ? rootElement : null;
369
+ }
370
+ createMountDocumentBody() {
371
+ const rootElement = this.options.rootElement ?? DEFAULT_ROOT_ELEMENT;
372
+ if (typeof rootElement === "string") {
373
+ return this.createMountElementFromSelector(rootElement);
374
+ }
375
+ if (typeof Element !== "undefined" && rootElement instanceof Element) {
376
+ const props = {};
377
+ if (rootElement.id) {
378
+ props.id = rootElement.id;
379
+ }
380
+ if (rootElement.className) {
381
+ props.className = rootElement.className;
382
+ }
383
+ return { tag: rootElement.tagName.toLowerCase(), props };
384
+ }
385
+ return Div({ props: { id: "app" } });
386
+ }
387
+ createMountElementFromSelector(selector) {
388
+ if (selector.startsWith("#") && selector.length > 1) {
389
+ return Div({ props: { id: selector.slice(1) } });
390
+ }
391
+ if (selector.startsWith(".") && selector.length > 1) {
392
+ return Div({ props: { className: selector.slice(1) } });
393
+ }
394
+ return Div({ props: { "data-tsone-root": selector } });
395
+ }
396
+ mergeDocumentScripts(baseScripts, extraScripts) {
397
+ if (!baseScripts && !extraScripts) {
398
+ return;
399
+ }
400
+ return [...baseScripts ?? [], ...extraScripts ?? []];
186
401
  }
187
402
  onMounted() {
188
403
  this.plugins.forEach(({ plugin: pluginObj }) => {
@@ -206,43 +421,188 @@ class OneApp {
206
421
  });
207
422
  }
208
423
  }
424
+ // lib/core/form.ts
425
+ function errorMessage(error) {
426
+ return error instanceof Error ? error.message : String(error);
427
+ }
428
+ function runRule(rule, value, model) {
429
+ try {
430
+ const result = rule(value, model);
431
+ if (result === true) {
432
+ return;
433
+ }
434
+ return result === false ? "Validation failed" : result;
435
+ } catch (error) {
436
+ return errorMessage(error);
437
+ }
438
+ }
439
+ function required(message = "This field is required") {
440
+ return (value) => {
441
+ if (value === null || value === undefined) {
442
+ return message;
443
+ }
444
+ if (typeof value === "string" && value.trim().length === 0) {
445
+ return message;
446
+ }
447
+ if (Array.isArray(value) && value.length === 0) {
448
+ return message;
449
+ }
450
+ return true;
451
+ };
452
+ }
453
+ function minLength(length, message = `Must be at least ${length} characters`) {
454
+ return (value) => typeof value === "string" && value.length >= length ? true : message;
455
+ }
456
+ function validate(rule) {
457
+ return rule;
458
+ }
459
+ function createForm(model, rules) {
460
+ const errors = {};
461
+ const validateField = (path) => {
462
+ const fieldRules = rules[path] ?? [];
463
+ const value = getModelValue(model, path);
464
+ const fieldErrors = fieldRules.map((rule) => runRule(rule, value, model)).filter((message) => message !== undefined);
465
+ if (fieldErrors.length === 0) {
466
+ delete errors[path];
467
+ } else {
468
+ errors[path] = fieldErrors;
469
+ }
470
+ return { valid: fieldErrors.length === 0, errors: fieldErrors };
471
+ };
472
+ return {
473
+ model,
474
+ errors,
475
+ validate() {
476
+ const allErrors = {};
477
+ Object.keys(rules).forEach((path) => {
478
+ const result = validateField(path);
479
+ if (!result.valid) {
480
+ allErrors[path] = result.errors;
481
+ }
482
+ });
483
+ return { valid: Object.keys(allErrors).length === 0, errors: allErrors };
484
+ },
485
+ validateField,
486
+ resetErrors() {
487
+ Object.keys(errors).forEach((path) => delete errors[path]);
488
+ }
489
+ };
490
+ }
491
+ // lib/core/animation/TransitionGroup.ts
492
+ class TransitionGroup extends Component {
493
+ initState() {
494
+ return {};
495
+ }
496
+ initStyles() {}
497
+ render() {
498
+ const { tag, type, duration } = normalizeTransitionGroupProps(this.props);
499
+ const children = validateTransitionGroupChildren(this.props.children ?? []);
500
+ return {
501
+ tag,
502
+ props: this.props.elementProps,
503
+ listeners: this.props.listeners,
504
+ children,
505
+ transitionGroup: {
506
+ type,
507
+ duration
508
+ }
509
+ };
510
+ }
511
+ }
209
512
  // lib/index.ts
210
513
  function createApp(options = {}) {
211
514
  return new OneApp(options);
212
515
  }
213
- var version = "0.0.1";
516
+ var version = "0.0.2";
214
517
  var name = "@geektech/tsone";
215
518
  export {
216
519
  version,
520
+ validate,
521
+ useRouter,
522
+ unref,
217
523
  stop,
218
524
  slot,
525
+ setModelValue,
526
+ required,
527
+ renderStyleSheet,
528
+ renderHtmlDocument,
529
+ ref,
219
530
  readonly,
220
531
  reactive,
221
532
  name,
533
+ modelPath,
534
+ minLength,
222
535
  isSlotProvider,
536
+ isRef,
223
537
  isReadonly,
224
538
  isReactive,
225
539
  isHTMLNode,
226
540
  isComponentNode,
227
541
  h,
542
+ getModelValue,
228
543
  effect,
544
+ each,
229
545
  createRouter,
546
+ createForm,
230
547
  createComponent,
231
548
  createApp,
232
549
  computed,
550
+ Ul,
551
+ TransitionGroup,
552
+ Tr,
553
+ Thead,
554
+ Th,
555
+ Textarea,
233
556
  TextRenderStrategy,
234
557
  TemplateEngine,
558
+ Td,
559
+ Tbody,
560
+ Tag,
561
+ Table,
562
+ Strong,
563
+ Span,
564
+ Small,
235
565
  SlotRenderStrategy,
566
+ Select,
567
+ Section,
236
568
  RouterView,
237
569
  RouterLink,
238
570
  Router,
239
571
  RendererContext,
240
572
  ReactiveSystem,
573
+ Pre,
574
+ P,
575
+ Option,
241
576
  OneApp,
577
+ Ol,
578
+ Nav,
579
+ ModelBindingController,
580
+ Main,
581
+ Li,
582
+ Label,
583
+ Input,
584
+ Img,
585
+ Header,
586
+ H6,
587
+ H5,
588
+ H4,
589
+ H3,
590
+ H2,
591
+ H1,
592
+ Form,
593
+ Footer,
594
+ Em,
242
595
  ElementRenderStrategy,
596
+ Div,
243
597
  ComponentRenderStrategy,
244
- Component
598
+ Component,
599
+ Code,
600
+ Button,
601
+ Blockquote,
602
+ Aside,
603
+ Article,
604
+ A
245
605
  };
246
606
 
247
- //# debugId=DBC150EE46E0D75764756E2164756E21
607
+ //# debugId=7471E8A79DBDD62164756E2164756E21
248
608
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../lib/core/app.ts", "../lib/index.ts"],
3
+ "sources": ["../lib/core/document.ts", "../lib/core/app.ts", "../lib/core/form.ts", "../lib/core/animation/TransitionGroup.ts", "../lib/index.ts"],
4
4
  "sourcesContent": [
5
- "import { Component, ComponentConstructor } from './component';\nimport type { Router } from '../router';\n\nimport { TemplateEngine } from './template';\n\n// 插件接口定义\nexport interface Plugin {\n install: (app: OneApp, ...args: unknown[]) => void;\n onMounted?: (app: OneApp) => void;\n onUpdated?: (app: OneApp) => void;\n onBeforeUnmount?: (app: OneApp) => void;\n}\n\n// 泛型化AppOptions接口\nexport interface AppOptions<\n TState = Record<string, unknown>,\n TConfig = Record<string, unknown>,\n> {\n /** 根组件构造函数 */\n root?: ComponentConstructor;\n /** 应用挂载点 */\n rootElement?: string | Element;\n /** 全局状态 */\n state?: TState;\n /** 全局配置 */\n config?: TConfig;\n}\n\n// 泛型化AppContext接口\nexport interface AppContext<TConfig = Record<string, unknown>> {\n app: OneApp;\n version: string;\n config: TConfig;\n router?: Router;\n}\n\n// 泛型化OneApp类\nexport class OneApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n> {\n private container: HTMLElement;\n private rootInstance: Component | null = null;\n private mounted: boolean = false;\n private templateEngine: TemplateEngine | null = null;\n private readonly appContext: AppContext<TConfig>;\n private plugins: Array<{ plugin: Plugin; args: unknown[] }> = [];\n private unmountedCallback?: () => void;\n public router?: Router;\n\n constructor(private options: AppOptions<TState, TConfig> = {}) {\n // 默认使用 body 作为容器\n this.container = document.body;\n\n this.appContext = {\n app: this as unknown as OneApp,\n version: '0.0.1',\n config: options.config || ({} as TConfig),\n };\n }\n\n private handleError(error: Error): void {\n console.error('应用错误:', error);\n // 渲染错误UI\n this.renderErrorUI(error);\n // 不立即卸载应用,而是显示错误信息\n }\n\n /**\n * 渲染错误UI\n */\n private renderErrorUI(error: Error): void {\n this.container.innerHTML = `\n <div style=\"padding: 20px; background-color: #ffebee; color: #c62828; font-family: Arial, sans-serif;\">\n <h3>应用错误</h3>\n <p>${error.message}</p>\n <pre style=\"background-color: #fff; padding: 10px; border-radius: 4px; overflow: auto;\">${error.stack}</pre>\n </div>\n `;\n }\n\n /**\n * 使用插件\n */\n public use(plugin: Plugin, ...args: unknown[]): this {\n if (typeof plugin.install !== 'function') {\n throw new Error('插件必须提供 install 方法');\n }\n plugin.install(this as unknown as OneApp, ...args);\n this.plugins.push({ plugin, args });\n return this;\n }\n\n /**\n * 挂载应用\n */\n public mount(): void {\n if (this.mounted) {\n console.warn('应用已经处于运行状态');\n return;\n }\n\n try {\n // 添加全局应用实例\n (globalThis as { __APP__?: unknown }).__APP__ = this;\n\n // 确定挂载点\n if (this.options.rootElement) {\n const rootElement = this.resolveRootElement(this.options.rootElement);\n if (rootElement) {\n this.container = rootElement as HTMLElement;\n } else {\n throw new Error(`无法找到挂载点: ${this.options.rootElement}`);\n }\n }\n\n // 只有在有根组件时才创建实例\n if (this.options.root) {\n this.rootInstance = new this.options.root();\n\n // 设置应用上下文\n if ('setAppContext' in this.rootInstance) {\n this.rootInstance.setAppContext(this.appContext);\n }\n\n // 如果有全局状态,传递给组件\n if (this.options.state && 'setState' in this.rootInstance) {\n this.rootInstance.setState(this.options.state);\n }\n\n this.rootInstance.mount(this.container);\n\n // 创建模板引擎实例\n this.templateEngine = new TemplateEngine(this.options.state || {});\n }\n\n this.mounted = true;\n\n // 触发生命周期钩子\n this.onMounted();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * 卸载应用\n */\n public unmount(): void {\n if (!this.mounted) {\n console.warn('应用未处于运行状态');\n return;\n }\n\n try {\n // 触发卸载前钩子\n this.onBeforeUnmount();\n\n if (this.rootInstance) {\n // 调用组件卸载方法\n if ('unmount' in this.rootInstance) {\n this.rootInstance.unmount();\n }\n\n this.rootInstance = null;\n this.mounted = false;\n delete (globalThis as { __APP__?: unknown }).__APP__;\n }\n\n // 清除模板引擎\n if (this.templateEngine) {\n this.templateEngine.clearBindings();\n this.templateEngine = null;\n }\n\n // 清空容器\n this.container.innerHTML = '';\n\n // 触发卸载后钩子\n if (this.unmountedCallback) {\n this.unmountedCallback();\n }\n } catch (error) {\n console.error('Failed to unmount app:', error);\n }\n }\n\n /**\n * 应用是否正在运行\n */\n public isRunning(): boolean {\n return this.mounted;\n }\n\n /**\n * 更新根组件\n */\n public updateRootComponent(component: ComponentConstructor): void {\n if (this.mounted) {\n this.unmount();\n }\n this.options.root = component;\n this.mount();\n }\n\n /**\n * 更新应用状态\n */\n public update(state?: Partial<TState>): this {\n if (!this.mounted) {\n console.warn('Cannot update unmounted app');\n return this;\n }\n\n try {\n // 更新状态\n if (state && this.options.state) {\n this.options.state = { ...this.options.state, ...state };\n\n // 更新组件状态\n if (this.rootInstance && 'setState' in this.rootInstance) {\n this.rootInstance.setState(state);\n }\n\n // 更新模板引擎状态\n if (this.templateEngine) {\n // 如果存在templateEngine,更新其状态\n this.templateEngine.state = this.options.state;\n }\n }\n\n // 触发更新钩子\n this.onUpdated();\n } catch (error) {\n console.error('Failed to update app:', error);\n }\n\n return this;\n }\n\n /**\n * 获取应用上下文\n */\n public getContext(): AppContext<TConfig> {\n return this.appContext;\n }\n\n /**\n * 获取应用状态\n */\n public getState(): TState | undefined {\n return this.options.state;\n }\n\n /**\n * 设置应用状态\n */\n public setState(newState: TState): this {\n this.options.state = newState;\n if (this.mounted) {\n this.update();\n }\n return this;\n }\n\n /**\n * 监听应用卸载\n */\n public onUnmounted(callback: () => void): this {\n this.unmountedCallback = callback;\n return this;\n }\n\n /**\n * 解析根元素\n */\n private resolveRootElement(selector?: string | Element): Element | null {\n if (!selector) {\n return null;\n }\n\n if (typeof selector === 'string') {\n return document.querySelector(selector);\n }\n\n return selector instanceof Element ? selector : null;\n }\n\n // 生命周期钩子\n private onMounted(): void {\n // 触发插件的mounted钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onMounted === 'function') {\n pluginObj.onMounted(this as unknown as OneApp);\n }\n });\n }\n\n private onUpdated(): void {\n // 触发插件的updated钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onUpdated === 'function') {\n pluginObj.onUpdated(this as unknown as OneApp);\n }\n });\n }\n\n private onBeforeUnmount(): void {\n // 触发插件的beforeUnmount钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onBeforeUnmount === 'function') {\n pluginObj.onBeforeUnmount(this as unknown as OneApp);\n }\n });\n }\n}\n\n/**\n * 创建应用实例\n */\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n>(options: AppOptions<TState, TConfig> = {}): OneApp<TState, TConfig> {\n return new OneApp<TState, TConfig>(options);\n}\n",
6
- "import { OneApp, AppOptions } from './core/app';\n\n// 导出核心功能\nexport * from './core';\n\n// 导出路由功能\nexport * from './router';\n\n// 创建应用实例的主函数\nexport function createApp(options: AppOptions = {}): OneApp {\n return new OneApp(options);\n}\n\n// 导出框架名称和版本\nexport const version = '0.0.1';\nexport const name = '@geektech/tsone';\n"
5
+ "import { RendererContext } from './renderer';\nimport type { ComponentInstance, Renderable } from './renderer/types';\nimport { TemplateEngine } from './template';\nimport { renderStyleSheet, type StyleSheet } from '../style/sheet';\n\nexport {\n renderStyleSheet,\n type StyleAtRule,\n type StyleProperties,\n type StyleRule,\n type StyleSheet,\n type StyleSheetEntry,\n type StyleValue,\n} from '../style/sheet';\n\nexport type HtmlAttributeValue = string | number | boolean | null | undefined;\n\nexport type HtmlAttributes = Record<string, HtmlAttributeValue>;\n\nexport type HtmlDocumentBody = Renderable | Renderable[];\n\nexport interface HtmlHeadElement {\n tag: string;\n attributes?: HtmlAttributes;\n text?: string;\n}\n\nexport interface HtmlScript {\n src: string;\n type?: string;\n async?: boolean;\n defer?: boolean;\n attributes?: HtmlAttributes;\n}\n\nexport interface HtmlDocumentOptions {\n title: string;\n body: HtmlDocumentBody;\n lang?: string;\n charset?: string;\n viewport?: string;\n description?: string;\n htmlAttributes?: HtmlAttributes;\n bodyAttributes?: HtmlAttributes;\n head?: HtmlHeadElement[];\n styles?: StyleSheet;\n scripts?: HtmlScript[];\n}\n\nconst VOID_HEAD_TAGS = new Set(['base', 'link', 'meta']);\n\nexport function renderHtmlDocument(options: HtmlDocumentOptions): string {\n const lang = options.lang ?? 'en';\n const charset = options.charset ?? 'utf-8';\n const viewport = options.viewport ?? 'width=device-width, initial-scale=1';\n const htmlAttributes = renderAttributes({\n lang,\n ...(options.htmlAttributes ?? {}),\n });\n const bodyAttributes = renderAttributes(options.bodyAttributes);\n const bodyHtml = renderDocumentBody(options.body);\n\n return [\n '<!doctype html>',\n `<html${htmlAttributes}>`,\n '<head>',\n ` <meta charset=\"${escapeHtml(charset)}\">`,\n ` <meta name=\"viewport\" content=\"${escapeHtml(viewport)}\">`,\n ` <title>${escapeHtml(options.title)}</title>`,\n options.description\n ? ` <meta name=\"description\" content=\"${escapeHtml(\n options.description\n )}\">`\n : '',\n ...(options.head ?? []).map((element) => ` ${renderHeadElement(element)}`),\n options.styles && options.styles.length > 0\n ? ` <style>${renderStyleSheet(options.styles)}</style>`\n : '',\n '</head>',\n `<body${bodyAttributes}>`,\n bodyHtml,\n ...(options.scripts ?? []).map((script) => ` ${renderScript(script)}`),\n '</body>',\n '</html>',\n ]\n .filter((line) => line !== '')\n .join('\\n');\n}\n\nfunction renderDocumentBody(body: HtmlDocumentBody): string {\n if (typeof document === 'undefined') {\n throw new Error('renderHtmlDocument requires a DOM-like document');\n }\n\n const container = document.createElement('div');\n const renderer = new RendererContext();\n const mountedComponents = new Set<ComponentInstance>();\n const renderables = Array.isArray(body) ? body : [body];\n const context = {\n templateEngine: new TemplateEngine({}),\n renderer,\n slots: { default: [] },\n registerChild: (component: ComponentInstance) => {\n mountedComponents.add(component);\n },\n unregisterChild: (component: ComponentInstance) => {\n mountedComponents.delete(component);\n },\n };\n\n renderables.forEach((renderable) => {\n container.appendChild(renderer.mount(renderable, context));\n });\n\n const html = container.innerHTML;\n mountedComponents.forEach((component) => {\n component.unmount();\n });\n\n return html;\n}\n\nfunction renderHeadElement(element: HtmlHeadElement): string {\n const attributes = renderAttributes(element.attributes);\n if (VOID_HEAD_TAGS.has(element.tag) && !element.text) {\n return `<${element.tag}${attributes}>`;\n }\n\n return `<${element.tag}${attributes}>${escapeHtml(\n element.text ?? ''\n )}</${element.tag}>`;\n}\n\nfunction renderScript(script: HtmlScript): string {\n const attributes = renderAttributes({\n type: script.type,\n src: script.src,\n async: script.async,\n defer: script.defer,\n ...(script.attributes ?? {}),\n });\n\n return `<script${attributes}></script>`;\n}\n\nfunction renderAttributes(attributes: HtmlAttributes = {}): string {\n const rendered = Object.entries(attributes)\n .flatMap(([name, value]) => {\n if (value === false || value === null || value === undefined) {\n return [];\n }\n\n return value === true\n ? [name]\n : [`${name}=\"${escapeHtml(String(value))}\"`];\n })\n .join(' ');\n\n return rendered ? ` ${rendered}` : '';\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n",
6
+ "import {\n Component,\n ComponentConstructor,\n ComponentProps,\n InjectionKey,\n InjectionResult,\n} from './component';\nimport {\n renderHtmlDocument as renderDocumentShell,\n type HtmlDocumentBody,\n type HtmlDocumentOptions,\n type HtmlScript,\n} from './document';\nimport { Div } from './vnode';\nimport type { Router } from '../router';\n\nimport { TemplateEngine } from './template';\n\nconst DEFAULT_ROOT_ELEMENT = '#app';\n\n// 插件接口定义\nexport interface Plugin {\n install: (app: OneApp, ...args: unknown[]) => void;\n onMounted?: (app: OneApp) => void;\n onUpdated?: (app: OneApp) => void;\n onBeforeUnmount?: (app: OneApp) => void;\n}\n\nexport type AppDocumentOptions = Partial<Omit<HtmlDocumentOptions, 'body'>> & {\n body?: HtmlDocumentBody;\n};\n\nexport type AppDocumentRenderOptions = AppDocumentOptions;\n\n// 泛型化AppOptions接口\nexport interface AppOptions<\n TState = Record<string, unknown>,\n TConfig = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n> {\n /** 根组件构造函数 */\n root?: ComponentConstructor<TRootProps>;\n /** 根组件 props */\n rootProps?: TRootProps;\n /** 应用挂载点,默认 #app */\n rootElement?: string | Element;\n /** 全局状态 */\n state?: TState;\n /** 全局配置 */\n config?: TConfig;\n /** HTML 文档壳配置,用于 dev/build 生成入口页面 */\n document?: AppDocumentOptions;\n}\n\n// 泛型化AppContext接口\nexport interface AppContext<TConfig = Record<string, unknown>> {\n app: OneApp;\n version: string;\n config: TConfig;\n router?: Router;\n}\n\n// 泛型化OneApp类\nexport class OneApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n> {\n private container: HTMLElement | null = null;\n private rootInstance: Component | null = null;\n private mounted: boolean = false;\n private templateEngine: TemplateEngine | null = null;\n private readonly appContext: AppContext<TConfig>;\n private readonly providers = new Map<string | symbol, unknown>();\n private plugins: Array<{ plugin: Plugin; args: unknown[] }> = [];\n private unmountedCallback?: () => void;\n public router?: Router;\n\n constructor(private options: AppOptions<TState, TConfig, TRootProps> = {}) {\n this.appContext = {\n app: this as unknown as OneApp,\n version: '0.0.2',\n config: options.config || ({} as TConfig),\n };\n }\n\n private handleError(error: Error): void {\n console.error('应用错误:', error);\n // 渲染错误UI\n this.renderErrorUI(error);\n // 不立即卸载应用,而是显示错误信息\n }\n\n /**\n * 渲染错误UI\n */\n private renderErrorUI(error: Error): void {\n if (!this.container) {\n return;\n }\n\n this.container.innerHTML = `\n <div style=\"padding: 20px; background-color: #ffebee; color: #c62828; font-family: Arial, sans-serif;\">\n <h3>应用错误</h3>\n <p>${error.message}</p>\n <pre style=\"background-color: #fff; padding: 10px; border-radius: 4px; overflow: auto;\">${error.stack}</pre>\n </div>\n `;\n }\n\n /**\n * 使用插件\n */\n public use(plugin: Plugin, ...args: unknown[]): this {\n if (typeof plugin.install !== 'function') {\n throw new Error('插件必须提供 install 方法');\n }\n plugin.install(this as unknown as OneApp, ...args);\n this.plugins.push({ plugin, args });\n return this;\n }\n\n /**\n * 挂载应用\n */\n public mount(): void {\n if (this.mounted) {\n console.warn('应用已经处于运行状态');\n return;\n }\n\n const mountContainer = this.resolveMountContainer();\n if (!mountContainer) {\n return;\n }\n\n try {\n this.container = mountContainer;\n\n // 添加全局应用实例\n (globalThis as { __APP__?: unknown }).__APP__ = this;\n\n // 只有在有根组件时才创建实例\n if (this.options.root) {\n this.rootInstance = new this.options.root(this.options.rootProps);\n\n // 设置应用上下文\n if ('setAppContext' in this.rootInstance) {\n this.rootInstance.setAppContext(this.appContext);\n }\n\n // 如果有全局状态,传递给组件\n if (this.options.state && 'setState' in this.rootInstance) {\n this.rootInstance.setState(this.options.state);\n }\n\n this.rootInstance.mount(this.container);\n\n // 创建模板引擎实例\n this.templateEngine = new TemplateEngine(this.options.state || {});\n }\n\n this.mounted = true;\n\n // 触发生命周期钩子\n this.onMounted();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * 卸载应用\n */\n public unmount(): void {\n if (!this.mounted) {\n console.warn('应用未处于运行状态');\n return;\n }\n\n try {\n // 触发卸载前钩子\n this.onBeforeUnmount();\n\n if (this.rootInstance) {\n // 调用组件卸载方法\n if ('unmount' in this.rootInstance) {\n this.rootInstance.unmount();\n }\n\n this.rootInstance = null;\n this.mounted = false;\n delete (globalThis as { __APP__?: unknown }).__APP__;\n }\n\n // 清除模板引擎\n if (this.templateEngine) {\n this.templateEngine.clearBindings();\n this.templateEngine = null;\n }\n\n // 清空容器\n if (this.container) {\n this.container.innerHTML = '';\n }\n\n // 触发卸载后钩子\n if (this.unmountedCallback) {\n this.unmountedCallback();\n }\n } catch (error) {\n console.error('Failed to unmount app:', error);\n }\n }\n\n /**\n * 应用是否正在运行\n */\n public isRunning(): boolean {\n return this.mounted;\n }\n\n /**\n * 更新根组件\n */\n public updateRootComponent(\n component: ComponentConstructor<TRootProps>\n ): void {\n if (this.mounted) {\n this.unmount();\n }\n this.options.root = component;\n this.mount();\n }\n\n /**\n * 更新应用状态\n */\n public update(state?: Partial<TState>): this {\n if (!this.mounted) {\n console.warn('Cannot update unmounted app');\n return this;\n }\n\n try {\n // 更新状态\n if (state && this.options.state) {\n this.options.state = { ...this.options.state, ...state };\n\n // 更新组件状态\n if (this.rootInstance && 'setState' in this.rootInstance) {\n this.rootInstance.setState(state);\n }\n\n // 更新模板引擎状态\n if (this.templateEngine) {\n // 如果存在templateEngine,更新其状态\n this.templateEngine.state = this.options.state;\n }\n }\n\n // 触发更新钩子\n this.onUpdated();\n } catch (error) {\n console.error('Failed to update app:', error);\n }\n\n return this;\n }\n\n /**\n * 获取应用上下文\n */\n public getContext(): AppContext<TConfig> {\n return this.appContext;\n }\n\n public provide<T>(key: InjectionKey<T>, value: T): this {\n this.providers.set(key, value);\n return this;\n }\n\n public inject<T>(key: InjectionKey<T>): T | undefined;\n public inject<T>(key: InjectionKey<T>, fallback: T): T;\n public inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const result = this.resolveInjection(key);\n return result.found ? result.value : fallback;\n }\n\n public resolveInjection<T>(key: InjectionKey<T>): InjectionResult<T> {\n if (!this.providers.has(key)) {\n return { found: false, value: undefined };\n }\n\n return { found: true, value: this.providers.get(key) as T | undefined };\n }\n\n /**\n * 获取应用状态\n */\n public getState(): TState | undefined {\n return this.options.state;\n }\n\n /**\n * 设置应用状态\n */\n public setState(newState: TState): this {\n this.options.state = newState;\n if (this.mounted) {\n this.update();\n }\n return this;\n }\n\n /**\n * 监听应用卸载\n */\n public onUnmounted(callback: () => void): this {\n this.unmountedCallback = callback;\n return this;\n }\n\n /**\n * 生成应用入口 HTML 文档\n */\n public renderHtmlDocument(options: AppDocumentRenderOptions = {}): string {\n const appDocument = this.options.document ?? {};\n const scripts = this.mergeDocumentScripts(\n appDocument.scripts,\n options.scripts\n );\n\n return renderDocumentShell({\n ...appDocument,\n ...options,\n title: options.title ?? appDocument.title ?? 'TSone App',\n body: options.body ?? appDocument.body ?? this.createMountDocumentBody(),\n scripts,\n });\n }\n\n /**\n * 解析根元素\n */\n private resolveRootElement(selector?: string | Element): Element | null {\n if (!selector) {\n return null;\n }\n\n if (typeof selector === 'string') {\n if (typeof document === 'undefined') {\n return null;\n }\n\n return document.querySelector(selector);\n }\n\n return typeof Element !== 'undefined' && selector instanceof Element\n ? selector\n : null;\n }\n\n private resolveMountContainer(): HTMLElement | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const rootElement = this.resolveRootElement(\n this.options.rootElement ?? DEFAULT_ROOT_ELEMENT\n );\n return rootElement instanceof HTMLElement ? rootElement : null;\n }\n\n private createMountDocumentBody(): HtmlDocumentBody {\n const rootElement = this.options.rootElement ?? DEFAULT_ROOT_ELEMENT;\n\n if (typeof rootElement === 'string') {\n return this.createMountElementFromSelector(rootElement);\n }\n\n if (typeof Element !== 'undefined' && rootElement instanceof Element) {\n const props: Record<string, string> = {};\n if (rootElement.id) {\n props.id = rootElement.id;\n }\n if (rootElement.className) {\n props.className = rootElement.className;\n }\n\n return { tag: rootElement.tagName.toLowerCase(), props };\n }\n\n return Div({ props: { id: 'app' } });\n }\n\n private createMountElementFromSelector(selector: string): HtmlDocumentBody {\n if (selector.startsWith('#') && selector.length > 1) {\n return Div({ props: { id: selector.slice(1) } });\n }\n\n if (selector.startsWith('.') && selector.length > 1) {\n return Div({ props: { className: selector.slice(1) } });\n }\n\n return Div({ props: { 'data-tsone-root': selector } });\n }\n\n private mergeDocumentScripts(\n baseScripts?: HtmlScript[],\n extraScripts?: HtmlScript[]\n ): HtmlScript[] | undefined {\n if (!baseScripts && !extraScripts) {\n return undefined;\n }\n\n return [...(baseScripts ?? []), ...(extraScripts ?? [])];\n }\n\n // 生命周期钩子\n private onMounted(): void {\n // 触发插件的mounted钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onMounted === 'function') {\n pluginObj.onMounted(this as unknown as OneApp);\n }\n });\n }\n\n private onUpdated(): void {\n // 触发插件的updated钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onUpdated === 'function') {\n pluginObj.onUpdated(this as unknown as OneApp);\n }\n });\n }\n\n private onBeforeUnmount(): void {\n // 触发插件的beforeUnmount钩子\n this.plugins.forEach(({ plugin: pluginObj }) => {\n if (pluginObj && typeof pluginObj.onBeforeUnmount === 'function') {\n pluginObj.onBeforeUnmount(this as unknown as OneApp);\n }\n });\n }\n}\n\n/**\n * 创建应用实例\n */\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n>(\n options: AppOptions<TState, TConfig, TRootProps> = {}\n): OneApp<TState, TConfig, TRootProps> {\n return new OneApp<TState, TConfig, TRootProps>(options);\n}\n",
7
+ "import { getModelValue } from './model';\n\nexport type ValidationResult = boolean | string;\n\nexport type ValidationRule<T = unknown> = (\n value: T,\n model: object\n) => ValidationResult;\n\nexport type ValidationRules<TModel extends object> = {\n [TPath in keyof TModel & string]?: readonly ValidationRule[];\n} & Record<string, readonly ValidationRule[] | undefined>;\n\nexport interface FieldValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface FormValidationResult {\n valid: boolean;\n errors: Record<string, string[]>;\n}\n\nexport interface FormController<TModel extends object> {\n readonly model: TModel;\n readonly errors: Record<string, string[]>;\n validate(): FormValidationResult;\n validateField(path: string): FieldValidationResult;\n resetErrors(): void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction runRule(\n rule: ValidationRule,\n value: unknown,\n model: object\n): string | undefined {\n try {\n const result = rule(value, model);\n if (result === true) {\n return undefined;\n }\n return result === false ? 'Validation failed' : result;\n } catch (error) {\n return errorMessage(error);\n }\n}\n\nexport function required(message = 'This field is required'): ValidationRule {\n return (value) => {\n if (value === null || value === undefined) {\n return message;\n }\n if (typeof value === 'string' && value.trim().length === 0) {\n return message;\n }\n if (Array.isArray(value) && value.length === 0) {\n return message;\n }\n return true;\n };\n}\n\nexport function minLength(\n length: number,\n message = `Must be at least ${length} characters`\n): ValidationRule {\n return (value) =>\n typeof value === 'string' && value.length >= length ? true : message;\n}\n\nexport function validate(rule: ValidationRule): ValidationRule {\n return rule;\n}\n\nexport function createForm<TModel extends object>(\n model: TModel,\n rules: ValidationRules<TModel>\n): FormController<TModel> {\n const errors: Record<string, string[]> = {};\n\n const validateField = (path: string): FieldValidationResult => {\n const fieldRules = rules[path] ?? [];\n const value = getModelValue(model as Record<string, unknown>, path);\n const fieldErrors = fieldRules\n .map((rule) => runRule(rule, value, model))\n .filter((message): message is string => message !== undefined);\n\n if (fieldErrors.length === 0) {\n delete errors[path];\n } else {\n errors[path] = fieldErrors;\n }\n\n return { valid: fieldErrors.length === 0, errors: fieldErrors };\n };\n\n return {\n model,\n errors,\n validate(): FormValidationResult {\n const allErrors: Record<string, string[]> = {};\n Object.keys(rules).forEach((path) => {\n const result = validateField(path);\n if (!result.valid) {\n allErrors[path] = result.errors;\n }\n });\n return { valid: Object.keys(allErrors).length === 0, errors: allErrors };\n },\n validateField,\n resetErrors(): void {\n Object.keys(errors).forEach((path) => delete errors[path]);\n },\n };\n}\n",
8
+ "import { Component } from '../component';\nimport {\n normalizeTransitionGroupProps,\n validateTransitionGroupChildren,\n type TransitionGroupNode,\n type TransitionGroupProps,\n} from './types';\n\nexport class TransitionGroup extends Component<TransitionGroupProps> {\n protected initState(): object {\n return {};\n }\n\n protected initStyles(): void {}\n\n protected render(): TransitionGroupNode {\n const { tag, type, duration } = normalizeTransitionGroupProps(this.props);\n const children = validateTransitionGroupChildren(this.props.children ?? []);\n\n return {\n tag,\n props: this.props.elementProps,\n listeners: this.props.listeners,\n children,\n transitionGroup: {\n type,\n duration,\n },\n };\n }\n}\n",
9
+ "import { OneApp, AppOptions } from './core/app';\nimport type { ComponentProps } from './core/component';\n\n// 导出核心功能\nexport * from './core';\n\n// 导出路由功能\nexport * from './router';\n\n// 创建应用实例的主函数\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n>(\n options: AppOptions<TState, TConfig, TRootProps> = {}\n): OneApp<TState, TConfig, TRootProps> {\n return new OneApp(options);\n}\n\n// 导出框架名称和版本\nexport const version = '0.0.2';\nexport const name = '@geektech/tsone';\n"
7
10
  ],
8
- "mappings": "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",
9
- "debugId": "DBC150EE46E0D75764756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "7471E8A79DBDD62164756E2164756E21",
10
13
  "names": []
11
14
  }
@@ -1,6 +1,7 @@
1
1
  import { AnyComponentConstructor, Component } from '../core/component';
2
2
  import { OneApp } from '../core/app';
3
3
  import type { VNode } from '../core/vnode';
4
+ export { useRouter } from './instance';
4
5
  export type RouteMeta = Record<string, unknown>;
5
6
  export interface RouteRecord {
6
7
  path: string;
@@ -85,4 +86,3 @@ export declare class RouterView extends Component<object, RouterViewState> {
85
86
  protected render(): VNode;
86
87
  }
87
88
  export declare function createRouter(options: RouterOptions | RouteRecord[]): Router;
88
- export {};