onelaraveljs 1.0.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 (67) hide show
  1. package/README.md +87 -0
  2. package/docs/integration_analysis.md +116 -0
  3. package/docs/onejs_analysis.md +108 -0
  4. package/docs/optimization_implementation_group2.md +458 -0
  5. package/docs/optimization_plan.md +130 -0
  6. package/index.js +16 -0
  7. package/package.json +13 -0
  8. package/src/app.js +61 -0
  9. package/src/core/API.js +72 -0
  10. package/src/core/ChildrenRegistry.js +410 -0
  11. package/src/core/DOMBatcher.js +207 -0
  12. package/src/core/ErrorBoundary.js +226 -0
  13. package/src/core/EventDelegator.js +416 -0
  14. package/src/core/Helper.js +817 -0
  15. package/src/core/LoopContext.js +97 -0
  16. package/src/core/OneDOM.js +246 -0
  17. package/src/core/OneMarkup.js +444 -0
  18. package/src/core/Router.js +996 -0
  19. package/src/core/SEOConfig.js +321 -0
  20. package/src/core/SectionEngine.js +75 -0
  21. package/src/core/TemplateEngine.js +83 -0
  22. package/src/core/View.js +273 -0
  23. package/src/core/ViewConfig.js +229 -0
  24. package/src/core/ViewController.js +1410 -0
  25. package/src/core/ViewControllerOptimized.js +164 -0
  26. package/src/core/ViewIdentifier.js +361 -0
  27. package/src/core/ViewLoader.js +272 -0
  28. package/src/core/ViewManager.js +1962 -0
  29. package/src/core/ViewState.js +761 -0
  30. package/src/core/ViewSystem.js +301 -0
  31. package/src/core/ViewTemplate.js +4 -0
  32. package/src/core/helpers/BindingHelper.js +239 -0
  33. package/src/core/helpers/ConfigHelper.js +37 -0
  34. package/src/core/helpers/EventHelper.js +172 -0
  35. package/src/core/helpers/LifecycleHelper.js +17 -0
  36. package/src/core/helpers/ReactiveHelper.js +169 -0
  37. package/src/core/helpers/RenderHelper.js +15 -0
  38. package/src/core/helpers/ResourceHelper.js +89 -0
  39. package/src/core/helpers/TemplateHelper.js +11 -0
  40. package/src/core/managers/BindingManager.js +671 -0
  41. package/src/core/managers/ConfigurationManager.js +136 -0
  42. package/src/core/managers/EventManager.js +309 -0
  43. package/src/core/managers/LifecycleManager.js +356 -0
  44. package/src/core/managers/ReactiveManager.js +334 -0
  45. package/src/core/managers/RenderEngine.js +292 -0
  46. package/src/core/managers/ResourceManager.js +441 -0
  47. package/src/core/managers/ViewHierarchyManager.js +258 -0
  48. package/src/core/managers/ViewTemplateManager.js +127 -0
  49. package/src/core/reactive/ReactiveComponent.js +592 -0
  50. package/src/core/services/EventService.js +418 -0
  51. package/src/core/services/HttpService.js +106 -0
  52. package/src/core/services/LoggerService.js +57 -0
  53. package/src/core/services/StateService.js +512 -0
  54. package/src/core/services/StorageService.js +856 -0
  55. package/src/core/services/StoreService.js +258 -0
  56. package/src/core/services/TemplateDetectorService.js +361 -0
  57. package/src/core/services/Test.js +18 -0
  58. package/src/helpers/devWarnings.js +205 -0
  59. package/src/helpers/performance.js +226 -0
  60. package/src/helpers/utils.js +287 -0
  61. package/src/init.js +343 -0
  62. package/src/plugins/auto-plugin.js +34 -0
  63. package/src/services/Test.js +18 -0
  64. package/src/types/index.js +193 -0
  65. package/src/utils/date-helper.js +51 -0
  66. package/src/utils/helpers.js +39 -0
  67. package/src/utils/validation.js +32 -0
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # onelaraveljs
2
+
3
+ The Core JavaScript Framework for OneLaravel applications. This library provides the fundamental runtime, view management, and routing capabilities for building OneLaravel SPAs.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install onelaraveljs
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ OneJS is designed to be the "engine" while your application provides the "map" (Views and Configuration).
14
+
15
+ ### 1. Project Structure
16
+
17
+ Ensure your project has the following recommended structure for frontend assets:
18
+ ```
19
+ resources/js/
20
+ ├── app.js # Main entry point
21
+ ├── config/
22
+ │ └── viewRegistry.generated.js # (Generated by build tools)
23
+ └── views/ # Your specific application views
24
+ ```
25
+
26
+ ### 2. Main Entry (`app.js`)
27
+
28
+ In your project's main JavaScript entry point, you need to wire up the Core with your Project's views:
29
+
30
+ ```javascript
31
+ import { App, viewLoader } from 'onelaraveljs';
32
+ import { viewRegistry } from './config/viewRegistry.generated.js';
33
+
34
+ // 1. Dependency Injection: Tell the Core where to find your views
35
+ viewLoader.setRegistry(viewRegistry);
36
+
37
+ // 2. Initialize the App
38
+ // The App will look for window.APP_CONFIGS (injected by Laravel Blade) to configure itself
39
+ if (window.APP_CONFIGS) {
40
+ App.init();
41
+ }
42
+
43
+ // 3. Export for UMD/Debugging (Optional)
44
+ window.App = App;
45
+ ```
46
+
47
+ ### 3. Server-Side Setup (Blade)
48
+
49
+ Ensure your main layout file injects the configuration:
50
+
51
+ ```html
52
+ <script>
53
+ window.APP_CONFIGS = {
54
+ env: { ... },
55
+ routes: [ ... ],
56
+ // ... other configurations
57
+ };
58
+ </script>
59
+ <script src="{{ mix('js/app.js') }}"></script>
60
+ ```
61
+
62
+ ## Core Concepts
63
+
64
+ ### ViewLoader vs ViewRegistry
65
+
66
+ - **ViewLoader** (Library): The logic responsible for dynamically importing and caching views. It is "blind" until it receives a registry.
67
+ - **ViewRegistry** (Project): A map of view names (e.g., `'auth.login'`) to dynamic import functions. This is typically auto-generated by your build tools.
68
+
69
+ ### Event Service
70
+
71
+ OneJS comes with a built-in Event Service for cross-component communication:
72
+
73
+ ```javascript
74
+ import { App } from '@onelaravel/onejs';
75
+
76
+ // Listen
77
+ App.Event.on('user:logged-in', (user) => {
78
+ console.log(user);
79
+ });
80
+
81
+ // Emit
82
+ App.Event.emit('user:logged-in', { id: 1, name: 'John' });
83
+ ```
84
+
85
+ ## License
86
+
87
+ MIT
@@ -0,0 +1,116 @@
1
+ # Tương Tác Giữa ViewManager, View và ViewControllerOptimized
2
+
3
+ Tài liệu này giải thích cách `ViewControllerOptimized` sẽ thay thế `ViewController` hiện tại mà không làm gãy cấu trúc `View` và `ViewManager` của OneJS.
4
+
5
+ ## 1. Mối Quan Hệ Hiện Tại
6
+
7
+ ```mermaid
8
+ graph TD
9
+ ViewManager --> |quản lý| View
10
+ View --> |sở hữu (composition)| ViewController
11
+ ViewController --> |sở hữu| Managers(EventManager, ReactiveManager...)
12
+ ```
13
+
14
+ - **ViewManager**: Gọi `new View(name, data)` để tạo view mới.
15
+ - **View**: Trong `constructor()`, nó khởi tạo `this.__ = new ViewController(path, this, null)`.
16
+ - **ViewController**: Là "bộ não" xử lý mọi logic render, state, event.
17
+
18
+ ## 2. Chiến Lược Thay Thế Trong Suốt (Transparent Replacement)
19
+
20
+ Chúng ta sẽ thay thế class `ViewController` cũ bằng `ViewControllerOptimized` (được đổi tên thành `ViewController` khi release) sao cho `View` và `ViewManager` **không hề hay biết** về sự thay đổi này.
21
+
22
+ ### Điều Kiện Cần
23
+
24
+ `ViewControllerOptimized` phải implement (hoặc bridge) toàn bộ **Public API** mà `View` đang gọi đến.
25
+
26
+ ### Các "Điểm Chạm" (Touch Points) Chính
27
+
28
+ #### A. Khởi Tạo (Trong `View.js`)
29
+
30
+ ```javascript
31
+ // core/View.js
32
+ import { ViewController } from "./ViewController.js"; // <-- Sau này sẽ trỏ tới file mới
33
+
34
+ export class View {
35
+ constructor(path, config) {
36
+ // ...
37
+ // Logic này giữ nguyên, chỉ cần đảm bảo ViewController mới nhận đúng tham số
38
+ const controller = new ViewController(path, this, null);
39
+ // ...
40
+ }
41
+ }
42
+ ```
43
+
44
+ #### B. Setup & Config (Trong `ViewManager.js` & `View.js`)
45
+
46
+ `View` gọi `this.__.setup(config)`.
47
+
48
+ - **Cũ**: `ViewController.setup()` gọi `InitializationManager` (hoặc logic hỗn hợp).
49
+ - **Mới**: `ViewControllerOptimized.setup()` sẽ gọi `ConfigHelper.process(this, config)`.
50
+
51
+ #### C. Rendering (Trong `ViewManager.js`)
52
+
53
+ `ViewManager` gọi `view.__.render()` hoặc `virtualRender()`.
54
+
55
+ - **Cũ**: `this._renderEngine.render()`.
56
+ - **Mới**: `RenderHelper.render(this)`.
57
+
58
+ #### D. Hydration (SSR) (Trong `ViewManager.js`)
59
+
60
+ `ViewManager` gọi `view.__.__scan(ssrData)`.
61
+
62
+ - **Cũ**: Logic scan nằm trong `RenderEngine` hoặc inline.
63
+ - **Mới**: `scanRenderedView` gọi `RenderHelper.scan(this, ssrData)`.
64
+
65
+ #### E. State & Props Access (Trong Compiled View Files)
66
+
67
+ Các file view đã compile (như `WebTemplatesExamplesSectionsDebtItem.js`) truy cập `this` (là instance của `View`), và `View` proxy sang `ViewController`.
68
+
69
+ ```javascript
70
+ // Ví dụ compiled code
71
+ render() {
72
+ return `... ${this.__reactive(id, keys, ...)} ...`;
73
+ }
74
+ ```
75
+
76
+ - **Yêu cầu**: `ViewControllerOptimized` **BẮT BUỘC** phải có phương thức `__reactive`.
77
+ - **Implementation**:
78
+ ```javascript
79
+ __reactive(id, keys, renderFn) {
80
+ // Forward sang Helper
81
+ return ReactiveHelper.renderOutputComponent(this, keys, renderFn);
82
+ }
83
+ ```
84
+
85
+ ## 3. Bản Đồ API (API Mapping)
86
+
87
+ Dưới đây là mapping chi tiết các method mà `View` gọi sang `ViewController`:
88
+
89
+ | View Method (Caller) | ViewController (Old) | ViewControllerOptimized (New) | Helper |
90
+ | :------------------- | :-------------------------- | :---------------------------- | :-------------------------------------- |
91
+ | `setup(config)` | `setup(config)` | `setup(config)` | `ConfigHelper` |
92
+ | `render()` | `_renderEngine.render()` | `render()` | `RenderHelper` |
93
+ | `prerender()` | `_renderEngine.prerender()` | `prerender()` | `RenderHelper` |
94
+ | `destroy()` | `destroy()` | `destroy()` | Gọi `LifecycleHelper`, `EventHelper`... |
95
+ | `.states` (Getter) | `this.states` | `this.states` | _Giữ nguyên (ViewState)_ |
96
+ | `.id` (Getter) | `this.id` | `this.id` | _Property trực tiếp_ |
97
+ | `__reactive()` | _(via RenderEngine/Mixin)_ | `__reactive()` | `ReactiveHelper` |
98
+ | `addEventConfig()` | Use `_eventManager` | `addEventConfig()` | `EventHelper` / `this.events` (data) |
99
+
100
+ ## 4. Kế Hoạch Thay Thế (Release Plan)
101
+
102
+ 1. **Giai đoạn 1 (Hiện tại)**:
103
+ - Hoàn thiện `ViewControllerOptimized` và các `Helper`.
104
+ - Đảm bảo `ViewControllerOptimized` chạy song song và pass unit test/manual test.
105
+ 2. **Giai đoạn 2 (Switch)**:
106
+
107
+ - Đổi tên `ViewController.js` -> `ViewControllerLegacy.js`.
108
+ - Đổi tên `ViewControllerOptimized.js` -> `ViewController.js`.
109
+
110
+ 3. **Giai đoạn 3 (Integration Test)**:
111
+ - Chạy thử `ViewManager` với Controller mới.
112
+ - Vì `ViewManager` và `View` chỉ import `ViewController` theo đường dẫn file `core/ViewController.js`, việc đổi tên file là đủ để tích hợp.
113
+
114
+ ## 5. Kết Luận
115
+
116
+ `ViewManager` và `View` **không cần sửa đổi code**. Chúng tương tác với Controller thông qua một Interface ngầm định (duck typing). Miễn là `ViewControllerOptimized` implement đủ các method public (như `render`, `setup`, `destroy`, `__reactive`), hệ thống sẽ hoạt động bình thường với hiệu suất cao hơn.
@@ -0,0 +1,108 @@
1
+ # Phân Tích Framework OneJS
2
+
3
+ Tài liệu này tổng hợp phân tích về cấu trúc và cơ chế hoạt động của **OneJS**, một framework frontend custom được thiết kế để hoạt động chặt chẽ với Laravel Blade (dựa trên cấu trúc file và cách sinh code).
4
+
5
+ ## 1. Tổng Quan
6
+
7
+ OneJS là một Single Page Application (SPA) framework tự xây dựng, có khả năng:
8
+
9
+ - **Client-side Rendering (CSR)**: Render giao diện động tại phía client.
10
+ - **Server-side Rendering (SSR) Hydration**: Có khả năng "scan" và "hydrate" HTML được render sẵn từ server (Laravel Blade) để gắn logic Javascript vào.
11
+ - **Component-based**: Tổ chức code theo các View/Component độc lập.
12
+ - **Reactivity**: Hệ thống state management reactive tự xây dựng.
13
+
14
+ ## 2. Cấu Trúc Thư Mục (`resources/js/onejs`)
15
+
16
+ - **`core/`**: Chứa mã nguồn cốt lõi của framework.
17
+ - `ViewManager.js`: Quản lý toàn bộ hệ thống view, routing và điều phối.
18
+ - `ViewController.js`: Controller cho từng instance của view, quản lý lifecycle, state, và events.
19
+ - `managers/`: Các module con hỗ trợ `ViewController` (như `RenderEngine`, `EventManager`, `ReactiveManager`).
20
+ - `OneMarkup.js`: Công cụ thao tác DOM và parse cấu trúc markup.
21
+ - `Router.js`: Xử lý điều hướng client-side.
22
+ - **`views/`**: Chứa các file Javascript được biên dịch (compiled) từ các file gốc (có thể là Blade component). Đây là nơi chứa logic cụ thể của từng view.
23
+ - **`app.js` & `init.js`**: Điểm khởi chạy của ứng dụng.
24
+
25
+ ## 3. Kiến Trúc Cốt Lõi
26
+
27
+ ### A. ViewManager (`core/ViewManager.js`)
28
+
29
+ Đây là "bộ não" của ứng dụng:
30
+
31
+ - **Quản lý View**: Lưu trữ cache các view template (`templates`, `cachedViews`).
32
+ - **Loading**: Hỗ trợ Dynamic Import view thông qua `ViewLoader`.
33
+ - **Routing**: Tích hợp với `Router` để load view dựa trên URL.
34
+ - **Render & Scan**: Cung cấp 2 phương thức chính:
35
+ - `loadView()`: Load và render mới một view (CSR).
36
+ - `scanView()`: Scan DOM hiện tại (được server render) để gắn logic JS vào (SSR Hydration).
37
+ - **Super View**: Hỗ trợ khái niệm "Layout" (Super View) cho phép lồng các view con vào view cha.
38
+
39
+ ### B. ViewController (`core/ViewController.js`)
40
+
41
+ Mỗi view instance sẽ có một `ViewController` riêng biệt:
42
+
43
+ - **Lifecycle Management**: Quản lý các hooks như `created`, `mounted`, `destroyed` thông qua `LifecycleManager`.
44
+ - **Managers**: Nó ủy quyền các tác vụ cụ thể cho các manager con:
45
+ - `RenderEngine`: Xử lý render HTML.
46
+ - `EventManager`: Đăng ký và xử lý sự kiện DOM.
47
+ - `ReactiveManager`: Theo dõi thay đổi state và cập nhật UI.
48
+ - `ResourceManager`: Quản lý CSS/JS assets riêng của view.
49
+
50
+ ### C. RenderEngine (`core/managers/RenderEngine.js`)
51
+
52
+ Chịu trách nhiệm sinh ra HTML hoặc cập nhật DOM:
53
+
54
+ - **Render**: Chạy hàm `render()` của view để tạo ra chuỗi HTML.
55
+ - **Scan**: Duyệt qua cấu trúc DOM thực tế để tìm các element tương ứng với logic của view (`scanDOMElements`).
56
+ - **Virtual Render**: Chế độ render ảo để tính toán cấu trúc mà không update DOM ngay lập tức.
57
+ - **Wrapper**: Hỗ trợ bọc view trong các thẻ container (wrapper) để quản lý phạm vi.
58
+
59
+ ### D. Hệ Thống Reactivity (`core/ViewState.js` & `views/...js`)
60
+
61
+ Logic reactive hoạt động như sau:
62
+
63
+ 1. **Khai báo State**: Trong file view biên dịch, các state được đăng ký qua `__STATE__.__.register()`.
64
+ 2. **Setters**: Tạo ra các hàm setter (ví dụ `setDebtData`).
65
+ 3. **Binding**: Trong hàm `render`, các cấu trúc như `this.__reactive` hoặc `this.__classBinding` được sử dụng để gắn kết dữ liệu với DOM.
66
+ 4. **Update**: Khi state thay đổi qua setter, `ReactiveManager` sẽ kích hoạt cập nhật lại các phần DOM bị ảnh hưởng (fine-grained updates).
67
+
68
+ ## 4. Luồng Hoạt Động (Data Flow)
69
+
70
+ ### Khởi tạo App
71
+
72
+ 1. `init.js` kiểm tra config `window.APP_CONFIGS`.
73
+ 2. Khởi tạo `OneMarkup`, `Router`, `ViewManager`.
74
+ 3. Nếu là SSR, gọi `Router.start(true)` và hệ thống sẽ thực hiện `scanView` thay vì render mới.
75
+
76
+ ### Quy trình Render một View (CSR)
77
+
78
+ 1. `ViewManager.loadView(name)` được gọi.
79
+ 2. Load module view từ `views/`.
80
+ 3. Tạo instance `ViewEngine` (wrapper của `ViewController`).
81
+ 4. Chạy `RenderEngine.render` -> Sinh HTML string.
82
+ 5. Insert HTML vào container (`#app-root`).
83
+ 6. Gọi hook `mounted`.
84
+
85
+ ### Quy trình Hydrate một View (SSR)
86
+
87
+ 1. `ViewManager.scanView(name)` được gọi.
88
+ 2. Tìm kiếm dữ liệu `ssrData` đã được server inject.
89
+ 3. Tạo instance View.
90
+ 4. `RenderEngine.scan` -> Tìm các element trong DOM tương ứng với View ID.
91
+ 5. Gắn các event handlers và binding mà không render lại HTML.
92
+
93
+ ## 5. Phân Tích File View (`views/WebTemplatesExamplesSectionsDebtItem.js`)
94
+
95
+ File view được biên dịch chứa:
96
+
97
+ - **Hàm khởi tạo**: Nhận `App`, `systemData`, `$$$DATA$$$` (props).
98
+ - **State Setup**: `useState`, `setDebtData`...
99
+ - **Methods**: Các hàm xử lý logic (ví dụ `togglePaidStatus`, `handleUpdateDebt`).
100
+ - **Render Function**: Trả về chuỗi HTML template string, sử dụng các helper:
101
+ - `${this.__classBinding(...)}`: Binding class động.
102
+ - `${this.__addEventConfig(...)}`: Gắn sự kiện (click, submit...).
103
+ - `${this.__reactive(...)}`: Hiển thị dữ liệu text động.
104
+ - `${this.__watch(...)}`: Render lại khối HTML khi state phụ thuộc thay đổi.
105
+
106
+ ## Kết luận
107
+
108
+ OneJS là một framework khá phức tạp và mạnh mẽ, được thiết kế tối ưu cho việc kết hợp giữa Server-side Rendering của Laravel và tính năng động của SPA. Nó tự quản lý DOM, Event và State mà không phụ thuộc vào các thư viện lớn như React hay Vue, giúp tối ưu hóa tải trọng và kiểm soát chi tiết quá trình render.