fusee-framework 1.6.0 → 1.8.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 (129) hide show
  1. package/README.md +145 -123
  2. package/app/benchmark/benchmark.js +633 -0
  3. package/app/benchmark/index.html +102 -0
  4. package/app/benchmark/styles.css +249 -0
  5. package/app/components/Counter.js +17 -7
  6. package/app/components/CounterSection.js +3 -4
  7. package/app/main.js +50 -62
  8. package/app/main.ts +78 -63
  9. package/app/pages/404.js +16 -0
  10. package/app/pages/[...all].js +35 -0
  11. package/app/pages/[...all].ts +35 -0
  12. package/app/pages/_layout.js +53 -0
  13. package/app/pages/_layout.ts +26 -0
  14. package/app/pages/about.js +23 -0
  15. package/app/pages/about.ts +29 -0
  16. package/app/pages/async-work.js +65 -0
  17. package/app/pages/composables.js +158 -0
  18. package/app/pages/composables.ts +158 -0
  19. package/app/pages/dynamic.js +40 -0
  20. package/app/pages/dynamic.ts +40 -0
  21. package/app/pages/index.js +137 -0
  22. package/app/pages/index.ts +87 -0
  23. package/app/pages/login.ts +21 -0
  24. package/app/pages/objects/[id].js +56 -0
  25. package/app/pages/objects/[id].ts +56 -0
  26. package/app/pages/posts/[category]/[slug].js +56 -0
  27. package/app/pages/posts/[category]/[slug].ts +56 -0
  28. package/app/pages/router-example.js +79 -0
  29. package/app/pages/router-example.ts +56 -0
  30. package/app/pages/scroll-demo.ts +102 -0
  31. package/app/pages/test-for.js +65 -0
  32. package/app/pages/test-for.ts +80 -0
  33. package/app/pages/users/[id].js +24 -0
  34. package/app/pages/users/[id].ts +46 -0
  35. package/app/pages/users/index.js +22 -0
  36. package/app/pages/users/index.ts +29 -0
  37. package/app/pages/users.js +43 -0
  38. package/app/pages/users.ts +78 -0
  39. package/app/providers/ChildComponent.js +8 -2
  40. package/app/providers/ChildComponent.ts +47 -47
  41. package/app/providers/GrandchildComponent.js +19 -0
  42. package/app/providers/ParentComponent.js +5 -1
  43. package/app/routes/About.js +1 -1
  44. package/app/routes/About.ts +1 -1
  45. package/app/routes/AuthRoutes.ts +41 -0
  46. package/app/routes/Home.js +9 -0
  47. package/app/routes/NotFound.js +16 -0
  48. package/app/routes/NotFound.ts +16 -0
  49. package/app/routes/RouterExample.js +78 -0
  50. package/app/routes/RouterExample.ts +56 -0
  51. package/app/routes/TestResource.js +47 -0
  52. package/app/routes/WildcardDemo.js +35 -0
  53. package/app/routes/WildcardDemo.ts +35 -0
  54. package/app/services.js +15 -0
  55. package/auto-imports.d.ts +9 -0
  56. package/bin/create-fusee-linux +0 -0
  57. package/bin/create-fusee-mac-arm64 +0 -0
  58. package/bin/create-fusee-mac-intel +0 -0
  59. package/bin/create-fusee-win.exe +0 -0
  60. package/bin/create-fusee.exe +0 -0
  61. package/bin/index.js +38 -0
  62. package/create-fusee-go/cmd/generate.go +72 -0
  63. package/create-fusee-go/cmd/init.go +38 -0
  64. package/create-fusee-go/cmd/root.go +121 -0
  65. package/create-fusee-go/go.mod +10 -0
  66. package/create-fusee-go/go.sum +10 -0
  67. package/create-fusee-go/internal/assets/assets.go +78 -0
  68. package/create-fusee-go/internal/assets/embed/framework/auto-import-preset.js +9 -0
  69. package/create-fusee-go/internal/assets/embed/framework/core/compiler.js +253 -0
  70. package/create-fusee-go/internal/assets/embed/framework/core/component.js +266 -0
  71. package/create-fusee-go/internal/assets/embed/framework/core/composable.js +27 -0
  72. package/create-fusee-go/internal/assets/embed/framework/core/directives.js +875 -0
  73. package/create-fusee-go/internal/assets/embed/framework/core/evaluator.js +153 -0
  74. package/create-fusee-go/internal/assets/embed/framework/core/event-delegation.js +191 -0
  75. package/create-fusee-go/internal/assets/embed/framework/core/signal.js +412 -0
  76. package/create-fusee-go/internal/assets/embed/framework/core/store.js +81 -0
  77. package/create-fusee-go/internal/assets/embed/framework/index.d.ts +3 -0
  78. package/create-fusee-go/internal/assets/embed/framework/index.js +10 -0
  79. package/create-fusee-go/internal/assets/embed/framework/router/file-router.js +177 -0
  80. package/create-fusee-go/internal/assets/embed/framework/router/router.js +462 -0
  81. package/create-fusee-go/internal/assets/embed/framework/types/compiler.d.ts +15 -0
  82. package/create-fusee-go/internal/assets/embed/framework/types/component.d.ts +88 -0
  83. package/create-fusee-go/internal/assets/embed/framework/types/composable.d.ts +14 -0
  84. package/create-fusee-go/internal/assets/embed/framework/types/directives.d.ts +55 -0
  85. package/create-fusee-go/internal/assets/embed/framework/types/evaluator.d.ts +13 -0
  86. package/create-fusee-go/internal/assets/embed/framework/types/event-delegation.d.ts +32 -0
  87. package/create-fusee-go/internal/assets/embed/framework/types/index.d.ts +22 -0
  88. package/create-fusee-go/internal/assets/embed/framework/types/router.d.ts +32 -0
  89. package/create-fusee-go/internal/assets/embed/framework/types/signal.d.ts +79 -0
  90. package/create-fusee-go/internal/assets/embed/framework/types/store.d.ts +8 -0
  91. package/create-fusee-go/internal/assets/templates/Counter.tmpl +26 -0
  92. package/create-fusee-go/internal/assets/templates/component.tmpl +11 -0
  93. package/create-fusee-go/internal/assets/templates/components/Loading.tmpl +24 -0
  94. package/create-fusee-go/internal/assets/templates/index.html.tmpl +15 -0
  95. package/create-fusee-go/internal/assets/templates/main.tmpl +14 -0
  96. package/create-fusee-go/internal/assets/templates/package.json.tmpl +14 -0
  97. package/create-fusee-go/internal/assets/templates/page.tmpl +12 -0
  98. package/create-fusee-go/internal/assets/templates/pages/about.tmpl +20 -0
  99. package/create-fusee-go/internal/assets/templates/pages/index.tmpl +22 -0
  100. package/create-fusee-go/internal/assets/templates/pages/layout.tmpl +18 -0
  101. package/create-fusee-go/internal/assets/templates/tsconfig.json.tmpl +14 -0
  102. package/create-fusee-go/internal/assets/templates/vite.config.js.tmpl +18 -0
  103. package/create-fusee-go/main.go +7 -0
  104. package/framework/auto-import-preset.js +13 -9
  105. package/framework/core/compiler.js +252 -249
  106. package/framework/core/component.js +279 -260
  107. package/framework/core/di.js +187 -0
  108. package/framework/core/directives.js +819 -786
  109. package/framework/core/evaluator.js +153 -70
  110. package/framework/core/event-delegation.js +33 -14
  111. package/framework/core/reconcile.js +151 -0
  112. package/framework/core/signal.js +679 -403
  113. package/framework/core/store.js +322 -81
  114. package/framework/index.js +12 -11
  115. package/framework/router/file-router.js +177 -0
  116. package/framework/router/router.js +554 -80
  117. package/framework/types/component.d.ts +89 -88
  118. package/framework/types/di.d.ts +43 -0
  119. package/framework/types/event-delegation.d.ts +0 -58
  120. package/framework/types/index.d.ts +32 -22
  121. package/framework/types/reconcile.d.ts +7 -0
  122. package/framework/types/router.d.ts +42 -15
  123. package/framework/types/signal.d.ts +147 -78
  124. package/framework/types/store.d.ts +66 -8
  125. package/index.html +638 -626
  126. package/package.json +5 -3
  127. package/tsconfig.json +1 -0
  128. package/vite.config.js +7 -1
  129. /package/{framework → create-fusee-go/internal/assets/embed/framework}/bin/create-fusee.js +0 -0
