@geektech/tsone 0.1.0 → 0.3.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.
package/dist/index.js.map CHANGED
@@ -1,14 +1,12 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../lib/core/document.ts", "../lib/core/app.ts", "../lib/core/form.ts", "../lib/core/animation/TransitionGroup.ts", "../lib/index.ts"],
3
+ "sources": ["../lib/core/form.ts", "../lib/core/animation/TransitionGroup.ts", "../lib/index.ts"],
4
4
  "sourcesContent": [
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
5
  "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
6
  "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
+ "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.3.0';\nexport const name = '@geektech/tsone';\n"
10
8
  ],
11
- "mappings": "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",
12
- "debugId": "7471E8A79DBDD62164756E2164756E21",
9
+ "mappings": "4uBA+BA,SAAS,CAAY,CAAC,EAAwB,CAC5C,OAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAG9D,SAAS,CAAO,CACd,EACA,EACA,EACoB,CACpB,GAAI,CACF,IAAM,EAAS,EAAK,EAAO,CAAK,EAChC,GAAI,IAAW,GACb,OAEF,OAAO,IAAW,GAAQ,oBAAsB,EAChD,MAAO,EAAO,CACd,OAAO,EAAa,CAAK,GAItB,SAAS,CAAQ,CAAC,EAAU,yBAA0C,CAC3E,MAAO,CAAC,IAAU,CAChB,GAAI,IAAU,MAAQ,IAAU,OAC9B,OAAO,EAET,GAAI,OAAO,IAAU,UAAY,EAAM,KAAK,EAAE,SAAW,EACvD,OAAO,EAET,GAAI,MAAM,QAAQ,CAAK,GAAK,EAAM,SAAW,EAC3C,OAAO,EAET,MAAO,IAIJ,SAAS,CAAS,CACvB,EACA,EAAU,oBAAoB,eACd,CAChB,MAAO,CAAC,IACN,OAAO,IAAU,UAAY,EAAM,QAAU,EAAS,GAAO,EAG1D,SAAS,CAAQ,CAAC,EAAsC,CAC7D,OAAO,EAGF,SAAS,CAAiC,CAC/C,EACA,EACwB,CACxB,IAAM,EAAmC,CAAC,EAEpC,EAAgB,CAAC,IAAwC,CAC7D,IAAM,EAAa,EAAM,IAAS,CAAC,EAC7B,EAAQ,EAAc,EAAkC,CAAI,EAC5D,EAAc,EACjB,IAAI,CAAC,IAAS,EAAQ,EAAM,EAAO,CAAK,CAAC,EACzC,OAAO,CAAC,IAA+B,IAAY,MAAS,EAE/D,GAAI,EAAY,SAAW,EACzB,OAAO,EAAO,GAEd,OAAO,GAAQ,EAGjB,MAAO,CAAE,MAAO,EAAY,SAAW,EAAG,OAAQ,CAAY,GAGhE,MAAO,CACL,QACA,SACA,QAAQ,EAAyB,CAC/B,IAAM,EAAsC,CAAC,EAO7C,OANA,OAAO,KAAK,CAAK,EAAE,QAAQ,CAAC,IAAS,CACnC,IAAM,EAAS,EAAc,CAAI,EACjC,GAAI,CAAC,EAAO,MACV,EAAU,GAAQ,EAAO,OAE5B,EACM,CAAE,MAAO,OAAO,KAAK,CAAS,EAAE,SAAW,EAAG,OAAQ,CAAU,GAEzE,gBACA,WAAW,EAAS,CAClB,OAAO,KAAK,CAAM,EAAE,QAAQ,CAAC,IAAS,OAAO,EAAO,EAAK,EAE7D,EC7GK,MAAM,UAAwB,CAAgC,CACzD,SAAS,EAAW,CAC5B,MAAO,CAAC,EAGA,UAAU,EAAS,EAEnB,MAAM,EAAwB,CACtC,IAAQ,MAAK,OAAM,YAAa,EAA8B,KAAK,KAAK,EAClE,EAAW,EAAgC,KAAK,MAAM,UAAY,CAAC,CAAC,EAE1E,MAAO,CACL,MACA,MAAO,KAAK,MAAM,aAClB,UAAW,KAAK,MAAM,UACtB,WACA,gBAAiB,CACf,OACA,UACF,CACF,EAEJ,CCpBO,SAAS,CAIf,CACC,EAAmD,CAAC,EACf,CACrC,OAAO,IAAI,EAAO,CAAO,EAIpB,IAAM,EAAU,QACV,EAAO",
10
+ "debugId": "8BE5D72DEC3451F664756E2164756E21",
13
11
  "names": []
