Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
9e7d3f6
init
piggggggggy Nov 15, 2025
85ea84f
build: add GitHub Pages deployment workflow
piggggggggy Nov 18, 2025
095260b
feat(createElement): implement core element creation and normalization
piggggggggy Nov 18, 2025
092e64e
refactor: normalize element creation for consistent VNodes
piggggggggy Nov 18, 2025
5e7f380
fix: avoid passing empty children array as props
piggggggggy Nov 18, 2025
97473bc
feat(setup): implement instance removal and setup logic
piggggggggy Nov 20, 2025
2ab2371
feat(dom): implement DOM property updates and node retrieval
piggggggggy Nov 20, 2025
bb53241
feat(dom): add basic DOM property setting
piggggggggy Nov 20, 2025
5ec0ba0
build: update artifact path for deployment
piggggggggy Nov 20, 2025
48133f6
feat(context): initialize container and node in reset method
piggggggggy Nov 20, 2025
4d6408b
feat(dom): improve DOM handling and instance creation
piggggggggy Nov 20, 2025
1e46927
feat(reconcile): implement reconcile logic
piggggggggy Nov 20, 2025
6561341
feat(render): implement basic rendering logic
piggggggggy Nov 20, 2025
d511007
refactor: reset instance and handles component functions
piggggggggy Nov 20, 2025
38fec38
feat(dom-attribute): add DOM manipulation utilities
piggggggggy Nov 20, 2025
1ef03ee
feat: improve component identification with unique paths
piggggggggy Nov 20, 2025
38eca2c
chore: passe path to createInstance function
piggggggggy Nov 20, 2025
16386c7
feat(equal-utils): implement shallow and deep equality checks
piggggggggy Nov 20, 2025
8c19f73
feat(context): implement core context methods
piggggggggy Nov 20, 2025
6a3e724
feat(hooks): implement useState hook
piggggggggy Nov 20, 2025
ebc48f2
feat(effect): implement useEffect hook
piggggggggy Nov 21, 2025
f7dc3f0
feat(effect-queue): execute effects after rendering
piggggggggy Nov 21, 2025
4b33af6
feat: create hook manager
piggggggggy Nov 21, 2025
8d5e55f
feat: integrate hook manager for component rendering
piggggggggy Nov 21, 2025
b98aba1
refactor: refactor state management in useState hook
piggggggggy Nov 21, 2025
27b87c1
refactor: refactor hook management and fixes cursor handling
piggggggggy Nov 21, 2025
59e8dd7
fix: refactor reconciliation logic
piggggggggy Nov 21, 2025
124ffd2
feat: rnsure function is scheduled only once
piggggggggy Nov 21, 2025
ea919c3
fix: use child key for creating child path
piggggggggy Nov 21, 2025
b5b5576
chore: use strict equality in useState hook
piggggggggy Nov 21, 2025
8940a66
fix: use child key for child path creation
piggggggggy Nov 21, 2025
2965edf
feat: add DOM effect queue to context
piggggggggy Nov 21, 2025
bb317d2
refactor: implement DOM effects batching
piggggggggy Nov 21, 2025
91f3d39
fix: fixe DOM property and hook update logic
piggggggggy Nov 21, 2025
8ef3e63
refactor: refactor reconciliation logic for improved efficiency
piggggggggy Nov 21, 2025
7497624
fix: update child path creation for components
piggggggggy Nov 21, 2025
602a4bc
fix: ensure correct parent DOM for child reconciliation
piggggggggy Nov 21, 2025
8bed963
fix: reset context on setup
piggggggggy Nov 21, 2025
5882baa
refactor: improve node identification in reconciliation
piggggggggy Nov 21, 2025
38b3ffd
feat: improve hook cleanup and rendering logic
piggggggggy Nov 21, 2025
9b1aafc
refactor: fix DOM insertion order during reconcile
piggggggggy Nov 21, 2025
14dbde7
fix: replace shallowEquals with Object.is
piggggggggy Nov 21, 2025
4a5e704
fix: use child key when creating the child path
piggggggggy Nov 21, 2025
94e0f99
feat(useRef): implement useRef hook using useState
piggggggggy Nov 21, 2025
80e9867
feat(useMemo): implement the useMemo hook
piggggggggy Nov 21, 2025
f2661fa
refactor: simplifie `useMemo` hook implementation
piggggggggy Nov 21, 2025
4415b2e
feat(useCalllback): implement useCallback hook
piggggggggy Nov 21, 2025
361c00c
feat(useDeepMemo): implement deep memoization hook
piggggggggy Nov 21, 2025
4e2915c
feat(useAutoCallback): memoize callback function with useRef
piggggggggy Nov 21, 2025
cc55349
feat(memo): improve memoization using useRef and custom equals
piggggggggy Nov 21, 2025
ff2f142
refactor: add unmount queue for effect cleanup functions
piggggggggy Nov 21, 2025
38c119e
refactor: improve DOM insertion and reconciliation.
piggggggggy Nov 21, 2025
12c0f2a
refactor: refactor core rendering logic
piggggggggy Nov 21, 2025
d71c99b
build: add workflow dispatch input for branch
piggggggggy Nov 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Deploy to GitHub Pages