@@ -1,88 +1,89 @@
1
- export type ComponentProps = Record<string, any>
2
- export type EmptyProps = Record<string, never>
3
- export type PropSchema = string[] | Record<string, PropConfig>
4
-
5
- export type PropConfig = {
6
- type?: FunctionConstructor | StringConstructor | NumberConstructor | BooleanConstructor
7
- default?: any | (() => any)
8
- required?: boolean
9
- }
10
-
11
- export type EmitFn = (eventName: string, ...args: any[]) => void
12
-
13
- export type Slots = Record<string, string>
14
-
15
- export type SetupContext = {
16
- emit: EmitFn
17
- slots: Slots
18
- }
19
-
20
- export type ComponentInstance = {
21
- props: ComponentProps
22
- _mountHooks: (() => void)[]
23
- _unmountHooks: (() => void)[]
24
- _effects: import('./signal').EffectRunner[]
25
- _element: HTMLElement | null
26
- _provides: Record<string, any>
27
- _parent: ComponentInstance | null
28
- }
29
-
30
- export type ComponentResult = {
31
- template: string
32
- [key: string]: any
33
- }
34
-
35
- export type ComponentOptions<TProps = ComponentProps, P = PropSchema> = {
36
- props?: P
37
- components?: Record<string, ComponentFactory<any>>
38
- setup: (props: TProps, ctx: SetupContext) => ComponentResult
39
- }
40
-
41
- export type ComponentFactory<TProps = ComponentProps> = (
42
- props?: TProps,
43
- options?: { listeners?: Record<string, Function>, slots?: Slots, parent?: ComponentInstance }
44
- ) => ComponentApi
45
-
46
- export type ComponentApi = {
47
- render: (container: HTMLElement) => ComponentInstance
48
- unmount: () => void
49
- instance: ComponentInstance
50
- }
51
-
52
- export declare function onMount(fn: () => void): void
53
- export declare function onUnmount(fn: () => void): void
54
- export declare function parseSlots(slotHTML: string): Slots
55
- export declare function getCurrentInstance(): ComponentInstance | null
56
-
57
- export declare function provide<T>(key: string, value: T): void
58
- export declare function inject<T>(key: string): T | null
59
-
60
- type InferPropType<T> = T extends StringConstructor ? string :
61
- T extends NumberConstructor ? number :
62
- T extends BooleanConstructor ? boolean :
63
- any;
64
-
65
- type InferProps<P> = P extends string[]
66
- ? Record<P[number], any>
67
- : P extends Record<string, PropConfig>
68
- ? {
69
- [K in keyof P]: P[K]['required'] extends true
70
- ? InferPropType<P[K]['type']>
71
- : InferPropType<P[K]['type']> | (P[K] extends { default: any } ? never : undefined)
72
- }
73
- : Record<string, any>;
74
-
75
- export declare function defineComponent<P extends PropSchema = any, TProps = InferProps<P>>(
76
- options: ComponentOptions<TProps, P>
77
- ): ComponentFactory<TProps>
78
-
79
- export type AsyncComponentLoader<TProps = ComponentProps> = () => Promise<ComponentFactory<TProps> | { default: ComponentFactory<TProps> } | Record<string, any>>
80
-
81
- export type AsyncComponentOptions<TProps = ComponentProps> = {
82
- loader: AsyncComponentLoader<TProps>
83
- loadingComponent?: ComponentFactory<any>
84
- }
85
-
86
- export declare function defineAsyncComponent<TProps = ComponentProps>(
87
- loaderOrOptions: AsyncComponentLoader<TProps> | AsyncComponentOptions<TProps>
88
- ): ComponentFactory<TProps>
1
+ export type ComponentProps = Record<string, any>
2
+ export type EmptyProps = Record<string, never>
3
+ export type PropSchema = string[] | Record<string, PropConfig>
4
+
5
+ export type PropConfig = {
6
+ type?: FunctionConstructor | StringConstructor | NumberConstructor | BooleanConstructor
7
+ default?: any | (() => any)
8
+ required?: boolean
9
+ }
10
+
11
+ export type EmitFn = (eventName: string, ...args: any[]) => void
12
+
13
+ export type Slots = Record<string, string>
14
+
15
+ export type SetupContext = {
16
+ emit: EmitFn
17
+ slots: Slots
18
+ }
19
+
20
+ export type ComponentInstance = {
21
+ props: ComponentProps
22
+ _mountHooks: (() => void)[]
23
+ _unmountHooks: (() => void)[]
24
+ _effects: import('./signal').EffectRunner[]
25
+ _element: HTMLElement | null
26
+ _parent: ComponentInstance | null
27
+ _injector: import('./di').Injector
28
+ _ownsInjector: boolean
29
+ }
30
+
31
+ export type ComponentResult = {
32
+ template: string
33
+ [key: string]: any
34
+ }
35
+
36
+ export type ComponentOptions<TProps = ComponentProps, P = PropSchema> = {
37
+ props?: P
38
+ components?: Record<string, ComponentFactory<any>>
39
+ setup: (props: TProps, ctx: SetupContext) => ComponentResult
40
+ }
41
+
42
+ export type ComponentFactory<TProps = ComponentProps> = (
43
+ props?: TProps,
44
+ options?: { listeners?: Record<string, Function>, slots?: Slots, parent?: ComponentInstance }
45
+ ) => ComponentApi
46
+
47
+ export type ComponentApi = {
48
+ render: (container: HTMLElement) => ComponentInstance
49
+ unmount: () => void
50
+ instance: ComponentInstance
51
+ }
52
+
53
+ export declare function onMount(fn: () => void): void
54
+ export declare function onUnmount(fn: () => void): void
55
+ export declare function parseSlots(slotHTML: string): Slots
56
+ export declare function getCurrentInstance(): ComponentInstance | null
57
+
58
+ export declare function provide(keyOrProvider: any, value?: any): void
59
+ export { inject } from './di'
60
+
61
+ type InferPropType<T> = T extends StringConstructor ? string :
62
+ T extends NumberConstructor ? number :
63
+ T extends BooleanConstructor ? boolean :
64
+ any;
65
+
66
+ type InferProps<P> = P extends string[]
67
+ ? Record<P[number], any>
68
+ : P extends Record<string, PropConfig>
69
+ ? {
70
+ [K in keyof P]: P[K]['required'] extends true
71
+ ? InferPropType<P[K]['type']>
72
+ : InferPropType<P[K]['type']> | (P[K] extends { default: any } ? never : undefined)
73
+ }
74
+ : Record<string, any>;
75
+
76
+ export declare function defineComponent<P extends PropSchema = any, TProps = InferProps<P>>(
77
+ options: ComponentOptions<TProps, P>
78
+ ): ComponentFactory<TProps>
79
+
80
+ export type AsyncComponentLoader<TProps = ComponentProps> = () => Promise<ComponentFactory<TProps> | { default: ComponentFactory<TProps> } | Record<string, any>>
81
+
82
+ export type AsyncComponentOptions<TProps = ComponentProps> = {
83
+ loader: AsyncComponentLoader<TProps>
84
+ loadingComponent?: ComponentFactory<any>
85
+ }
86
+
87
+ export declare function defineAsyncComponent<TProps = ComponentProps>(
88
+ loaderOrOptions: AsyncComponentLoader<TProps> | AsyncComponentOptions<TProps>
89
+ ): ComponentFactory<TProps>
@@ -0,0 +1,43 @@
1
+ export declare class InjectionToken<T = any> {
2
+ constructor(description: string);
3
+ description: string;
4
+ toString(): string;
5
+ }
6
+
7
+ export declare function isClass(fn: any): boolean;
8
+
9
+ export interface InjectOptions {
10
+ optional?: boolean;
11
+ skipSelf?: boolean;
12
+ self?: boolean;
13
+ }
14
+
15
+ export declare abstract class Injector {
16
+ get<T>(token: any, options?: InjectOptions): T;
17
+ }
18
+
19
+ export declare class NullInjector extends Injector {
20
+ get<T>(token: any, options?: InjectOptions): T | null;
21
+ }
22
+
23
+ export declare type Provider =
24
+ | any // class (shorthand)
25
+ | { provide: any, useClass: any }
26
+ | { provide: any, useValue: any }
27
+ | { provide: any, useFactory: () => any }
28
+ | { provide: any, useExisting: any };
29
+
30
+ export declare class EnvironmentInjector extends Injector {
31
+ constructor(providers?: Provider[], parent?: Injector);
32
+ parent: Injector;
33
+ provide(provider: Provider): void;
34
+ get<T>(token: any, options?: InjectOptions): T;
35
+ createChild(providers?: Provider[]): EnvironmentInjector;
36
+ destroy(): void;
37
+ }
38
+
39
+ export declare function runInContext<T>(injector: Injector, fn: () => T): T;
40
+ export declare function replaceActiveInjector(injector: Injector): void;
41
+ export declare function inject<T>(token: any, options: InjectOptions & { optional: true }): T | null;
42
+ export declare function inject<T>(token: any, options?: InjectOptions): T;
43
+
@@ -1,40 +1,13 @@
1
- // ─── Event Delegation Types ────────────────────────────────────────────────
2
-
3
- /**
4
- * Set of standard events that support delegation.
5
- * These events bubble and are commonly used in UI interactions.
6
- */
7
1
  export const DELEGATED_EVENTS: Set<string>