14
12
  }
@@ -1,18 +1,4 @@
1
- import {
2
- Router,
3
- RouterLink,
4
- RouterView,
5
- createRouter,
6
- useRouter
7
- } from "../index-wv9gyjqt.js";
8
- import"../index-8wjswsye.js";
9
- export {
10
- useRouter,
11
- createRouter,
12
- RouterView,
13
- RouterLink,
14
- Router
15
- };
1
+ import{Aa as d,Ba as e,xa as a,ya as b,za as c}from"../index-p55hs6x8.js";import"../index-939sv8vt.js";export{b as Router,c as RouterLink,d as RouterView,e as createRouter,a as useRouter};
16
2
 
17
- //# debugId=82989EE75482A0ED64756E2164756E21
3
+ //# debugId=1CE84942670B29C264756E2164756E21
18
4
  //# sourceMappingURL=index.js.map
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "82989EE75482A0ED64756E2164756E21",
7
+ "debugId": "1CE84942670B29C264756E2164756E21",
8
8
  "names": []
9
9
  }
@@ -1,13 +1,4 @@
1
- import {
2
- renderStyleSheet
3
- } from "../index-vpx80nq5.js";
4
- import {
5
- StyleManager
6
- } from "../index-8wjswsye.js";
7
- export {
8
- renderStyleSheet,
9
- StyleManager
10
- };
1
+ import{Ca as f,Da as m}from"../index-939sv8vt.js";export{f as StyleManager,m as renderStyleSheet};
11
2
 
12
- //# debugId=F456C9A2F79BB87064756E2164756E21
3
+ //# debugId=B39E2B65F74EF00464756E2164756E21
13
4
  //# sourceMappingURL=index.js.map
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "F456C9A2F79BB87064756E2164756E21",
7
+ "debugId": "B39E2B65F74EF00464756E2164756E21",
8
8
  "names": []
9
9
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geektech/tsone",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "TSone 是轻量级纯 TypeScript 前端框架,提供响应式系统、类组件、策略化渲染和路由功能",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,6 +18,10 @@
18
18
  "./style": {
19
19
  "import": "./dist/style/index.js",
20
20
  "types": "./dist/style/index.d.ts"
21
+ },
22
+ "./dom": {
23
+ "import": "./dist/dom/index.js",
24
+ "types": "./dist/dom/index.d.ts"
21
25
  }
22
26
  },
23
27
  "scripts": {
@@ -39,6 +43,11 @@
39
43
  "router"
40
44
  ],
41
45
  "author": "Jimmie Max(Qianyu)",
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "git+https://github.com/geektech-team/tsone.git",
49
+ "directory": "packages/tsone"
50
+ },
42
51
  "license": "MIT",
