@emberkit/core 0.1.2 → 0.2.1

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 (126) hide show
  1. package/dist/boundaries/error-boundary.d.ts +29 -0
  2. package/dist/boundaries/error-boundary.d.ts.map +1 -0
  3. package/dist/boundaries/errors.d.ts +39 -0
  4. package/dist/boundaries/errors.d.ts.map +1 -0
  5. package/dist/boundaries/index.d.ts +5 -0
  6. package/dist/boundaries/index.d.ts.map +1 -0
  7. package/dist/boundaries/loading-boundary.d.ts +42 -0
  8. package/dist/boundaries/loading-boundary.d.ts.map +1 -0
  9. package/dist/cache/index.d.ts +60 -0
  10. package/dist/cache/index.d.ts.map +1 -0
  11. package/dist/compiler/compiler.d.ts +6 -0
  12. package/dist/compiler/compiler.d.ts.map +1 -0
  13. package/dist/compiler/helpers/attributes.d.ts +4 -0
  14. package/dist/compiler/helpers/attributes.d.ts.map +1 -0
  15. package/dist/compiler/helpers/utils.d.ts +10 -0
  16. package/dist/compiler/helpers/utils.d.ts.map +1 -0
  17. package/dist/compiler/index.d.ts +5 -0
  18. package/dist/compiler/index.d.ts.map +1 -0
  19. package/dist/compiler/types.d.ts +40 -0
  20. package/dist/compiler/types.d.ts.map +1 -0
  21. package/dist/context/index.d.ts +34 -0
  22. package/dist/context/index.d.ts.map +1 -0
  23. package/dist/context/types.d.ts +10 -0
  24. package/dist/context/types.d.ts.map +1 -0
  25. package/dist/dev-server/index.d.ts +30 -0
  26. package/dist/dev-server/index.d.ts.map +1 -0
  27. package/dist/forms/index.d.ts +58 -0
  28. package/dist/forms/index.d.ts.map +1 -0
  29. package/dist/forms/mutations.d.ts +48 -0
  30. package/dist/forms/mutations.d.ts.map +1 -0
  31. package/dist/hmr/client.d.ts +18 -0
  32. package/dist/hmr/client.d.ts.map +1 -0
  33. package/dist/hmr/index.d.ts +3 -0
  34. package/dist/hmr/index.d.ts.map +1 -0
  35. package/dist/hmr/types.d.ts +42 -0
  36. package/dist/hmr/types.d.ts.map +1 -0
  37. package/dist/hydration/helpers/analyzer.d.ts +9 -0
  38. package/dist/hydration/helpers/analyzer.d.ts.map +1 -0
  39. package/dist/hydration/helpers/hydration.d.ts +19 -0
  40. package/dist/hydration/helpers/hydration.d.ts.map +1 -0
  41. package/dist/hydration/index.d.ts +4 -0
  42. package/dist/hydration/index.d.ts.map +1 -0
  43. package/dist/hydration/types.d.ts +27 -0
  44. package/dist/hydration/types.d.ts.map +1 -0
  45. package/dist/image/index.d.ts +9 -0
  46. package/dist/image/index.d.ts.map +1 -0
  47. package/dist/image/processor.d.ts +57 -0
  48. package/dist/image/processor.d.ts.map +1 -0
  49. package/dist/index.d.ts +20 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/jsx-dev-runtime.d.ts +11 -0
  52. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  53. package/dist/jsx-runtime.d.ts +11 -0
  54. package/dist/jsx-runtime.d.ts.map +1 -0
  55. package/dist/loader/helpers/loader.d.ts +6 -0
  56. package/dist/loader/helpers/loader.d.ts.map +1 -0
  57. package/dist/loader/index.d.ts +3 -0
  58. package/dist/loader/index.d.ts.map +1 -0
  59. package/dist/loader/types.d.ts +34 -0
  60. package/dist/loader/types.d.ts.map +1 -0
  61. package/dist/markdown/index.d.ts +77 -0
  62. package/dist/markdown/index.d.ts.map +1 -0
  63. package/dist/markdown/index.js +10 -8
  64. package/dist/mdx/index.d.ts +43 -0
  65. package/dist/mdx/index.d.ts.map +1 -0
  66. package/dist/mdx/loader.d.ts +3 -0
  67. package/dist/mdx/loader.d.ts.map +1 -0
  68. package/dist/meta/head-registry.d.ts +5 -0
  69. package/dist/meta/head-registry.d.ts.map +1 -0
  70. package/dist/meta/head.d.ts +29 -0
  71. package/dist/meta/head.d.ts.map +1 -0
  72. package/dist/meta/index.d.ts +91 -0
  73. package/dist/meta/index.d.ts.map +1 -0
  74. package/dist/navigation/helpers/navigation.d.ts +15 -0
  75. package/dist/navigation/helpers/navigation.d.ts.map +1 -0
  76. package/dist/navigation/helpers/useNavigate.d.ts +6 -0
  77. package/dist/navigation/helpers/useNavigate.d.ts.map +1 -0
  78. package/dist/navigation/index.d.ts +5 -0
  79. package/dist/navigation/index.d.ts.map +1 -0
  80. package/dist/navigation/types.d.ts +24 -0
  81. package/dist/navigation/types.d.ts.map +1 -0
  82. package/dist/plugin/index.d.ts +73 -0
  83. package/dist/plugin/index.d.ts.map +1 -0
  84. package/dist/router/helpers/path.d.ts +15 -0
  85. package/dist/router/helpers/path.d.ts.map +1 -0
  86. package/dist/router/helpers/route.d.ts +6 -0
  87. package/dist/router/helpers/route.d.ts.map +1 -0
  88. package/dist/router/index.d.ts +35 -0
  89. package/dist/router/index.d.ts.map +1 -0
  90. package/dist/router/types.d.ts +30 -0
  91. package/dist/router/types.d.ts.map +1 -0
  92. package/dist/runtime/helpers/element.d.ts +7 -0
  93. package/dist/runtime/helpers/element.d.ts.map +1 -0
  94. package/dist/runtime/helpers/render.d.ts +8 -0
  95. package/dist/runtime/helpers/render.d.ts.map +1 -0
  96. package/dist/runtime/helpers/render.js +41 -12
  97. package/dist/runtime/index.d.ts +16 -0
  98. package/dist/runtime/index.d.ts.map +1 -0
  99. package/dist/runtime/index.js +53 -0
  100. package/dist/runtime/types.d.ts +65 -0
  101. package/dist/runtime/types.d.ts.map +1 -0
  102. package/dist/signals/helpers/core.d.ts +11 -0
  103. package/dist/signals/helpers/core.d.ts.map +1 -0
  104. package/dist/signals/helpers/core.js +32 -12
  105. package/dist/signals/helpers/utils.d.ts +7 -0
  106. package/dist/signals/helpers/utils.d.ts.map +1 -0
  107. package/dist/signals/index.d.ts +4 -0
  108. package/dist/signals/index.d.ts.map +1 -0
  109. package/dist/signals/types.d.ts +23 -0
  110. package/dist/signals/types.d.ts.map +1 -0
  111. package/dist/ssg/index.d.ts +38 -0
  112. package/dist/ssg/index.d.ts.map +1 -0
  113. package/dist/ssr/helpers/render-html.d.ts +16 -0
  114. package/dist/ssr/helpers/render-html.d.ts.map +1 -0
  115. package/dist/ssr/helpers/ssr.d.ts +14 -0
  116. package/dist/ssr/helpers/ssr.d.ts.map +1 -0
  117. package/dist/ssr/index.d.ts +4 -0
  118. package/dist/ssr/index.d.ts.map +1 -0
  119. package/dist/ssr/types.d.ts +29 -0
  120. package/dist/ssr/types.d.ts.map +1 -0
  121. package/dist/vite-plugin/index.d.ts +5 -0
  122. package/dist/vite-plugin/index.d.ts.map +1 -0
  123. package/dist/vite-plugin/index.js +147 -21
  124. package/dist/vite-plugin/types.d.ts +36 -0
  125. package/dist/vite-plugin/types.d.ts.map +1 -0
  126. package/package.json +6 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type NavigationType = 'push' | 'replace' | 'pop' | 'reload';