on:
push:
branches:
- main
- feature-*
workflow_dispatch:
inputs:
branch:
description: "Branch to deploy"
required: true
default: "main"

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: "pages"
cancel-in-progress: true

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: latest

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build
run: pnpm run build

- name: Setup Pages
uses: actions/configure-pages@v4

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: "packages/app/dist"

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
21 changes: 21 additions & 0 deletions packages/react/src/core/commit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { DomEffect } from "./types";
import { updateDomProps, insertInstance, removeInstance } from "./dom";

export const commitMutations = (mutations: DomEffect[]) => {
for (const mutation of mutations) {
switch (mutation.type) {
case "INSERT":
insertInstance(mutation.parentDOM, mutation.instance, mutation.anchor);
break;
case "REMOVE":
removeInstance(mutation.parentDOM, mutation.instance);
break;
case "UPDATE_PROPS":
updateDomProps(mutation.dom, mutation.prevProps, mutation.nextProps);
break;
case "UPDATE_TEXT":
mutation.dom.nodeValue = mutation.nextText;
break;
}
}
};
10 changes: 10 additions & 0 deletions packages/react/src/core/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,13 @@ export const HookTypes = {
} as const;

export type HookType = typeof HookTypes;

export const BOOLEAN_ATTRIBUTES = [
"disabled",
"checked",
"readOnly",
"required",
"selected",
"autoFocus",
"multiple",
] as const;
92 changes: 27 additions & 65 deletions packages/react/src/core/context.ts
Original file line number Diff line number Diff line change
@@ -1,74 +1,36 @@
import { Context } from "./types";
import { StoreContext, RuntimeContext } from "./types";

/**
* Mini-React의 전역 컨텍스트입니다.
* 렌더링 루트, 훅 상태, 이펙트 큐 등 모든 런타임 데이터를 관리합니다.
*/
export const context: Context = {
/**
* 렌더링 루트와 관련된 정보를 관리합니다.
*/
// Persistent context
export const storeContext: StoreContext = {
root: {
container: null,
node: null,
instance: null,
reset({ container, node }) {
// 여기를 구현하세요.
// container, node, instance를 전달받은 값으로 초기화합니다.
},
},
hooks: new Map(),
cleanupEffects: new Map(),
};

/**
* 훅의 상태를 관리합니다.
* 컴포넌트 경로(path)를 키로 사용하여 각 컴포넌트의 훅 상태를 격리합니다.
*/
hooks: {
state: new Map(),
cursor: new Map(),
visited: new Set(),
componentStack: [],

/**
* 모든 훅 관련 상태를 초기화합니다.
*/
clear() {
// 여기를 구현하세요.
// state, cursor, visited, componentStack을 모두 비웁니다.
},

/**
* 현재 실행 중인 컴포넌트의 고유 경로를 반환합니다.
*/
get currentPath() {
// 여기를 구현하세요.
// componentStack의 마지막 요소를 반환해야 합니다.
// 스택이 비어있으면 '훅은 컴포넌트 내부에서만 호출되어야 한다'는 에러를 발생시켜야 합니다.
return "";
},

/**
* 현재 컴포넌트에서 다음에 실행될 훅의 인덱스(커서)를 반환합니다.
*/
get currentCursor() {
// 여기를 구현하세요.
// cursor Map에서 현재 경로의 커서를 가져옵니다. 없으면 0을 반환합니다.
return 0;
},

/**
* 현재 컴포넌트의 훅 상태 배열을 반환합니다.
*/
get currentHooks() {
// 여기를 구현하세요.
// state Map에서 현재 경로의 훅 배열을 가져옵니다. 없으면 빈 배열을 반환합니다.
return [];
},
// Temporary context for each render
export const runtimeContext: RuntimeContext = {
cursor: {
path: null,
index: 0,
},

/**
* useEffect 훅의 실행을 관리하는 큐입니다.
*/
effects: {
queue: [],
workQueue: {
domMutations: [],
passiveEffects: [],
cleanups: [],
},
};
componentStack: [],
visited: new Set(),
};

export const resetRuntime = () => {
runtimeContext.cursor.path = null;
runtimeContext.cursor.index = 0;
runtimeContext.workQueue.domMutations = [];
runtimeContext.workQueue.passiveEffects = [];
runtimeContext.workQueue.cleanups = [];
runtimeContext.visited.clear();
};
Loading