8
2
 
9
- /**
10
- * Check if an event type is delegated.
11
- * @param eventName - The event name to check (e.g., 'click', 'keydown')
12
- * @returns True if the event can be delegated
13
- */
14
3
  export function isDelegatedEvent(eventName: string): boolean
15
4
 
16
- /**
17
- * Options for registering a delegated event.
18
- */
19
5
  export interface DelegatedEventOptions {
20
- /** Event modifiers (e.g., 'prevent', 'stop', 'debounce', 'throttle') */
21
6
  modifiers?: string[]
22
- /** Component context for evaluating expressions */
23
7
  context?: Record<string, any>
24
- /** Expression string to evaluate */
25
8
  expr?: string
26
9
  }
27
10
 
28
- /**
29
- * Register a delegated event handler for an element.
30
- * Creates a single document-level listener if not already present.
31
- *
32
- * @param element - The DOM element to register
33
- * @param eventType - The event type (e.g., 'click', 'input')
34
- * @param handler - The event handler function
35
- * @param options - Optional configuration
36
- * @returns Cleanup function to remove the handler
37
- */
38
11
  export function registerDelegatedEvent(
39
12
  element: Element,
40
13
  eventType: string,
@@ -42,16 +15,6 @@ export function registerDelegatedEvent(
42
15
  options?: DelegatedEventOptions
43
16
  ): () => void
44
17
 
45
- /**
46
- * Create a wrapped event handler with modifier support.
47
- * Supports: prevent, stop, self, debounce, throttle, keyboard modifiers.
48
- *
49
- * @param handler - The original handler (function or expression)
50
- * @param modifiers - Array of modifier names
51
- * @param context - Component context for evaluating expressions
52
- * @param expr - Expression string (when handler is a string)
53
- * @returns Wrapped handler function
54
- */
55
18
  export function createEventHandler(
56
19
  handler: Function | string,
57
20
  modifiers: string[],
@@ -59,29 +22,8 @@ export function createEventHandler(
59
22
  expr: string
60
23
  ): (event: Event) => void
61
24
 
62
- /**
63
- * Event handler syntax preference.
64
- * Use @ prefix for delegated events (optimized, single document listener).
65
- * Use on: prefix for native events (individual element listeners, full event control).
66
- *
67
- * @example
68
- * // Delegated - efficient for many elements
69
- * <button @click="handleClick">Click</button>
70
- *
71
- * @example
72
- * // Native - full control including stopPropagation
73
- * <button on:click="handleClick">Click</button>
74
- *
75
- * @example
76
- * // With modifiers
77
- * <form @submit.prevent="handleSubmit">Submit</form>
78
- * <input @keydown.enter="handleEnter" />
79
- * <input @input.debounce="handleInput" />
80
- */
81
25
  export interface EventHandlerSyntax {
82
- /** Delegated event: @click, @input, @keydown, etc. */
83
26
  delegated: `@${string}`
84
- /** Native event: on:click, on:input, on:custom, etc. */
85
27
  native: `on:${string}`
86
28
  }
87
29
 
@@ -1,22 +1,32 @@
1
- export * from './signal'
2
- export * from './component'
3
- export * from './composable'
4
- export * from './router'
5
- export * from './compiler'
6
- export * from './directives'
7
- export * from './store'
8
- export * from './event-delegation'
9
-
10
- declare global {
11
- type Signal<T = any> = import('./signal').Signal<T>
12
- type Computed<T = any> = import('./signal').Computed<T>
13
- type SignalAccessor<T> = import('./signal').SignalAccessor<T>
14
- type Composable<T extends (...args: any[]) => any> = import('./composable').Composable<T>
15
- type DirectiveBinding<V = any> = import('./directives').DirectiveBinding<V>
16
- type DirectiveHooks<V = any> = import('./directives').DirectiveHooks<V>
17
- type DelegatedEventOptions = import('./event-delegation').DelegatedEventOptions
18
- const defineStore: typeof import('./store').defineStore
19
- const isDelegatedEvent: typeof import('./event-delegation').isDelegatedEvent
20
- }
21
-
22
- export as namespace Fusee
1
+ export * from './signal'
2
+ export * from './component'
3
+ export * from './composable'
4
+ export * from './router'
5
+ export * from './compiler'
6
+ export * from './directives'
7
+ export * from './store'
8
+ export * from './event-delegation'
9
+ export * from './di'
10
+ export * from './reconcile'
11
+
12
+ declare global {
13
+ type Signal<T = any> = import('./signal').Signal<T>
14
+ type Computed<T = any> = import('./signal').Computed<T>
15
+ type SignalAccessor<T> = import('./signal').SignalAccessor<T>
16
+ type Composable<T extends (...args: any[]) => any> = import('./composable').Composable<T>
17
+ type DirectiveBinding<V = any> = import('./directives').DirectiveBinding<V>
18
+ type DirectiveHooks<V = any> = import('./directives').DirectiveHooks<V>
19
+ type DelegatedEventOptions = import('./event-delegation').DelegatedEventOptions
20
+ const defineStore: typeof import('./store').defineStore
21
+ const storeToRefs: typeof import('./store').storeToRefs
22
+ const storeToState: typeof import('./store').storeToState
23
+ const storeToGetters: typeof import('./store').storeToGetters
24
+ const useNestedStore: typeof import('./store').useNestedStore
25
+ type StoreHook<T> = import('./store').StoreHook<T>
26
+ const isDelegatedEvent: typeof import('./event-delegation').isDelegatedEvent
27
+ const InjectionToken: typeof import('./di').InjectionToken
28
+ const provideGlobal: typeof import('./di').provideGlobal
29
+ const reconcile: typeof import('./reconcile').reconcile
30
+ }
31
+
32
+ export as namespace Fusee
@@ -0,0 +1,7 @@
1
+ export function reconcile<T = any>(
2
+ container: Element,
3
+ oldList: T[],
4
+ newList: T[],
5
+ keyFn: (item: T) => any,
6
+ createFn: (item: T) => Element
7
+ ): void;
@@ -1,15 +1,42 @@
1
- import type { ComponentApi } from './component'
2
-
3
- export type Route = {
4
- path: string
5
- component: () => ComponentApi
6
- }
7
-
8
- export type Router = {
9
- navigate: (path: string) => void
10
- destroy: () => void
11
- }
12
-
13
- export declare function createRouter(routes: Route[]): Router
14
- export declare function navigate(path: string): void
15
- export declare function mountOutlet(el: HTMLElement): void
1
+ import type { ComponentApi, ComponentFactory } from './component'
2
+ import type { Signal } from './signal'
3
+
4
+ export type Route = {
5
+ path: string | string[]
6
+ component: ComponentFactory<any>
7
+ children?: Route[]
8
+ }
9
+
10
+ export type ScrollPosition = { left: number; top: number } | { selector: string } | false
11
+
12
+ export type ScrollBehaviorOptions = {
13
+ scrollToTop?: boolean
14
+ scrollToAnchor?: boolean
15
+ saveScrollPosition?: boolean
16
+ custom?: (to: string, from: string, savedPosition: ScrollPosition | null) => ScrollPosition | Promise<ScrollPosition>
17
+ }
18
+
19
+ export type Router = {
20
+ navigate: (path: string) => void
21
+ destroy: () => void
22
+ }
23
+
24
+ export type RouteParams = Record<string, string>
25
+
26
+ export declare const currentRoute: Signal<string>
27
+ export declare const routeParams: Signal<RouteParams>
28
+ export declare const routeQuery: Signal<Record<string, string>>
29
+ export declare const matchedRoutes: Signal<Route[]>
30
+
31
+ export declare function createRouter(routes: Route[], options?: { cacheSize?: number; routerViewTimeout?: number; scrollBehavior?: ScrollBehaviorOptions }): Router
32
+ export declare function navigate(path: string): void
33
+ export declare function mountOutlet(el: HTMLElement): void
34
+
35
+ export type FileRouterOptions = {
36
+ loadingComponent?: ComponentFactory<any>
37
+ }
38
+
39
+ export declare function generateRoutes(
40
+ globResults: Record<string, () => Promise<any>>,
41
+ options?: FileRouterOptions
42
+ ): Route[]
@@ -1,78 +1,147 @@
1
- export type SignalAccessor<T> = {
2
- (): T;
3
- (newValue: T): void;
4
- isSignal: boolean;
5
- }
6
-
7
- export interface ReactiveArrayMethods<T> {
8
- map<U>(callbackfn: (value: T, index: number, array: T[]) => U): Computed<U[]>;
9
- filter(predicate: (value: T, index: number, array: T[]) => boolean): Computed<T[]>;
10
- slice(start?: number, end?: number): Computed<T[]>;
11
- reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): Computed<U>;
12
- reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): Computed<T>;
13
- find(predicate: (value: T, index: number, obj: T[]) => boolean): Computed<T | undefined>;
14
- findLast(predicate: (value: T, index: number, obj: T[]) => boolean): Computed<T | undefined>;
15
- findIndex(predicate: (value: T, index: number, obj: T[]) => boolean): Computed<number>;
16
- findLastIndex(predicate: (value: T, index: number, obj: T[]) => boolean): Computed<number>;
17
- every(predicate: (value: T, index: number, array: T[]) => boolean): Computed<boolean>;
18
- some(predicate: (value: T, index: number, array: T[]) => boolean): Computed<boolean>;
19
- includes(searchElement: T, fromIndex?: number): Computed<boolean>;
20
- indexOf(searchElement: T, fromIndex?: number): Computed<number>;
21
- lastIndexOf(searchElement: T, fromIndex?: number): Computed<number>;
22
- at(index: number): Computed<T | undefined>;
23
- concat(...items: (T | T[])[]): Computed<T[]>;
24
- flat<depth extends number = 1>(depth?: depth): Computed<any[]>;
25
- flatMap<U>(callback: (value: T, index: number, array: T[]) => U | U[]): Computed<U[]>;
26
- join(separator?: string): Computed<string>;
27
- }
28
-
29
- export type ArraySignalAccessor<T extends any[]> = SignalAccessor<T> & ReactiveArrayMethods<T[number]> & {
30
- push(...items: T[number][]): number;
31
- pop(): T[number] | undefined;
32
- shift(): T[number] | undefined;
33
- unshift(...items: T[number][]): number;
34
- splice(start: number, deleteCount: number, ...items: T[number][]): T[number][];
35
- remove(predicate: (item: T[number], index: number) => boolean): void;
36
- clear(): void;
37
- sort(compareFn?: (a: T[number], b: T[number]) => number): ArraySignalAccessor<T>;
38
- reverse(): ArraySignalAccessor<T>;
39
- }
40
-
41
- export type ComputedAccessor<T> = {
42
- (): T;
43
- isSignal: boolean;
44
- readonly: true;
45
- } & (T extends any[] ? ReactiveArrayMethods<T[number]> : {})
46
-
47
- export type Signal<T = any> = SignalAccessor<T> & (T extends any[] ? ReactiveArrayMethods<T[number]> : {})
48
- export type Computed<T = any> = ComputedAccessor<T> & (T extends any[] ? ReactiveArrayMethods<T[number]> : {})
49
-
50
- type EffectRunner = {
51
- (): void;
52
- deps: Set<Set<EffectRunner>>;
53
- }
54
-
55
- export type WatchSource<T = any> = (() => T) | Signal<T> | Computed<T>
56
- export type WatchCallback<T = any> = (newValue: T, oldValue: T | undefined, onCleanup: (fn: () => void) => void) => void
57
-
58
- export interface WatchOptions {
59
- immediate?: boolean;
60
- equals?: (a: any, b: any) => boolean;
61
- }
62
-
63
- export declare function signal<T extends any[]>(initialValue: T): ArraySignalAccessor<T>
64
- export declare function signal<T>(initialValue: T): SignalAccessor<T>
65
- export declare function effect(fn: () => void): () => void
66
- export declare function computed<T>(fn: () => T): Computed<T>
67
- export declare function batch<T>(fn: () => T): T
68
- export declare function untrack<T>(fn: () => T): T
69
- export declare function watch<T>(source: WatchSource<T>, callback: WatchCallback<T>, options?: WatchOptions): () => void
70
- export declare function watch<T extends any[]>(
71
- sources: [...{ [K in keyof T]: WatchSource<T[K]> }],
72
- callback: (newValue: T, oldValue: T | undefined, onCleanup: (fn: () => void) => void) => void,
73
- options?: WatchOptions
74
- ): () => void
75
- export declare function inspect(...args: any[]): (() => void) | void
76
-
77
- declare function setEffectHook(fn: (eff: any) => void): void
78
-
1
+ export type SignalAccessor<T> = {
2
+ (): T;
3
+ (newValue: T): void;
4
+ isSignal: boolean;
5
+ }
6
+
7
+ export interface ReactiveArrayMethods<T> {
8
+ map<U>(callbackfn: (value: T, index: number, array: T[]) => U): Computed<U[]>;
9
+ filter(predicate: (value: T, index: number, array: T[]) => boolean): Computed<T[]>;
10
+ slice(start?: number, end?: number): Computed<T[]>;
11
+ reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): Computed<U>;
12
+ reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): Computed<T>;
13
+ find(predicate: (value: T, index: number, obj: T[]) => boolean): Computed<T | undefined>;
14
+ findLast(predicate: (value: T, index: number, obj: T[]) => boolean): Computed<T | undefined>;
15
+ findIndex(predicate: (value: T, index: number, obj: T[]) => boolean): Computed<number>;
16
+ findLastIndex(predicate: (value: T, index: number, obj: T[]) => boolean): Computed<number>;
17
+ every(predicate: (value: T, index: number, array: T[]) => boolean): Computed<boolean>;
18
+ some(predicate: (value: T, index: number, array: T[]) => boolean): Computed<boolean>;
19
+ includes(searchElement: T, fromIndex?: number): Computed<boolean>;
20
+ indexOf(searchElement: T, fromIndex?: number): Computed<number>;
21
+ lastIndexOf(searchElement: T, fromIndex?: number): Computed<number>;
22
+ at(index: number): Computed<T | undefined>;
23
+ concat(...items: (T | T[])[]): Computed<T[]>;
24
+ flat<depth extends number = 1>(depth?: depth): Computed<any[]>;
25
+ flatMap<U>(callback: (value: T, index: number, array: T[]) => U | U[]): Computed<U[]>;
26
+ join(separator?: string): Computed<string>;
27
+ }
28
+
29
+ export type ArraySignalAccessor<T extends any[]> = SignalAccessor<T> & ReactiveArrayMethods<T[number]> & {
30
+ push(...items: T[number][]): number;
31
+ pop(): T[number] | undefined;
32
+ shift(): T[number] | undefined;
33
+ unshift(...items: T[number][]): number;
34
+ splice(start: number, deleteCount: number, ...items: T[number][]): T[number][];
35
+ remove(predicate: (item: T[number], index: number) => boolean): void;
36
+ clear(): void;
37
+ sort(compareFn?: (a: T[number], b: T[number]) => number): ArraySignalAccessor<T>;
38
+ reverse(): ArraySignalAccessor<T>;
39
+ }
40
+
41
+ export type ComputedAccessor<T> = {
42
+ (): T;
43
+ isSignal: boolean;
44
+ readonly: true;
45
+ } & (T extends any[] ? ReactiveArrayMethods<T[number]> : {})
46
+
47
+ export type Signal<T = any> = SignalAccessor<T> & (T extends any[] ? ReactiveArrayMethods<T[number]> : {})
48
+ export type Computed<T = any> = ComputedAccessor<T> & (T extends any[] ? ReactiveArrayMethods<T[number]> : {})
49
+
50
+ type EffectRunner = {
51
+ (): void;
52
+ deps: Set<Set<EffectRunner>>;
53
+ }
54
+
55
+ export type WatchSource<T = any> = (() => T) | Signal<T> | Computed<T>
56
+ export type WatchCallback<T = any> = (newValue: T, oldValue: T | undefined, onCleanup: (fn: () => void) => void) => void
57
+
58
+ export interface WatchOptions {
59
+ immediate?: boolean;
60
+ equals?: (a: any, b: any) => boolean;
61
+ }
62
+
63
+ export interface ResourceOptions {
64
+ staleTime?: number;
65
+ key?: string | number;
66
+ }
67
+
68
+ export type ResourceAccessor<T> = {
69
+ (): T | undefined;
70
+ read(): T;
71
+ isSignal: boolean;
72
+ loading: Signal<boolean>;
73
+ isFetching: Signal<boolean>;
74
+ error: Signal<any>;
75
+ } & (T extends any[] ? ReactiveArrayMethods<T[number]> : {})
76
+
77
+ export type ResourceActions<T> = {
78
+ mutate: (val: T) => void;
79
+ refetch: () => void;
80
+ }
81
+
82
+ export type ResourceReturn<T, R = unknown> = [
83
+ ResourceAccessor<T>,
84
+ {
85
+ mutate: (val: T) => void;
86
+ refetch: () => void;
87
+ }
88
+ ];
89
+
90
+ export interface SuspenseOptions {
91
+ onError?: (err: any) => void;
92
+ }
93
+
94
+ export interface SuspenseSignal<T> {
95
+ (): T;
96
+ pending: Signal<boolean>;
97
+ error: Signal<any>;
98
+ }
99
+
100
+ export type Resource<T> = [ResourceAccessor<T>, ResourceActions<T>]
101
+
102
+ export declare function signal<T extends any[]>(initialValue: T): ArraySignalAccessor<T>
103
+ export declare function signal<T>(initialValue: T): SignalAccessor<T>
104
+ export declare function effect(fn: () => void): () => void
105
+ export declare function computed<T>(fn: () => T): Computed<T>
106
+ export declare function batch<T>(fn: () => T): T
107
+ export declare function untrack<T>(fn: () => T): T
108
+ export declare function watch<T>(source: WatchSource<T>, callback: WatchCallback<T>, options?: WatchOptions): () => void
109
+ export declare function watch<T extends any[]>(
110
+ sources: [...{ [K in keyof T]: WatchSource<T[K]> }],
111
+ callback: (newValue: T, oldValue: T | undefined, onCleanup: (fn: () => void) => void) => void,
112
+ options?: WatchOptions
113
+ ): () => void
114
+ export declare function inspect(...args: any[]): (() => void) | void
115
+ export declare function onCleanup(fn: () => void): void
116
+
117
+ export function resource<T, R = any>(
118
+ fetcher: (input: R) => Promise<T>,
119
+ options?: { key?: string | number; staleTime?: number }
120
+ ): ResourceReturn<T, R>;
121
+
122
+ export function resource<T, R>(
123
+ source: () => R,
124
+ fetcher: (input: R) => Promise<T>,
125
+ options?: { key?: string | number; staleTime?: number }
126
+ ): ResourceReturn<T, R>;
127
+
128
+ export function createSuspense<T>(
129
+ renderFn: () => T,
130
+ fallbackFn: (() => T) | T,
131
+ options?: SuspenseOptions
132
+ ): [SuspenseSignal<T>, () => void];
133
+
134
+ declare function setEffectHook(fn: (eff: any) => void): void
135
+
136
+ export type AsyncPriority = 'high' | 'low';
137
+ export interface AsyncJobOptions {
138
+ priority?: AsyncPriority;
139
+ }
140
+
141
+ export function scheduleAsyncJob(fn: () => void, opts?: AsyncJobOptions): void;
142
+
143
+ export interface ResourceOptions<T = any> {
144
+ key?: string | number;
145
+ staleTime?: number;
146
+ fetchPriority?: AsyncPriority;
147
+ }