2
+ export interface NavigationOptions {
3
+ replace?: boolean;
4
+ state?: Record<string, unknown>;
5
+ viewTransition?: boolean | ViewTransitionOptions;
6
+ }
7
+ export interface ViewTransitionOptions {
8
+ skipTransition?: boolean;
9
+ documentViewTransition?: boolean;
10
+ name?: string;
11
+ types?: string[];
12
+ }
13
+ export interface NavigationState {
14
+ type: NavigationType;
15
+ from: string;
16
+ to: string;
17
+ options?: NavigationOptions;
18
+ }
19
+ export interface NavigationTrigger {
20
+ type: NavigationType;
21
+ delta?: number;
22
+ }
23
+ export declare const VIEW_TRANSITION_API_SUPPORTED: boolean;
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;CAClD;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,6BAA6B,SACP,CAAC"}
@@ -0,0 +1,73 @@
1
+ export interface Plugin {
2
+ name: string;
3
+ version?: string;
4
+ setup: (context: PluginContext) => void | Promise<void>;
5
+ }
6
+ export interface PluginContext {
7
+ config: ResolvedConfig;
8
+ api: PluginAPI;
9
+ onHook: (name: string, callback: HookCallback) => void;
10
+ addWatchFile: (file: string) => void;
11
+ }
12
+ export interface ResolvedConfig {
13
+ mode: 'static' | 'ssr' | 'spa' | 'hybrid';
14
+ root: string;
15
+ outDir: string;
16
+ srcDir: string;
17
+ routesDir: string;
18
+ server: ServerConfig;
19
+ build: BuildConfig;
20
+ }
21
+ export interface ServerConfig {
22
+ port: number;
23
+ host: string;
24
+ cors: boolean;
25
+ }
26
+ export interface BuildConfig {
27
+ target: string;
28
+ minify: boolean;
29
+ sourcemap: boolean;
30
+ }
31
+ export interface PluginAPI {
32
+ resolveId: (id: string, options?: ResolveIdOptions) => Promise<ResolvedId | null>;
33
+ load: (id: string) => Promise<string | null>;
34
+ transform: (code: string, id: string) => Promise<TransformResult | null>;
35
+ render: (html: string, context: RenderContext) => Promise<string>;
36
+ }
37
+ export interface ResolveIdOptions {
38
+ importer?: string;
39
+ skipSelf?: boolean;
40
+ }
41
+ export interface ResolvedId {
42
+ id: string;
43
+ external?: boolean;
44
+ moduleSideEffects?: boolean | null;
45
+ }
46
+ export interface TransformResult {
47
+ code: string;
48
+ map?: string;
49
+ mappings?: string;
50
+ }
51
+ export interface RenderContext {
52
+ url: string;
53
+ params: Record<string, string>;
54
+ head?: string;
55
+ body?: string;
56
+ }
57
+ export type HookCallback = (context?: unknown) => void | Promise<void>;
58
+ export type HookName = 'buildStart' | 'buildEnd' | 'transform' | 'renderStart' | 'renderEnd' | 'configResolved';
59
+ export declare class PluginPipeline {
60
+ private plugins;
61
+ private hookCache;
62
+ addPlugin(plugin: Plugin): void;
63
+ removePlugin(name: string): void;
64
+ runHook(name: HookName, context?: unknown): Promise<void>;
65
+ private invalidateCache;
66
+ getPlugins(): Plugin[];
67
+ }
68
+ export declare function createPluginContext(config: ResolvedConfig, api: PluginAPI): PluginContext;
69
+ export declare function createPluginAPI(): PluginAPI;
70
+ export declare const CORE_PLUGINS: Plugin[];
71
+ export declare function loadPlugin(name: string): Promise<Plugin>;
72
+ export declare function resolvePlugins(plugins: Plugin[], config: ResolvedConfig): Promise<PluginContext[]>;
73
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare function normalizePath(path: string): string;
2
+ export declare function pathToRegex(path: string): {
3
+ pattern: RegExp;
4
+ paramNames: string[];
5
+ };
6
+ export declare function matchPath(pattern: RegExp, path: string): string[] | null;
7
+ export declare function scoreRoute(routePath: string): number;
8
+ export declare function extractSegments(filePath: string): string[];
9
+ export declare function segmentsToPath(segments: string[]): string;
10
+ export declare function isIndexFile(fileName: string): boolean;
11
+ export declare function isDynamicSegment(segment: string): boolean;
12
+ export declare function isCatchAll(segment: string): boolean;
13
+ export declare function getParamName(segment: string): string | null;
14
+ export declare function getCatchAllName(segment: string): string | null;
15
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/router/helpers/path.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBnF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAMxE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBpD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAK1D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAEzD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK3D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9D"}
@@ -0,0 +1,6 @@
1
+ import type { Route, RouteMatch } from '../types.js';
2
+ export declare function createRoute(filePath: string, routeDir?: string): Route | null;
3
+ export declare function matchRoute(routes: Route[], pathname: string): RouteMatch | null;
4
+ export declare function sortRoutes(routes: Route[]): Route[];
5
+ export declare function findLayoutChain(routes: Route[], pathname: string): Route[];
6
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/router/helpers/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGrD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAqB,GAC9B,KAAK,GAAG,IAAI,CAoDd;AAwBD,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAwB/E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAEnD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,CA0B1E"}
@@ -0,0 +1,35 @@
1
+ import type { Route, RouteMatch, NavigateOptions, RouteParams } from './types.js';
2
+ import { createRoute, matchRoute, sortRoutes, findLayoutChain } from './helpers/route.js';
3
+ export type RouterState = {
4
+ pathname: string;
5
+ params: Record<string, string>;
6
+ query: Record<string, string | string[]>;
7
+ };
8
+ type Listener = (state: RouterState) => void;
9
+ declare class EmberKitRouter {
10
+ private basePath;
11
+ private currentPath;
12
+ private listeners;
13
+ private routes;
14
+ back(): void;
15
+ createHref(path: string): string;
16
+ createRouteParams<T extends Record<string, string>>(params: T): RouteParams<T>;
17
+ forward(): void;
18
+ getBasePath(): string;
19
+ getCurrentPath(): string;
20
+ getLayouts(pathname: string): Route[];
21
+ getRoutes(): Route[];
22
+ initialize(routes: Route[]): void;
23
+ match(pathname: string): RouteMatch | null;
24
+ navigate(path: string, options?: NavigateOptions): void;
25
+ setBasePath(path: string): void;
26
+ subscribe(listener: Listener): () => void;
27
+ private notify;
28
+ private parseQuery;
29
+ }
30
+ export declare const router: EmberKitRouter;
31
+ export declare function createRouter(routes: Route[]): EmberKitRouter;
32
+ export declare function createMemoryRouter(initialPath?: string): EmberKitRouter;
33
+ export { createRoute, matchRoute, sortRoutes, findLayoutChain };
34
+ export type { Route, RouteMatch, NavigateOptions, RouteParams };
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1F,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC1C,CAAC;AAEF,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAE7C,cAAM,cAAc;IAClB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,MAAM,CAAe;IAE7B,IAAI,IAAI,IAAI;IAIZ,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIhC,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAQ9E,OAAO,IAAI,IAAI;IAIf,WAAW,IAAI,MAAM;IAIrB,cAAc,IAAI,MAAM;IAIxB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE;IAIrC,SAAS,IAAI,KAAK,EAAE;IAIpB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAKjC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI1C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAavD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAKzC,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,UAAU;CAgCnB;AAED,eAAO,MAAM,MAAM,gBAAuB,CAAC;AAE3C,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,CAI5D;AAED,wBAAgB,kBAAkB,CAAC,WAAW,GAAE,MAAY,GAAG,cAAc,CAI5E;AAED,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;AAChE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface Route {
2
+ path: string;
3
+ pattern: RegExp;
4
+ paramNames: string[];
5
+ filePath: string;
6
+ fileName: string;
7
+ isLayout: boolean;
8
+ isError: boolean;
9
+ isLoading: boolean;
10
+ isApi: boolean;
11
+ }
12
+ export interface RouteMatch {
13
+ route: Route;
14
+ params: Record<string, string>;
15
+ score: number;
16
+ }
17
+ export interface NavigateOptions {
18
+ replace?: boolean;
19
+ state?: Record<string, unknown>;
20
+ }
21
+ export interface RouteParams<T extends Record<string, string> = Record<string, string>> {
22
+ params: T;
23
+ query: Record<string, string | string[]>;
24
+ request: Request;
25
+ }
26
+ export type RouteHandler = (params: RouteParams) => Promise<unknown> | unknown;
27
+ export declare const SPECIAL_FILES: Set<string>;
28
+ export declare const PARAM_REGEX: RegExp;
29
+ export declare const CATCH_ALL_REGEX: RegExp;
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IACpF,MAAM,EAAE,CAAC,CAAC;IACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAE/E,eAAO,MAAM,aAAa,aAExB,CAAC;AAEH,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,eAAe,QAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { JSXElementProps, JSXNode, DOMElement } from '../types.js';
2
+ export declare function createElement(type: string | ((props: JSXElementProps) => JSXNode), props: JSXElementProps | null, ...children: JSXNode[]): DOMElement;
3
+ export declare function isValidElement(element: unknown): element is DOMElement;
4
+ export declare function isComponent(type: unknown): type is (props: JSXElementProps) => JSXNode;
5
+ export declare function flattenChildren(children: unknown[]): JSXNode[];
6
+ export declare function resolveComponent(type: string | ((props: JSXElementProps) => JSXNode), props: JSXElementProps): DOMElement;
7
+ //# sourceMappingURL=element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../../src/runtime/helpers/element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,EACpD,KAAK,EAAE,eAAe,GAAG,IAAI,EAC7B,GAAG,QAAQ,EAAE,OAAO,EAAE,GACrB,UAAU,CAcZ;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,UAAU,CAItE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAEtF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAe9D;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,EACpD,KAAK,EAAE,eAAe,GACrB,UAAU,CAaZ"}
@@ -0,0 +1,8 @@
1
+ import type { JSXElement, JSXElementProps, JSXNode } from '../types.js';
2
+ export declare function getHandler(id: string): ((e: Event) => void) | undefined;
3
+ export declare function clearHandlers(): void;
4
+ export declare function renderElementToHTML(element: JSXElement): string;
5
+ export declare function renderToString(element: JSXElement | string | null | number | unknown[]): string;
6
+ export declare function getComponentName(type: string | ((props: JSXElementProps) => JSXNode)): string;
7
+ export declare function createPropsProxy(props: JSXElementProps): JSXElementProps;
8
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/runtime/helpers/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAWpF,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAEvE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAwG/D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,CAM/F;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,GACnD,MAAM,CAMR;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,CASxE"}
@@ -3,6 +3,8 @@ const SELF_CLOSING_TAGS = new Set([
3
3
  ]);