43
52
  "engines": {
44
53
  "bun": ">=1.3.0"
@@ -1,63 +0,0 @@
1
- // lib/style/StyleManager.ts
2
- class StyleManager {
3
- styleElement;
4
- styles = new Map;
5
- constructor() {
6
- this.styleElement = document.createElement("style");
7
- document.head.appendChild(this.styleElement);
8
- }
9
- addStyle(name, options) {
10
- this.styles.set(name, options);
11
- this.updateStyles();
12
- }
13
- removeStyle(name) {
14
- this.styles.delete(name);
15
- this.updateStyles();
16
- }
17
- clearStyles() {
18
- this.styles.clear();
19
- this.styleElement.textContent = "";
20
- }
21
- destroy() {
22
- this.clearStyles();
23
- this.styleElement.remove();
24
- }
25
- convertToCSS(properties) {
26
- return Object.entries(properties).map(([key, value]) => {
27
- const cssKey = key.replace(/([A-Z])/g, "-$1").toLowerCase();
28
- return `${cssKey}: ${value};`;
29
- }).join(`
30
- `);
31
- }
32
- updateStyles() {
33
- let cssText = "";
34
- this.styles.forEach((style) => {
35
- cssText += `${style.selector} {
36
- ${this.convertToCSS(style.properties)}
37
- }
38
- `;
39
- if (style.hover) {
40
- cssText += `${style.selector}:hover {
41
- ${this.convertToCSS(style.hover)}
42
- }
43
- `;
44
- }
45
- if (style.media) {
46
- Object.entries(style.media).forEach(([query, properties]) => {
47
- cssText += `@media ${query} {
48
- ${style.selector} {
49
- ${this.convertToCSS(properties)}
50
- }
51
- }
52
- `;
53
- });
54
- }
55
- });
56
- this.styleElement.textContent = cssText;
57
- }
58
- }
59
-
60
- export { StyleManager };
61
-
62
- //# debugId=401A1B62728D384364756E2164756E21
63
- //# sourceMappingURL=index-8wjswsye.js.map
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../lib/style/StyleManager.ts"],
4
- "sourcesContent": [
5
- "export interface StyleOptions {\n selector: string;\n properties: Record<string, string | number>;\n hover?: Record<string, string | number>;\n media?: Record<string, Record<string, string | number>>;\n}\n\nexport class StyleManager {\n public styleElement: HTMLStyleElement;\n public styles: Map<string, StyleOptions> = new Map();\n\n constructor() {\n this.styleElement = document.createElement('style');\n document.head.appendChild(this.styleElement);\n }\n\n public addStyle(name: string, options: StyleOptions): void {\n this.styles.set(name, options);\n this.updateStyles();\n }\n\n public removeStyle(name: string): void {\n this.styles.delete(name);\n this.updateStyles();\n }\n\n public clearStyles(): void {\n this.styles.clear();\n this.styleElement.textContent = '';\n }\n\n public destroy(): void {\n this.clearStyles();\n this.styleElement.remove();\n }\n\n private convertToCSS(properties: Record<string, string | number>): string {\n return Object.entries(properties)\n .map(([key, value]) => {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssKey}: ${value};`;\n })\n .join('\\n');\n }\n\n private updateStyles(): void {\n let cssText = '';\n\n this.styles.forEach((style) => {\n // 基础样式\n cssText += `${style.selector} {\\n${this.convertToCSS(style.properties)}\\n}\\n`;\n\n // hover 样式\n if (style.hover) {\n cssText += `${style.selector}:hover {\\n${this.convertToCSS(style.hover)}\\n}\\n`;\n }\n\n // media 查询\n if (style.media) {\n Object.entries(style.media).forEach(([query, properties]) => {\n cssText += `@media ${query} {\\n${style.selector} {\\n${this.convertToCSS(properties)}\\n}\\n}\\n`;\n });\n }\n });\n\n this.styleElement.textContent = cssText;\n }\n}\n"
6
- ],
7
- "mappings": ";AAOO,MAAM,aAAa;AAAA,EACjB;AAAA,EACA,SAAoC,IAAI;AAAA,EAE/C,WAAW,GAAG;AAAA,IACZ,KAAK,eAAe,SAAS,cAAc,OAAO;AAAA,IAClD,SAAS,KAAK,YAAY,KAAK,YAAY;AAAA;AAAA,EAGtC,QAAQ,CAAC,MAAc,SAA6B;AAAA,IACzD,KAAK,OAAO,IAAI,MAAM,OAAO;AAAA,IAC7B,KAAK,aAAa;AAAA;AAAA,EAGb,WAAW,CAAC,MAAoB;AAAA,IACrC,KAAK,OAAO,OAAO,IAAI;AAAA,IACvB,KAAK,aAAa;AAAA;AAAA,EAGb,WAAW,GAAS;AAAA,IACzB,KAAK,OAAO,MAAM;AAAA,IAClB,KAAK,aAAa,cAAc;AAAA;AAAA,EAG3B,OAAO,GAAS;AAAA,IACrB,KAAK,YAAY;AAAA,IACjB,KAAK,aAAa,OAAO;AAAA;AAAA,EAGnB,YAAY,CAAC,YAAqD;AAAA,IACxE,OAAO,OAAO,QAAQ,UAAU,EAC7B,IAAI,EAAE,KAAK,WAAW;AAAA,MACrB,MAAM,SAAS,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AAAA,MAC1D,OAAO,GAAG,WAAW;AAAA,KACtB,EACA,KAAK;AAAA,CAAI;AAAA;AAAA,EAGN,YAAY,GAAS;AAAA,IAC3B,IAAI,UAAU;AAAA,IAEd,KAAK,OAAO,QAAQ,CAAC,UAAU;AAAA,MAE7B,WAAW,GAAG,MAAM;AAAA,EAAe,KAAK,aAAa,MAAM,UAAU;AAAA;AAAA;AAAA,MAGrE,IAAI,MAAM,OAAO;AAAA,QACf,WAAW,GAAG,MAAM;AAAA,EAAqB,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA;AAAA,MACxE;AAAA,MAGA,IAAI,MAAM,OAAO;AAAA,QACf,OAAO,QAAQ,MAAM,KAAK,EAAE,QAAQ,EAAE,OAAO,gBAAgB;AAAA,UAC3D,WAAW,UAAU;AAAA,EAAY,MAAM;AAAA,EAAe,KAAK,aAAa,UAAU;AAAA;AAAA;AAAA;AAAA,SACnF;AAAA,MACH;AAAA,KACD;AAAA,IAED,KAAK,aAAa,cAAc;AAAA;AAEpC;",
8
- "debugId": "401A1B62728D384364756E2164756E21",
9
- "names": []
10
- }
@@ -1,32 +0,0 @@
1
- // lib/style/sheet.ts
2
- function renderStyleSheet(styles) {
3
- return styles.map((entry) => renderStyleEntry(entry)).join(`
4
-
5
- `);
6
- }
7
- function renderStyleEntry(entry, indent = "") {
8
- if ("atRule" in entry) {
9
- const rules = entry.rules.map((rule) => renderStyleEntry(rule, `${indent} `)).join(`
10
-
11
- `);
12
- return `${indent}${entry.atRule} {
13
- ${rules}
14
- ${indent}}`;
15
- }
16
- const declarations = Object.entries(entry.properties).map(([property, value]) => `${indent} ${toCssProperty(property)}: ${String(value)};`).join(`
17
- `);
18
- return `${indent}${entry.selector} {
19
- ${declarations}
20
- ${indent}}`;
21
- }
22
- function toCssProperty(property) {
23
- if (property.startsWith("--") || property.includes("-")) {
24
- return property;
25
- }
26
- return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
27
- }
28
-
29
- export { renderStyleSheet };
30
-
31
- //# debugId=61B1187B7ADC17DB64756E2164756E21
32
- //# sourceMappingURL=index-vpx80nq5.js.map
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../lib/style/sheet.ts"],
4
- "sourcesContent": [
5
- "export type StyleValue = string | number;\n\nexport type StyleProperties = Record<string, StyleValue>;\n\nexport interface StyleRule {\n selector: string;\n properties: StyleProperties;\n}\n\nexport interface StyleAtRule {\n atRule: string;\n rules: StyleRule[];\n}\n\nexport type StyleSheetEntry = StyleRule | StyleAtRule;\n\nexport type StyleSheet = StyleSheetEntry[];\n\nexport function renderStyleSheet(styles: StyleSheet): string {\n return styles.map((entry) => renderStyleEntry(entry)).join('\\n\\n');\n}\n\nfunction renderStyleEntry(entry: StyleSheetEntry, indent = ''): string {\n if ('atRule' in entry) {\n const rules = entry.rules\n .map((rule) => renderStyleEntry(rule, `${indent} `))\n .join('\\n\\n');\n\n return `${indent}${entry.atRule} {\\n${rules}\\n${indent}}`;\n }\n\n const declarations = Object.entries(entry.properties)\n .map(\n ([property, value]) =>\n `${indent} ${toCssProperty(property)}: ${String(value)};`\n )\n .join('\\n');\n\n return `${indent}${entry.selector} {\\n${declarations}\\n${indent}}`;\n}\n\nfunction toCssProperty(property: string): string {\n if (property.startsWith('--') || property.includes('-')) {\n return property;\n }\n\n return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n"
6
- ],
7
- "mappings": ";AAkBO,SAAS,gBAAgB,CAAC,QAA4B;AAAA,EAC3D,OAAO,OAAO,IAAI,CAAC,UAAU,iBAAiB,KAAK,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA;AAGnE,SAAS,gBAAgB,CAAC,OAAwB,SAAS,IAAY;AAAA,EACrE,IAAI,YAAY,OAAO;AAAA,IACrB,MAAM,QAAQ,MAAM,MACjB,IAAI,CAAC,SAAS,iBAAiB,MAAM,GAAG,UAAU,CAAC,EACnD,KAAK;AAAA;AAAA,CAAM;AAAA,IAEd,OAAO,GAAG,SAAS,MAAM;AAAA,EAAa;AAAA,EAAU;AAAA,EAClD;AAAA,EAEA,MAAM,eAAe,OAAO,QAAQ,MAAM,UAAU,EACjD,IACC,EAAE,UAAU,WACV,GAAG,WAAW,cAAc,QAAQ,MAAM,OAAO,KAAK,IAC1D,EACC,KAAK;AAAA,CAAI;AAAA,EAEZ,OAAO,GAAG,SAAS,MAAM;AAAA,EAAe;AAAA,EAAiB;AAAA;AAG3D,SAAS,aAAa,CAAC,UAA0B;AAAA,EAC/C,IAAI,SAAS,WAAW,IAAI,KAAK,SAAS,SAAS,GAAG,GAAG;AAAA,IACvD,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAS,QAAQ,UAAU,CAAC,UAAU,IAAI,MAAM,YAAY,GAAG;AAAA;",
8
- "debugId": "61B1187B7ADC17DB64756E2164756E21",
9
- "names": []
10
- }