frontend-hamroun 1.1.7 → 1.1.8

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.
@@ -1,245 +1,192 @@
1
- function O(n, e) {
2
- console.log("JSX Transform:", { type: n, props: e });
3
- const t = { ...e };
4
- return arguments.length > 2 && (t.children = Array.prototype.slice.call(arguments, 2)), { type: n, props: t };
5
- }
6
- const H = ({ children: n }) => n;
7
- async function d(n) {
1
+ async function m(t) {
8
2
  var e;
9
- if (console.log("Creating element from:", n), n == null || typeof n == "boolean")
3
+ if (console.log("Creating element from:", t), t == null || typeof t == "boolean")
10
4
  return document.createTextNode("");
11
- if (typeof n == "number" || typeof n == "string")
12
- return document.createTextNode(String(n));
13
- if (Array.isArray(n)) {
14
- const t = document.createDocumentFragment();
15
- for (const s of n) {
16
- const r = await d(s);
17
- t.appendChild(r);
5
+ if (typeof t == "number" || typeof t == "string")
6
+ return document.createTextNode(String(t));
7
+ if (Array.isArray(t)) {
8
+ const r = document.createDocumentFragment();
9
+ for (const s of t) {
10
+ const n = await m(s);
11
+ r.appendChild(n);
18
12
  }
19
- return t;
13
+ return r;
20
14
  }
21
- if ("type" in n && n.props !== void 0) {
22
- const { type: t, props: s } = n;
23
- if (typeof t == "function")
15
+ if ("type" in t && t.props !== void 0) {
16
+ const { type: r, props: s } = t;
17
+ if (typeof r == "function")
24
18
  try {
25
- const c = await t(s || {}), a = await d(c);
26
- return a instanceof Element && a.setAttribute("data-component-id", t.name || t.toString()), a;
19
+ const c = await r(s || {}), a = await m(c);
20
+ return a instanceof Element && a.setAttribute("data-component-id", r.name || r.toString()), a;
27
21
  } catch (c) {
28
22
  return console.error("Error rendering component:", c), document.createTextNode("");
29
23
  }
30
- const r = document.createElement(t);
24
+ const n = document.createElement(r);
31
25
  for (const [c, a] of Object.entries(s || {}))
32
26
  if (c !== "children")
33
27
  if (c.startsWith("on") && typeof a == "function") {
34
- const u = c.toLowerCase().slice(2), x = (e = r.__events) == null ? void 0 : e[u];
35
- x && r.removeEventListener(u, x), r.addEventListener(u, a), r.__events || (r.__events = {}), r.__events[u] = a;
36
- } else c === "style" && typeof a == "object" ? Object.assign(r.style, a) : c === "className" ? r.setAttribute("class", String(a)) : c !== "key" && c !== "ref" && r.setAttribute(c, String(a));
28
+ const f = c.toLowerCase().slice(2), S = (e = n.__events) == null ? void 0 : e[f];
29
+ S && n.removeEventListener(f, S), n.addEventListener(f, a), n.__events || (n.__events = {}), n.__events[f] = a;
30
+ } else
31
+ c === "style" && typeof a == "object" ? Object.assign(n.style, a) : c === "className" ? n.setAttribute("class", String(a)) : c !== "key" && c !== "ref" && n.setAttribute(c, String(a));
37
32
  const i = s == null ? void 0 : s.children;
38
33
  if (i != null) {
39
34
  const c = Array.isArray(i) ? i.flat() : [i];
40
35
  for (const a of c) {
41
- const u = await d(a);
42
- r.appendChild(u);
36
+ const f = await m(a);
37
+ n.appendChild(f);
43
38
  }
44
39
  }
45
- return r;
40
+ return n;
46
41
  }
47
- return document.createTextNode(String(n));
42
+ return document.createTextNode(String(t));
48
43
  }
49
- let p = [], h = !1;
50
- function M(n) {
51
- if (h) {
52
- p.push(n);
44
+ let h = [], p = !1;
45
+ function _(t) {
46
+ if (p) {
47
+ h.push(t);
53
48
  return;
54
49
  }
55
- h = !0;
50
+ p = !0;
56
51
  try {
57
- for (n(); p.length > 0; ) {
58
- const e = p.shift();
52
+ for (t(); h.length > 0; ) {
53
+ const e = h.shift();
59
54
  e == null || e();
60
55
  }
61
56
  } finally {
62
- h = !1;
57
+ p = !1;
63
58
  }
64
59
  }
65
- function S() {
66
- return h;
60
+ function R() {
61
+ return p;
67
62
  }
68
63
  let o = 0;
69
- const g = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), y = /* @__PURE__ */ new Map(), E = /* @__PURE__ */ new Map();
70
- let w = null, _ = null, v = null;
71
- function j(n, e, t) {
72
- w = n, _ = t, v = e;
73
- }
74
- function A() {
75
- return o++, l.set(o, 0), o;
64
+ const g = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map(), d = /* @__PURE__ */ new Map(), y = /* @__PURE__ */ new Map(), w = /* @__PURE__ */ new Map();
65
+ let b = null, E = null, x = null;
66
+ function A(t, e, r) {
67
+ b = t, E = r, x = e;
76
68
  }
77
69
  function T() {
70
+ return o++, u.set(o, 0), o;
71
+ }
72
+ function j() {
78
73
  o = 0;
79
74
  }
80
- function R(n) {
75
+ function v(t) {
81
76
  if (!o)
82
77
  throw new Error("useState must be called within a render");
83
78
  g.has(o) || g.set(o, []);
84
- const e = g.get(o), t = l.get(o);
85
- t >= e.length && e.push(n);
86
- const s = e[t], r = (i) => {
87
- const c = typeof i == "function" ? i(e[t]) : i;
88
- e[t] !== c && (e[t] = c, S() ? M(() => C(o)) : C(o));
79
+ const e = g.get(o), r = u.get(o);
80
+ r >= e.length && e.push(t);
81
+ const s = e[r], n = (i) => {
82
+ const c = typeof i == "function" ? i(e[r]) : i;
83
+ e[r] !== c && (e[r] = c, R() ? _(() => C(o)) : C(o));
89
84
  };
90
- return l.set(o, t + 1), [s, r];
91
- }
92
- function k(n, e) {
93
- if (!o) throw new Error("useEffect must be called within a render");
94
- const t = l.get(o);
95
- m.has(o) || m.set(o, []);
96
- const s = m.get(o), r = s[t];
97
- (!r || !e || !r.deps || e.some((i, c) => i !== r.deps[c])) && (r != null && r.cleanup && r.cleanup(), queueMicrotask(() => {
98
- const i = n() || void 0;
99
- s[t] = { cleanup: i, deps: e };
100
- })), l.set(o, t + 1);
101
- }
102
- function L(n, e) {
103
- if (!o) throw new Error("useMemo must be called within a render");
104
- const t = l.get(o);
85
+ return u.set(o, r + 1), [s, n];
86
+ }
87
+ function L(t, e) {
88
+ if (!o)
89
+ throw new Error("useEffect must be called within a render");
90
+ const r = u.get(o);
91
+ d.has(o) || d.set(o, []);
92
+ const s = d.get(o), n = s[r];
93
+ (!n || !e || !n.deps || e.some((i, c) => i !== n.deps[c])) && (n != null && n.cleanup && n.cleanup(), queueMicrotask(() => {
94
+ const i = t() || void 0;
95
+ s[r] = { cleanup: i, deps: e };
96
+ })), u.set(o, r + 1);
97
+ }
98
+ function I(t, e) {
99
+ if (!o)
100
+ throw new Error("useMemo must be called within a render");
101
+ const r = u.get(o);
105
102
  y.has(o) || y.set(o, []);
106
- const s = y.get(o), r = s[t];
107
- if (!r || e && e.some((i, c) => !Object.is(i, r.deps[c]))) {
108
- const i = n();
109
- return s[t] = { value: i, deps: e }, l.set(o, t + 1), i;
103
+ const s = y.get(o), n = s[r];
104
+ if (!n || e && e.some((i, c) => !Object.is(i, n.deps[c]))) {
105
+ const i = t();
106
+ return s[r] = { value: i, deps: e }, u.set(o, r + 1), i;
110
107
  }
111
- return l.set(o, t + 1), r.value;
112
- }
113
- function D(n) {
114
- if (!o) throw new Error("useRef must be called within a render");
115
- const e = l.get(o);
116
- E.has(o) || E.set(o, []);
117
- const t = E.get(o);
118
- if (e >= t.length) {
119
- const r = { current: n };
120
- return t.push(r), l.set(o, e + 1), r;
121
- }
122
- const s = t[e];
123
- return l.set(o, e + 1), s;
108
+ return u.set(o, r + 1), n.value;
124
109
  }
125
- async function C(n) {
110
+ function O(t) {
111
+ if (!o)
112
+ throw new Error("useRef must be called within a render");
113
+ const e = u.get(o);
114
+ w.has(o) || w.set(o, []);
115
+ const r = w.get(o);
116
+ if (e >= r.length) {
117
+ const n = { current: t };
118
+ return r.push(n), u.set(o, e + 1), n;
119
+ }
120
+ const s = r[e];
121
+ return u.set(o, e + 1), s;
122
+ }
123
+ async function C(t) {
126
124
  try {
127
- const e = m.get(n);
128
- e && (e.forEach((t) => {
129
- t.cleanup && t.cleanup();
130
- }), m.set(n, [])), w && _ && v && await w(v, _);
125
+ const e = d.get(t);
126
+ e && (e.forEach((r) => {
127
+ r.cleanup && r.cleanup();
128
+ }), d.set(t, [])), b && E && x && await b(x, E);
131
129
  } catch (e) {
132
130
  console.error("Error during rerender:", e);
133
131
  }
134
132
  }
135
- function I() {
136
- const [n, e] = R(null);
137
- return [n, () => e(null)];
133
+ function k() {
134
+ const [t, e] = v(null);
135
+ return [t, () => e(null)];
138
136
  }
139
- const f = /* @__PURE__ */ new Map();
140
- function W(n) {
137
+ const l = /* @__PURE__ */ new Map();
138
+ function B(t) {
141
139
  const e = Symbol();
142
- return f.set(e, n), {
143
- Provider: ({ value: s, children: r }) => {
144
- const i = f.get(e);
145
- return Object.is(i, s) || f.set(e, s), r;
140
+ return l.set(e, t), {
141
+ Provider: ({ value: s, children: n }) => {
142
+ const i = l.get(e);
143
+ return Object.is(i, s) || l.set(e, s), n;
146
144
  },
147
145
  Consumer: ({ children: s }) => {
148
- const r = f.get(e);
149
- return s(r);
146
+ const n = l.get(e);
147
+ return s(n);
150
148
  },
151
149
  useSelector: (s) => {
152
- const r = f.get(e);
153
- return L(() => s(r), [r]);
150
+ const n = l.get(e);
151
+ return I(() => s(n), [n]);
154
152
  },
155
153
  _id: e
156
154
  };
157
155
  }
158
- function B(n) {
159
- return f.get(n._id);
160
- }
161
- class P {
162
- constructor(e = {}) {
163
- this.state = {}, this.element = null, this._mounted = !1, this.props = e;
164
- }
165
- componentDidMount() {
166
- }
167
- async setState(e) {
168
- const t = { ...this.state };
169
- this.state = { ...t, ...e }, console.log(`${this.constructor.name} state updated:`, {
170
- prev: t,
171
- next: this.state
172
- }), await Promise.resolve(), this._mounted ? await this.update() : await this.update();
173
- }
174
- _replayEvents(e, t) {
175
- const s = e.__events || {};
176
- Object.entries(s).forEach(([r, i]) => {
177
- t.addEventListener(r, i);
178
- }), t.__events = s;
179
- }
180
- _deepCloneWithEvents(e) {
181
- const t = e.cloneNode(!1), s = e.__events || {};
182
- return t.__events = s, Object.entries(s).forEach(([r, i]) => {
183
- t.addEventListener(r, i);
184
- }), Array.from(e.childNodes).forEach((r) => {
185
- r instanceof HTMLElement ? t.appendChild(this._deepCloneWithEvents(r)) : t.appendChild(r.cloneNode(!0));
186
- }), t;
187
- }
188
- async update() {
189
- const e = this.render();
190
- if (!e) return document.createTextNode("");
191
- const t = await d(e);
192
- if (t instanceof HTMLElement)
193
- return this._updateElement(t);
194
- const s = document.createElement("div");
195
- return s.appendChild(t), this._updateElement(s);
196
- }
197
- async _updateElement(e) {
198
- const t = this._deepCloneWithEvents(e);
199
- return t.__instance = this, this.element ? this.element.parentNode && (this.element.parentNode.replaceChild(t, this.element), this.element = t) : (this.element = t, this._mounted || (this._mounted = !0, queueMicrotask(() => this.componentDidMount()))), this.element;
200
- }
201
- render() {
202
- throw new Error("Component must implement render() method");
203
- }
156
+ function H(t) {
157
+ return l.get(t._id);
204
158
  }
205
- let b = !1;
206
- async function F(n, e) {
207
- b = !0;
159
+ let M = !1;
160
+ async function U(t, e) {
161
+ M = !0;
208
162
  try {
209
- await N(n, e);
163
+ await N(t, e);
210
164
  } finally {
211
- b = !1;
165
+ M = !1;
212
166
  }
213
167
  }
214
- async function N(n, e) {
215
- console.log("Rendering to:", e.id), M(async () => {
216
- const t = A();
168
+ async function N(t, e) {
169
+ console.log("Rendering to:", e.id), _(async () => {
170
+ const r = T();
217
171
  try {
218
- j(N, n, e);
219
- const s = await d(n);
220
- b || (e.innerHTML = ""), e.appendChild(s);
172
+ A(N, t, e);
173
+ const s = await m(t);
174
+ M || (e.innerHTML = ""), e.appendChild(s);
221
175
  } finally {
222
- T();
176
+ j();
223
177
  }
224
178
  });
225
179
  }
226
180
  export {
227
- P as Component,
228
- H as Fragment,
229
- M as batchUpdates,
230
- W as createContext,
231
- d as createElement,
232
- F as hydrate,
233
- S as isBatching,
234
- O as jsx,
235
- O as jsxDEV,
236
- O as jsxs,
181
+ _ as batchUpdates,
182
+ B as createContext,
183
+ U as hydrate,
237
184
  N as render,
238
- B as useContext,
239
- k as useEffect,
240
- I as useErrorBoundary,
241
- L as useMemo,
242
- D as useRef,
243
- R as useState
185
+ H as useContext,
186
+ L as useEffect,
187
+ k as useErrorBoundary,
188
+ I as useMemo,
189
+ O as useRef,
190
+ v as useState
244
191
  };
245
192
  //# sourceMappingURL=frontend-hamroun.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-hamroun.js","sources":["../src/jsx-runtime.ts","../src/batch.ts","../src/hooks.ts","../src/context.ts","../src/component.ts","../src/index.ts"],"sourcesContent":["import type { Component } from './component';\r\n\r\ninterface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n}\r\n\r\nexport function jsx(type: string | Function, props: any): VNode {\r\n console.log('JSX Transform:', { type, props });\r\n const processedProps = { ...props };\r\n \r\n // Handle children properly\r\n if (arguments.length > 2) {\r\n processedProps.children = Array.prototype.slice.call(arguments, 2);\r\n }\r\n \r\n return { type, props: processedProps };\r\n}\r\n\r\nexport { jsx as jsxs, jsx as jsxDEV };\r\nexport const Fragment = ({ children }: { children: any }) => children;\r\n\r\nexport async function createElement(vnode: VNode | any): Promise<Node> {\r\n console.log('Creating element from:', vnode);\r\n\r\n // Handle primitives and null\r\n if (vnode == null) {\r\n return document.createTextNode('');\r\n }\r\n \r\n if (typeof vnode === 'boolean') {\r\n return document.createTextNode('');\r\n }\r\n\r\n if (typeof vnode === 'number' || typeof vnode === 'string') {\r\n return document.createTextNode(String(vnode));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n const fragment = document.createDocumentFragment();\r\n for (const child of vnode) {\r\n const node = await createElement(child);\r\n fragment.appendChild(node);\r\n }\r\n return fragment;\r\n }\r\n\r\n // Handle VNode\r\n if ('type' in vnode && vnode.props !== undefined) {\r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props || {});\r\n const node = await createElement(result);\r\n if (node instanceof Element) {\r\n node.setAttribute('data-component-id', type.name || type.toString());\r\n }\r\n return node;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return document.createTextNode('');\r\n }\r\n }\r\n\r\n // Create DOM element\r\n const element = document.createElement(type as string);\r\n \r\n // Handle props\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.toLowerCase().slice(2);\r\n // Remove existing event listener if any\r\n const existingHandler = (element as any).__events?.[eventName];\r\n if (existingHandler) {\r\n element.removeEventListener(eventName, existingHandler);\r\n }\r\n \r\n // Add new event listener\r\n element.addEventListener(eventName, value as EventListener);\r\n if (!(element as any).__events) {\r\n (element as any).__events = {};\r\n }\r\n (element as any).__events[eventName] = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key === 'className') {\r\n element.setAttribute('class', String(value));\r\n } else if (key !== 'key' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Handle children\r\n const children = props?.children;\r\n if (children != null) {\r\n const childArray = Array.isArray(children) ? children.flat() : [children];\r\n for (const child of childArray) {\r\n const childNode = await createElement(child);\r\n element.appendChild(childNode);\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // Handle other objects by converting to string\r\n return document.createTextNode(String(vnode));\r\n}\r\n","type BatchCallback = () => void;\r\nlet batchQueue: BatchCallback[] = [];\r\nlet isBatchingUpdates = false;\r\n\r\nexport function batchUpdates(callback: BatchCallback) {\r\n if (isBatchingUpdates) {\r\n batchQueue.push(callback);\r\n return;\r\n }\r\n\r\n isBatchingUpdates = true;\r\n try {\r\n callback();\r\n while (batchQueue.length > 0) {\r\n const queuedCallback = batchQueue.shift();\r\n queuedCallback?.();\r\n }\r\n } finally {\r\n isBatchingUpdates = false;\r\n }\r\n}\r\n\r\nexport function isBatching() {\r\n return isBatchingUpdates;\r\n}\r\n","import { createElement } from './jsx-runtime';\r\nimport { batchUpdates, isBatching } from './batch';\r\nimport { diff } from './vdom';\r\n\r\nlet currentRender: number = 0;\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, Effect[]>();\r\nconst memos = new Map<number, { value: any; deps: any[] }[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\ninterface Effect {\r\n cleanup?: () => void;\r\n deps?: any[];\r\n}\r\n\r\n// Add at the top with other declarations\r\nlet globalRenderCallback: ((element: any, container: HTMLElement) => void) | null = null;\r\nlet globalContainer: HTMLElement | null = null;\r\nlet currentElement: any = null;\r\n\r\nexport function setRenderCallback(\r\n callback: (element: any, container: HTMLElement) => void,\r\n element: any,\r\n container: HTMLElement\r\n) {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender() {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender() {\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (value: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error('useState must be called within a render');\r\n }\r\n\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n\r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender)!;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n\r\n const state = componentStates[index];\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function' \r\n ? (newValue as Function)(componentStates[index])\r\n : newValue;\r\n\r\n if (componentStates[index] === nextValue) return; // Skip if value hasn't changed\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching()) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => (() => void) | void, deps?: any[]) {\r\n if (!currentRender) throw new Error('useEffect must be called within a render');\r\n \r\n const effectIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n\r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n // Run effect if deps changed\r\n if (!prevEffect || !deps || !prevEffect.deps || \r\n deps.some((dep, i) => dep !== prevEffect.deps![i])) {\r\n \r\n // Cleanup previous effect\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n\r\n // Schedule new effect\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup: cleanup, deps };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps: any[]): T {\r\n if (!currentRender) throw new Error('useMemo must be called within a render');\r\n \r\n const memoIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n\r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T) {\r\n if (!currentRender) throw new Error('useRef must be called within a render');\r\n \r\n const refIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n\r\n const componentRefs = refs.get(currentRender)!;\r\n if (refIndex >= componentRefs.length) {\r\n // Initialize with an object that has a current property\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n\r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\n// Add a map to track component DOM nodes\r\nconst componentNodes = new Map<Function, Node>();\r\n\r\nasync function rerender(rendererId: number) {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\n// Add new hook for error boundaries\r\nexport function useErrorBoundary(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Remove withHooks export\r\n","import { useMemo } from \"./hooks\";\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const id = Symbol();\r\n contexts.set(id, defaultValue);\r\n \r\n const useSelector = <S>(selector: (state: T) => S): S => {\r\n const value = contexts.get(id);\r\n return useMemo(() => selector(value), [value]);\r\n };\r\n\r\n return {\r\n Provider: ({ value, children }) => {\r\n const prevValue = contexts.get(id);\r\n if (!Object.is(prevValue, value)) {\r\n contexts.set(id, value);\r\n }\r\n return children;\r\n },\r\n Consumer: ({ children }) => {\r\n const value = contexts.get(id);\r\n return children(value);\r\n },\r\n useSelector,\r\n _id: id\r\n };\r\n}\r\n\r\nexport function useContext<T>(context: Context<T>): T {\r\n return contexts.get(context._id);\r\n}\r\n","import { createElement } from './jsx-runtime';\r\n\r\nexport class Component {\r\n state: any = {};\r\n props: any;\r\n element: HTMLElement | null = null;\r\n private _mounted: boolean = false;\r\n\r\n constructor(props: any = {}) {\r\n this.props = props;\r\n }\r\n\r\n componentDidMount() {\r\n // Hook for after component is mounted\r\n }\r\n\r\n async setState(newState: any) {\r\n const prevState = { ...this.state };\r\n this.state = { ...prevState, ...newState };\r\n console.log(`${this.constructor.name} state updated:`, {\r\n prev: prevState,\r\n next: this.state\r\n });\r\n \r\n await Promise.resolve(); // Ensure state is updated before re-render\r\n if (this._mounted) {\r\n await this.update();\r\n } else {\r\n await this.update();\r\n }\r\n }\r\n\r\n private _replayEvents(oldElement: HTMLElement, newElement: HTMLElement) {\r\n const oldEvents = (oldElement as any).__events || {};\r\n Object.entries(oldEvents).forEach(([event, handler]) => {\r\n newElement.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n (newElement as any).__events = oldEvents;\r\n }\r\n\r\n private _deepCloneWithEvents(node: HTMLElement): HTMLElement {\r\n const clone = node.cloneNode(false) as HTMLElement;\r\n \r\n // Copy events from original element\r\n const events = (node as any).__events || {};\r\n (clone as any).__events = events;\r\n Object.entries(events).forEach(([event, handler]) => {\r\n clone.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n\r\n // Clone children\r\n Array.from(node.childNodes).forEach(child => {\r\n if (child instanceof HTMLElement) {\r\n clone.appendChild(this._deepCloneWithEvents(child));\r\n } else {\r\n clone.appendChild(child.cloneNode(true));\r\n }\r\n });\r\n\r\n return clone;\r\n }\r\n\r\n async update() {\r\n const vdom = this.render();\r\n if (!vdom) return document.createTextNode('');\r\n \r\n const rendered = await createElement(vdom);\r\n if (rendered instanceof HTMLElement) {\r\n return this._updateElement(rendered);\r\n }\r\n \r\n const wrapper = document.createElement('div');\r\n wrapper.appendChild(rendered);\r\n return this._updateElement(wrapper);\r\n }\r\n\r\n private async _updateElement(rendered: HTMLElement) {\r\n const newElement = this._deepCloneWithEvents(rendered);\r\n (newElement as any).__instance = this;\r\n \r\n if (!this.element) {\r\n this.element = newElement;\r\n if (!this._mounted) {\r\n this._mounted = true;\r\n queueMicrotask(() => this.componentDidMount());\r\n }\r\n } else if (this.element.parentNode) {\r\n this.element.parentNode.replaceChild(newElement, this.element);\r\n this.element = newElement;\r\n }\r\n \r\n return this.element;\r\n }\r\n\r\n render(): any {\r\n throw new Error('Component must implement render() method');\r\n }\r\n}\r\n","import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\nimport { batchUpdates } from './batch';\r\n\r\nexport { \r\n useState, \r\n useEffect, \r\n useMemo, \r\n useRef,\r\n useErrorBoundary \r\n} from './hooks';\r\n\r\nexport { createContext, useContext } from './context';\r\nexport { batchUpdates } from './batch';\r\n\r\nexport * from './component';\r\nexport * from './context';\r\nexport * from './batch';\r\nexport * from './jsx-runtime';\r\n// Export any other modules you want to make public\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n\r\n"],"names":["jsx","type","props","processedProps","Fragment","children","createElement","vnode","_a","fragment","child","node","result","error","element","key","value","eventName","existingHandler","childArray","childNode","batchQueue","isBatchingUpdates","batchUpdates","callback","queuedCallback","isBatching","currentRender","states","stateIndices","effects","memos","refs","globalRenderCallback","globalContainer","currentElement","setRenderCallback","container","prepareRender","finishRender","useState","initial","componentStates","index","state","setState","newValue","nextValue","rerender","useEffect","deps","effectIndex","componentEffects","prevEffect","dep","i","cleanup","useMemo","factory","memoIndex","componentMemos","prevMemo","useRef","refIndex","componentRefs","ref","rendererId","effect","useErrorBoundary","setError","contexts","createContext","defaultValue","id","prevValue","selector","useContext","context","Component","newState","prevState","oldElement","newElement","oldEvents","event","handler","clone","events","vdom","rendered","wrapper","isHydrating","hydrate","render","domNode"],"mappings":"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"}
1
+ {"version":3,"file":"frontend-hamroun.js","sources":["../src/jsx-runtime.ts","../src/batch.ts","../src/hooks.ts","../src/context.ts","../src/index.ts"],"sourcesContent":["import type { Component } from './component';\r\n\r\ninterface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n}\r\n\r\nexport function jsx(type: string | Function, props: any): VNode {\r\n console.log('JSX Transform:', { type, props });\r\n const processedProps = { ...props };\r\n \r\n // Handle children properly\r\n if (arguments.length > 2) {\r\n processedProps.children = Array.prototype.slice.call(arguments, 2);\r\n }\r\n \r\n return { type, props: processedProps };\r\n}\r\n\r\nexport { jsx as jsxs, jsx as jsxDEV };\r\nexport const Fragment = ({ children }: { children: any }) => children;\r\n\r\nexport async function createElement(vnode: VNode | any): Promise<Node> {\r\n console.log('Creating element from:', vnode);\r\n\r\n // Handle primitives and null\r\n if (vnode == null) {\r\n return document.createTextNode('');\r\n }\r\n \r\n if (typeof vnode === 'boolean') {\r\n return document.createTextNode('');\r\n }\r\n\r\n if (typeof vnode === 'number' || typeof vnode === 'string') {\r\n return document.createTextNode(String(vnode));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n const fragment = document.createDocumentFragment();\r\n for (const child of vnode) {\r\n const node = await createElement(child);\r\n fragment.appendChild(node);\r\n }\r\n return fragment;\r\n }\r\n\r\n // Handle VNode\r\n if ('type' in vnode && vnode.props !== undefined) {\r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props || {});\r\n const node = await createElement(result);\r\n if (node instanceof Element) {\r\n node.setAttribute('data-component-id', type.name || type.toString());\r\n }\r\n return node;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return document.createTextNode('');\r\n }\r\n }\r\n\r\n // Create DOM element\r\n const element = document.createElement(type as string);\r\n \r\n // Handle props\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.toLowerCase().slice(2);\r\n // Remove existing event listener if any\r\n const existingHandler = (element as any).__events?.[eventName];\r\n if (existingHandler) {\r\n element.removeEventListener(eventName, existingHandler);\r\n }\r\n \r\n // Add new event listener\r\n element.addEventListener(eventName, value as EventListener);\r\n if (!(element as any).__events) {\r\n (element as any).__events = {};\r\n }\r\n (element as any).__events[eventName] = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key === 'className') {\r\n element.setAttribute('class', String(value));\r\n } else if (key !== 'key' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Handle children\r\n const children = props?.children;\r\n if (children != null) {\r\n const childArray = Array.isArray(children) ? children.flat() : [children];\r\n for (const child of childArray) {\r\n const childNode = await createElement(child);\r\n element.appendChild(childNode);\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // Handle other objects by converting to string\r\n return document.createTextNode(String(vnode));\r\n}\r\n","type BatchCallback = () => void;\r\nlet batchQueue: BatchCallback[] = [];\r\nlet isBatchingUpdates = false;\r\n\r\nexport function batchUpdates(callback: BatchCallback) {\r\n if (isBatchingUpdates) {\r\n batchQueue.push(callback);\r\n return;\r\n }\r\n\r\n isBatchingUpdates = true;\r\n try {\r\n callback();\r\n while (batchQueue.length > 0) {\r\n const queuedCallback = batchQueue.shift();\r\n queuedCallback?.();\r\n }\r\n } finally {\r\n isBatchingUpdates = false;\r\n }\r\n}\r\n\r\nexport function isBatching() {\r\n return isBatchingUpdates;\r\n}\r\n","import { createElement } from './jsx-runtime';\r\nimport { batchUpdates, isBatching } from './batch';\r\nimport { diff } from './vdom';\r\n\r\nlet currentRender: number = 0;\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, Effect[]>();\r\nconst memos = new Map<number, { value: any; deps: any[] }[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\ninterface Effect {\r\n cleanup?: () => void;\r\n deps?: any[];\r\n}\r\n\r\n// Add at the top with other declarations\r\nlet globalRenderCallback: ((element: any, container: HTMLElement) => void) | null = null;\r\nlet globalContainer: HTMLElement | null = null;\r\nlet currentElement: any = null;\r\n\r\nexport function setRenderCallback(\r\n callback: (element: any, container: HTMLElement) => void,\r\n element: any,\r\n container: HTMLElement\r\n) {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender() {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender() {\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (value: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error('useState must be called within a render');\r\n }\r\n\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n\r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender)!;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n\r\n const state = componentStates[index];\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function' \r\n ? (newValue as Function)(componentStates[index])\r\n : newValue;\r\n\r\n if (componentStates[index] === nextValue) return; // Skip if value hasn't changed\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching()) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => (() => void) | void, deps?: any[]) {\r\n if (!currentRender) throw new Error('useEffect must be called within a render');\r\n \r\n const effectIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n\r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n // Run effect if deps changed\r\n if (!prevEffect || !deps || !prevEffect.deps || \r\n deps.some((dep, i) => dep !== prevEffect.deps![i])) {\r\n \r\n // Cleanup previous effect\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n\r\n // Schedule new effect\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup: cleanup, deps };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps: any[]): T {\r\n if (!currentRender) throw new Error('useMemo must be called within a render');\r\n \r\n const memoIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n\r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T) {\r\n if (!currentRender) throw new Error('useRef must be called within a render');\r\n \r\n const refIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n\r\n const componentRefs = refs.get(currentRender)!;\r\n if (refIndex >= componentRefs.length) {\r\n // Initialize with an object that has a current property\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n\r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\n// Add a map to track component DOM nodes\r\nconst componentNodes = new Map<Function, Node>();\r\n\r\nasync function rerender(rendererId: number) {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\n// Add new hook for error boundaries\r\nexport function useErrorBoundary(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Remove withHooks export\r\n","import { useMemo } from \"./hooks\";\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const id = Symbol();\r\n contexts.set(id, defaultValue);\r\n \r\n const useSelector = <S>(selector: (state: T) => S): S => {\r\n const value = contexts.get(id);\r\n return useMemo(() => selector(value), [value]);\r\n };\r\n\r\n return {\r\n Provider: ({ value, children }) => {\r\n const prevValue = contexts.get(id);\r\n if (!Object.is(prevValue, value)) {\r\n contexts.set(id, value);\r\n }\r\n return children;\r\n },\r\n Consumer: ({ children }) => {\r\n const value = contexts.get(id);\r\n return children(value);\r\n },\r\n useSelector,\r\n _id: id\r\n };\r\n}\r\n\r\nexport function useContext<T>(context: Context<T>): T {\r\n return contexts.get(context._id);\r\n}\r\n","import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\nimport { batchUpdates } from './batch';\r\n\r\nexport { \r\n useState, \r\n useEffect, \r\n useMemo, \r\n useRef,\r\n useErrorBoundary \r\n} from './hooks';\r\n\r\nexport { createContext, useContext } from './context';\r\nexport { batchUpdates } from './batch';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n\r\n"],"names":["createElement","vnode","_a","fragment","child","node","type","props","result","error","element","key","value","eventName","existingHandler","children","childArray","childNode","batchQueue","isBatchingUpdates","batchUpdates","callback","queuedCallback","isBatching","currentRender","states","stateIndices","effects","memos","refs","globalRenderCallback","globalContainer","currentElement","setRenderCallback","container","prepareRender","finishRender","useState","initial","componentStates","index","state","setState","newValue","nextValue","rerender","useEffect","deps","effectIndex","componentEffects","prevEffect","dep","i","cleanup","useMemo","factory","memoIndex","componentMemos","prevMemo","useRef","refIndex","componentRefs","ref","rendererId","effect","useErrorBoundary","setError","contexts","createContext","defaultValue","id","prevValue","selector","useContext","context","isHydrating","hydrate","render","domNode"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,5 @@
1
1
  export { useState, useEffect, useMemo, useRef, useErrorBoundary } from './hooks';
2
2
  export { createContext, useContext } from './context';
3
3
  export { batchUpdates } from './batch';
4
- export * from './component';
5
- export * from './context';
6
- export * from './batch';
7
- export * from './jsx-runtime';
8
4
  export declare function hydrate(element: any, container: HTMLElement): Promise<void>;
9
5
  export declare function render(element: any, container: HTMLElement): Promise<void>;
package/package.json CHANGED
@@ -1,29 +1,24 @@
1
1
  {
2
2
  "name": "frontend-hamroun",
3
- "version": "1.1.7",
3
+ "version": "1.1.8",
4
4
  "description": "A lightweight frontend framework with hooks and virtual DOM",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
- "module": "./dist/index.js",
7
+ "module": "./dist/index.es.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "files": [
10
10
  "dist",
11
11
  "README.md",
12
12
  "LICENSE",
13
13
  "bin",
14
- "templates",
15
- "scripts"
14
+ "templates"
16
15
  ],
17
16
  "exports": {
18
17
  ".": {
19
- "import": "./dist/index.js",
20
- "require": "./dist/index.cjs",
21
- "types": "./dist/index.d.ts"
22
- },
23
- "./jsx-runtime": {
24
- "import": "./dist/jsx-runtime.js",
25
- "require": "./dist/jsx-runtime.cjs",
26
- "types": "./dist/jsx-runtime.d.ts"
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.es.js",
20
+ "require": "./dist/index.js",
21
+ "default": "./dist/index.es.js"
27
22
  }
28
23
  },
29
24
  "bin": {
@@ -31,12 +26,9 @@
31
26
  "create-frontend-app": "./bin/cli.js"
32
27
  },
33
28
  "scripts": {
34
- "dev": "vite",
35
29
  "build": "vite build && tsc --emitDeclarationOnly",
36
- "clean": "rimraf dist",
37
- "prepublishOnly": "npm run clean && npm run build",
38
- "postinstall": "node scripts/postinstall.js",
39
- "prepare": "npm run build"
30
+ "clean": "node -e \"if(require('fs').existsSync('dist')) require('fs').rmSync('dist',{recursive:true})\"",
31
+ "prepublishOnly": "npm run clean && npm run build"
40
32
  },
41
33
  "keywords": [
42
34
  "frontend",
@@ -53,13 +45,12 @@
53
45
  },
54
46
  "devDependencies": {
55
47
  "@types/react": "^19.0.8",
56
- "@vitejs/plugin-react": "^4.2.1",
48
+ "@vitejs/plugin-react": "^4.0.4",
57
49
  "nanospinner": "^1.1.0",
58
- "rimraf": "^5.0.10",
59
50
  "terser": "^5.38.1",
60
51
  "typescript": "^5.0.0",
61
- "vite": "^5.0.12",
62
- "vite-plugin-dts": "^3.7.2",
52
+ "vite": "^4.4.9",
53
+ "vite-plugin-dts": "^4.5.0",
63
54
  "vitest": "^0.34.0"
64
55
  },
65
56
  "publishConfig": {
@@ -9,10 +9,10 @@
9
9
  "preview": "vite preview"
10
10
  },
11
11
  "dependencies": {
12
- "frontend-hamroun": "^1.1.5"
12
+ "frontend-hamroun": "^1.0.0"
13
13
  },
14
14
  "devDependencies": {
15
- "vite": "^5.0.12",
15
+ "vite": "^4.4.9",
16
16
  "typescript": "^5.0.0"
17
17
  }
18
18
  }
@@ -1,26 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
- const { execSync } = require('child_process');
6
-
7
- const packageRoot = path.resolve(__dirname, '..');
8
-
9
- // Skip postinstall for development
10
- if (process.env.NODE_ENV === 'development') {
11
- process.exit(0);
12
- }
13
-
14
- try {
15
- if (!fs.existsSync(path.join(packageRoot, 'dist'))) {
16
- console.log('Building package...');
17
- execSync('npm run build', {
18
- cwd: packageRoot,
19
- stdio: 'inherit'
20
- });
21
- }
22
- } catch (error) {
23
- console.warn('Warning: Failed to run postinstall build:', error.message);
24
- // Don't exit with error to prevent blocking installations
25
- process.exit(0);
26
- }