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
@@ -0,0 +1,187 @@
1
+ export class InjectionToken {
2
+ constructor(description) {
3
+ this.description = description;
4
+ }
5
+ toString() {
6
+ return `InjectionToken ${this.description}`;
7
+ }
8
+ }
9
+
10
+ export function isClass(fn) {
11
+ if (typeof fn !== 'function') return false;
12
+ const str = fn.toString();
13
+ if (/^\s*class\s+/.test(str)) return true;
14
+ return fn.prototype !== undefined &&
15
+ fn.prototype.constructor === fn &&
16
+ Object.getOwnPropertyNames(fn.prototype).length > 1;
17
+ }
18
+
19
+ export class Injector {
20
+ get(token, options = { optional: false }) {
21
+ throw new Error('Not implemented');
22
+ }
23
+ }
24
+
25
+ export class NullInjector extends Injector {
26
+ get(token, options = { optional: false }) {
27
+ if (options.optional) {
28
+ return null;
29
+ }
30
+ const tokenName = token?.name || token?.description || token;
31
+ throw new Error(`NullInjectorError: No provider for ${tokenName}!`);
32
+ }
33
+ }
34
+
35
+ const NULL_INJECTOR = new NullInjector();
36
+
37
+ export class EnvironmentInjector extends Injector {
38
+ constructor(providers = [], parent = NULL_INJECTOR) {
39
+ super();
40
+ this.parent = parent;
41
+ this.records = new Map();
42
+ this.instances = new Map();
43
+ this.resolutionStack = new Set();
44
+ this._normalizeProviders(providers);
45
+ }
46
+
47
+ _normalizeProviders(providers) {
48
+ for (const provider of providers) {
49
+ if (typeof provider === 'function' && isClass(provider)) {
50
+ this.records.set(provider, { useClass: provider });
51
+ } else if (provider && provider.provide) {
52
+ this.records.set(provider.provide, provider);
53
+ } else {
54
+ throw new Error(`Invalid provider configuration: ${provider}`);
55
+ }
56
+ }
57
+ }
58
+
59
+ provide(provider) {
60
+ this._normalizeProviders([provider]);
61
+ }
62
+
63
+ // Bubble-up algorithm for resolving hierarchical dependencies
64
+ get(token, options = { optional: false }) {
65
+ if (this.instances.has(token)) {
66
+ return this.instances.get(token);
67
+ }
68
+
69
+ if (this.records.has(token)) {
70
+ if (this.resolutionStack.has(token)) {
71
+ const path = [...this.resolutionStack, token]
72
+ .map(t => t?.name || t?.description || t)
73
+ .join(' -> ');
74
+ throw new Error(`Circular dependency detected: ${path}`);
75
+ }
76
+
77
+ this.resolutionStack.add(token);
78
+
79
+ try {
80
+ const record = this.records.get(token);
81
+ const instance = this._instantiate(record);
82
+ this.instances.set(token, instance);
83
+ return instance;
84
+ } finally {
85
+ this.resolutionStack.delete(token);
86
+ }
87
+ }
88
+
89
+ if (options.self === true) {
90
+ if (options.optional === true) {
91
+ return null;
92
+ }
93
+ const tokenName = token?.name || token?.description || token;
94
+ throw new Error(`NullInjectorError: No provider found for ${tokenName} locally (self: true)`);
95
+ }
96
+
97
+ return this.parent.get(token, options);
98
+ }
99
+
100
+ _instantiate(record) {
101
+ return runInContext(this, () => {
102
+ if (record.useValue !== undefined) {
103
+ return record.useValue;
104
+ }
105
+ if (record.useFactory) {
106
+ return record.useFactory();
107
+ }
108
+ if (record.useExisting) {
109
+ return inject(record.useExisting);
110
+ }
111
+ if (record.useClass) {
112
+ const ClassDef = record.useClass;
113
+ return new ClassDef();
114
+ }
115
+ throw new Error(`Invalid provider record configuration for ${record.provide?.name || record.provide}`);
116
+ });
117
+ }
118
+
119
+ createChild(providers = []) {
120
+ return new EnvironmentInjector(providers, this);
121
+ }
122
+
123
+ destroy() {
124
+ for (const instance of this.instances.values()) {
125
+ if (instance && typeof instance.destroy === 'function') {
126
+ try {
127
+ instance.destroy();
128
+ } catch (e) {
129
+ console.error('Error during instance destroy:', e);
130
+ }
131
+ } else if (instance && typeof instance.onDestroy === 'function') {
132
+ try {
133
+ instance.onDestroy();
134
+ } catch (e) {
135
+ console.error('Error during instance onDestroy:', e);
136
+ }
137
+ }
138
+ }
139
+ this.instances.clear();
140
+ this.records.clear();
141
+ }
142
+ }
143
+
144
+ let _activeInjector = null;
145
+
146
+ export function runInContext(injector, fn) {
147
+ const previousInjector = _activeInjector;
148
+ _activeInjector = injector;
149
+ try {
150
+ return fn();
151
+ } finally {
152
+ _activeInjector = previousInjector;
153
+ }
154
+ }
155
+
156
+ export function replaceActiveInjector(injector) {
157
+ _activeInjector = injector;
158
+ }
159
+
160
+ export function inject(token, options = {}) {
161
+ if (_activeInjector === null) {
162
+ throw new Error('inject() called outside of an injection context');
163
+ }
164
+
165
+ const isOptional = options.optional === true;
166
+ const skipSelf = options.skipSelf === true;
167
+ const self = options.self === true;
168
+
169
+ if (skipSelf && self) {
170
+ throw new Error('Cannot combine both skipSelf and self InjectOptions');
171
+ }
172
+
173
+ const injectorToUse = skipSelf ? _activeInjector.parent : _activeInjector;
174
+
175
+ if (!injectorToUse) {
176
+ if (isOptional) return null;
177
+ throw new Error(`NullInjectorError: No provider found for ${token?.name || token}`);
178
+ }
179
+
180
+ return injectorToUse.get(token, options);
181
+ }
182
+
183
+ export const rootInjector = new EnvironmentInjector();
184
+
185
+ export function provideGlobal(provider) {
186
+ rootInjector.provide(provider);
187
+ }