4
4
  let handlerCounter = 0;
5
5
  const handlerRegistry = new Map();
6
+ let renderDepth = 0;
7
+ const MAX_RENDER_DEPTH = 100;
6
8
  export function getHandler(id) {
7
9
  return handlerRegistry.get(id);
8
10
  }
@@ -13,9 +15,16 @@ export function clearHandlers() {
13
15
  export function renderElementToHTML(element) {
14
16
  if (!element)
15
17
  return '';
18
+ if (renderDepth > MAX_RENDER_DEPTH) {
19
+ renderDepth = 0;
20
+ return '';
21
+ }
22
+ renderDepth++;
16
23
  let currentType = element.type;
17
24
  let props = element.props ?? {};
18
- while (typeof currentType === 'function') {
25
+ let depth = 0;
26
+ while (typeof currentType === 'function' && depth < 50) {
27
+ depth++;
19
28
  try {
20
29
  const result = currentType(props);
21
30
  if (result && typeof result === 'object' && 'type' in result) {
@@ -23,28 +32,29 @@ export function renderElementToHTML(element) {
23
32
  props = result.props ?? {};
24
33
  }
25
34
  else if (typeof result === 'string' || typeof result === 'number') {
35
+ renderDepth--;
26
36
  return String(result);
27
37
  }
38
+ else if (Array.isArray(result)) {
39
+ const r = result.map((item) => renderToString(item)).join('');
40
+ renderDepth--;
41
+ return r;
42
+ }
28
43
  else {
44
+ renderDepth--;
29
45
  return '';
30
46
  }
31
47
  }
32
48
  catch (error) {
49
+ renderDepth--;
50
+ console.error('[EmberKit render error]', error);
33
51
  return `<div style="color: red;">Error rendering component</div>`;
34
52
  }
35
53
  }
36
54
  const rawChildren = props.children ?? [];
37
55
  const children = Array.isArray(rawChildren) ? rawChildren : [rawChildren];
38
56
  const childHtml = children
39
- .map((child) => {
40
- if (typeof child === 'string' || typeof child === 'number') {
41
- return String(child);
42
- }
43
- if (typeof child === 'object' && child !== null && 'type' in child) {
44
- return renderElementToHTML(child);
45
- }
46
- return '';
47
- })
57
+ .map((child) => renderToString(child))
48
58
  .join('');
49
59
  if (currentType === 'Fragment' || currentType === 'React.Fragment') {
50
60
  return childHtml;
@@ -63,20 +73,35 @@ export function renderElementToHTML(element) {
63
73
  return false;
64
74
  if (typeof value === 'object' && value !== null && '__html' in value)
65
75
  return false;
76
+ if (value == null)
77
+ return false;
78
+ if (typeof value === 'function' && key !== 'data-ek-bind')
79
+ return false;
66
80
  return true;
67
81
  })
68
- .filter(([, value]) => typeof value !== 'function' && value != null)
69
82
  .map(([key, value]) => {
70
- // Map React/JSX prop names to HTML attributes
71
83
  if (key === 'className')
72
84
  key = 'class';
73
85
  if (key === 'strokeWidth' || key === 'strokeLinecap' || key === 'strokeLinejoin') {
74
86
  key = key.replace(/([A-Z])/g, '-$1').toLowerCase();
75
87
  }
88
+ if (key === 'data-ek-bind' && typeof value === 'function' && value.__idx != null) {
89
+ return ` data-ek-bind="${value.__idx}"`;
90
+ }
76
91
  if (value === true)
77
92
  return ` ${key}`;
78
93
  if (value === false)
79
94
  return '';
95
+ if (key === 'style' && typeof value === 'object' && value !== null) {
96
+ const styleStr = Object.entries(value)
97
+ .filter(([, v]) => v != null)
98
+ .map(([prop, val]) => {
99
+ const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();
100
+ return `${cssProp}: ${val}`;
101
+ })
102
+ .join('; ');
103
+ return ` ${key}="${styleStr}"`;
104
+ }
80
105
  return ` ${key}="${value}"`;
81
106
  })
82
107
  .join('');
@@ -89,8 +114,10 @@ export function renderElementToHTML(element) {
89
114
  onclickAttr = ` data-ekclick="${id}"`;
90
115
  }
91
116
  if (SELF_CLOSING_TAGS.has(currentType)) {
117
+ renderDepth--;
92
118
  return `<${currentType}${attributes}${onclickAttr}/>`;
93
119
  }
120
+ renderDepth--;
94
121
  return `<${currentType}${attributes}${onclickAttr}>${innerHtml}</${currentType}>`;
95
122
  }
96
123
  export function renderToString(element) {
@@ -100,6 +127,8 @@ export function renderToString(element) {
100
127
  return element;
101
128
  if (typeof element === 'number')
102
129
  return String(element);
130
+ if (Array.isArray(element))
131
+ return element.map((item) => renderToString(item)).join('');
103
132
  return renderElementToHTML(element);
104
133
  }
105
134
  export function getComponentName(type) {
@@ -0,0 +1,16 @@
1
+ import type { JSXElementProps, JSXNode, DOMElement, JSXElement } from './types.js';
2
+ export declare function createElement(type: string | ((props: JSXElementProps) => JSXNode), props?: Record<string, unknown> | null, ...children: unknown[]): DOMElement;
3
+ export declare function render(element: JSXElement | string | null | ((props: Record<string, unknown>) => JSXNode), container: Element | string, options?: {
4
+ hydrate?: boolean;
5
+ routes?: Array<{
6
+ path: string;
7
+ component: () => Promise<{
8
+ default: (props: Record<string, unknown>) => JSXNode;
9
+ }>;
10
+ }>;
11
+ }): void;
12
+ export declare function hydrate(element: JSXElement | string | null, container: Element | string): void;
13
+ export declare function flushSync(fn: () => void): void;
14
+ export declare function isElement(element: unknown): element is JSXElement;
15
+ export { type JSXElement, type JSXNode };
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInF,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,EACpD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,GAAG,QAAQ,EAAE,OAAO,EAAE,GACrB,UAAU,CAYZ;AAmFD,wBAAgB,MAAM,CACpB,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,EACnF,SAAS,EAAE,OAAO,GAAG,MAAM,EAC3B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,GACpJ,IAAI,CAuFN;AAED,wBAAgB,OAAO,CACrB,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,EACnC,SAAS,EAAE,OAAO,GAAG,MAAM,GAC1B,IAAI,CAEN;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAE9C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,UAAU,CAOjE;AAED,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { renderToString, getHandler, clearHandlers } from './helpers/render.js';
2
+ import { getSignalByIndex } from '../signals/helpers/core.js';
2
3
  export function createElement(type, props, ...children) {
3
4
  const resolvedProps = props ?? {};
4
5
  const flatChildren = children.flat().filter((child) => child != null && child !== false);
@@ -32,6 +33,58 @@ function renderToTarget(layout, target, routeComponent) {
32
33
  const html = renderToString(jsxElement);
33
34
  target.innerHTML = html;
34
35
  attachEventHandlers(target);
36
+ hydrateSignalBindings(target);
37
+ }
38
+ function hydrateSignalBindings(container) {
39
+ const els = container.querySelectorAll('[data-ek-bind]');
40
+ els.forEach((el) => {
41
+ const idx = parseInt(el.getAttribute('data-ek-bind') ?? '', 10);
42
+ if (isNaN(idx))
43
+ return;
44
+ const sig = getSignalByIndex(idx);
45
+ if (!sig)
46
+ return;
47
+ const showClasses = el.getAttribute('data-ek-show') ?? '';
48
+ const hideClasses = el.getAttribute('data-ek-hide') ?? '';
49
+ const showWhen = el.getAttribute('data-ek-show-when');
50
+ const hideClass = el.getAttribute('data-ek-hide-class') ?? 'hidden';
51
+ const activeWhen = el.getAttribute('data-ek-active-when');
52
+ const activeClass = el.getAttribute('data-ek-active-class');
53
+ const inactiveClassAttr = el.getAttribute('data-ek-inactive-class');
54
+ sig.subscribe((val) => {
55
+ if (activeWhen != null && activeClass != null && activeClass.length > 0) {
56
+ const isActive = String(val) === activeWhen;
57
+ activeClass.split(' ').forEach((c) => { if (c)
58
+ el.classList.toggle(c, isActive); });
59
+ if (inactiveClassAttr && inactiveClassAttr.length > 0) {
60
+ inactiveClassAttr.split(' ').forEach((c) => { if (c)
61
+ el.classList.toggle(c, !isActive); });
62
+ }
63
+ return;
64
+ }
65
+ if (activeClass != null && activeClass.length > 0 && (!inactiveClassAttr || inactiveClassAttr.length === 0)) {
66
+ const isVisible = !!val;
67
+ activeClass.split(' ').forEach((c) => { if (c)
68
+ el.classList.toggle(c, isVisible); });
69
+ return;
70
+ }
71
+ if (showWhen != null) {
72
+ el.classList.toggle(hideClass, String(val) !== showWhen);
73
+ return;
74
+ }
75
+ if (showClasses || hideClasses) {
76
+ const isVisible = !!val;
77
+ if (showClasses) {
78
+ showClasses.split(' ').forEach((c) => el.classList.toggle(c, isVisible));
79
+ }
80
+ if (hideClasses) {
81
+ hideClasses.split(' ').forEach((c) => el.classList.toggle(c, !isVisible));
82
+ }
83
+ return;
84
+ }
85
+ el.textContent = String(val);
86
+ });
87
+ });
35
88
  }
36
89
  export function render(element, container, options) {
37
90
  if (!element)
@@ -0,0 +1,65 @@
1
+ export interface JSXElementProps {
2
+ children?: JSXNode | JSXNode[];
3
+ key?: string;
4
+ ref?: {
5
+ current: Element | null;
6
+ };
7
+ [key: string]: unknown;
8
+ }
9
+ export type JSXNode = JSXElement | string | number | null | false | undefined;
10
+ export interface JSXElement {
11
+ type: string | ((props: JSXElementProps) => JSXNode);
12
+ props: JSXElementProps;
13
+ }
14
+ export type RouteChildren = JSXNode;
15
+ export interface RouteComponent<P extends JSXElementProps = JSXElementProps> {
16
+ (props: P): JSXNode;
17
+ displayName?: string;
18
+ }
19
+ declare module 'react' {
20
+ namespace JSX {
21
+ interface Element extends JSXElement {
22
+ }
23
+ interface IntrinsicElements {
24
+ [elemName: string]: JSXElementProps;
25
+ }
26
+ }
27
+ }
28
+ export interface FC<P extends JSXElementProps = JSXElementProps> {
29
+ (props: P): JSXNode;
30
+ displayName?: string;
31
+ }
32
+ export type DOMElement = JSXElement & {
33
+ type: string;
34
+ };
35
+ export interface RenderOptions {
36
+ container: Element | string;
37
+ hydrate?: boolean;
38
+ }
39
+ export interface EmberKitConfig {
40
+ mode: 'static' | 'ssr' | 'spa' | 'hybrid';
41
+ output: string;
42
+ jsx: 'automatic' | 'classic';
43
+ target: string;
44
+ vite?: Record<string, unknown>;
45
+ plugins?: unknown[];
46
+ }
47
+ export interface RouteParams<T extends Record<string, string> = Record<string, string>> {
48
+ params: T;
49
+ query: Record<string, string | string[]>;
50
+ request: Request;
51
+ }
52
+ export interface LoaderData<T> {
53
+ data: T;
54
+ error?: never;
55
+ }
56
+ export interface LoaderError {
57
+ data?: never;
58
+ error: {
59
+ code: string;
60
+ message: string;
61
+ status: number;
62
+ };
63
+ }
64
+ export type LoaderResult<T> = LoaderData<T> | LoaderError;
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC;IACrD,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC;AAEpC,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACzE,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,GAAG,CAAC;QACZ,UAAU,OAAQ,SAAQ,UAAU;SAAG;QACvC,UAAU,iBAAiB;YACzB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAAC;SACrC;KACF;CACF;AAGD,MAAM,WAAW,EAAE,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IAC7D,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,WAAW,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IACpF,MAAM,EAAE,CAAC,CAAC;IACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Signal, SignalOptions } from '../types.js';
2
+ export declare function resetSigIndex(): void;
3
+ export declare function getSignalByIndex(idx: number): {
4
+ subscribe: (fn: (v: unknown) => void) => () => void;
5
+ } | undefined;
6
+ export declare function createSignal<T>(initialValue: T, options?: SignalOptions<T>): [() => T, (newValue: T | ((prev: T) => T)) => void] & Signal<T>;
7
+ export declare function createMemo<T>(computation: () => T, _options?: SignalOptions<T>): Signal<T>;
8
+ export declare function createEffect(callback: () => void | (() => void)): () => void;
9
+ export declare function batch<T>(fn: () => T): T;
10
+ export declare function untrack<T>(fn: () => T): T;
11
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/signals/helpers/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKzD,wBAAgB,aAAa,IAAI,IAAI,CAAkB;AAEvD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;CAAE,GAAG,SAAS,CAEjH;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,YAAY,EAAE,CAAC,EACf,OAAO,GAAE,aAAa,CAAC,CAAC,CAAM,GAC7B,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAmEjE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAC1B,WAAW,EAAE,MAAM,CAAC,EACpB,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAC1B,MAAM,CAAC,CAAC,CAAC,CAqBX;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAqB5E;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEvC;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEzC"}
@@ -1,32 +1,52 @@
1
- import { DEFAULT_EQUALS } from '../types.js';
1
+ let sigIndex = 0;
2
+ const sigRegistry = new Map();
3
+ export function resetSigIndex() { sigIndex = 0; }
4
+ export function getSignalByIndex(idx) {
5
+ return sigRegistry.get(idx);
6
+ }
2
7
  export function createSignal(initialValue, options = {}) {
3
- const { equals = DEFAULT_EQUALS } = options;
4
8
  let value = initialValue;
5
- function notify() {
6
- void equals;
7
- }
9
+ const subs = new Set();
10
+ const idx = sigIndex++;
8
11
  function getter() {
9
12
  return value;
10
13
  }
14
+ getter.__idx = idx;
11
15
  function setter(newValue) {
12
- if (!equals(value, newValue)) {
13
- value = newValue;
14
- notify();
16
+ const next = typeof newValue === 'function' ? newValue(value) : newValue;
17
+ if (value === next)
18
+ return;
19
+ value = next;
20
+ if (subs.size > 0) {
21
+ const fns = [...subs];
22
+ for (let i = 0; i < fns.length; i++)
23
+ fns[i](value);
15
24
  }
16
25
  }
26
+ function subscribe(fn) {
27
+ subs.add(fn);
28
+ return () => subs.delete(fn);
29
+ }
30
+ sigRegistry.set(idx, { subscribe: subscribe });
17
31
  const signal = {
18
32
  get value() {
19
33
  return value;
20
34
  },
21
35
  set value(newValue) {
22
- if (!equals(value, newValue)) {
23
- value = newValue;
24
- notify();
36
+ const next = typeof newValue === 'function' ? newValue(value) : newValue;
37
+ if (value === next)
38
+ return;
39
+ value = next;
40
+ if (subs.size > 0) {
41
+ const fns = [...subs];
42
+ for (let i = 0; i < fns.length; i++)
43
+ fns[i](value);
25
44
  }
26
45
  },
27
46
  peek() {
28
47
  return value;
29
48
  },
49
+ subscribe,
30
50
  [Symbol.iterator]() {
31
51
  let index = 0;
32
52
  const methods = [getter, setter];
@@ -43,7 +63,6 @@ export function createSignal(initialValue, options = {}) {
43
63
  };
44
64
  },
45
65
  };
46
- // Make it array-like for tuple destructuring: [getter, setter]
47
66
  signal[0] = getter;
48
67
  signal[1] = setter;
49
68
  signal.length = 2;
@@ -67,6 +86,7 @@ export function createMemo(computation, _options) {
67
86
  }
68
87
  return value;
69
88
  },
89
+ subscribe: () => (() => { }),
70
90
  };
71
91
  }
72
92
  export function createEffect(callback) {
@@ -0,0 +1,7 @@
1
+ import type { Signal, ReadonlySignal } from '../types.js';
2
+ export declare function isSignal(value: unknown): value is Signal<unknown>;
3
+ export declare function isReadonlySignal<T>(signal: Signal<T>): signal is ReadonlySignal<T>;
4
+ export declare function getSignalValue<T>(signal: Signal<T>): T;
5
+ export declare function setSignalValue<T>(signal: Signal<T>, value: T): void;
6
+ export declare function readSignal<T>(signal: Signal<T>): T;
7
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/signals/helpers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAGjE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAChB,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAE7B;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAEtD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAOnE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAElD"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './helpers/core.js';
3
+ export * from './helpers/utils.js';
4
+ //# sourceMappingURL=index.d.ts.map