Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
58e4367
deps: update to react 19
danstarns Jan 31, 2025
33eef8d
package: move react and grapes to peers + add clean script
danstarns Feb 3, 2025
4bfe79a
refactor: move example app to 19
danstarns Feb 3, 2025
c493b60
feat: add react app 18 example
danstarns Feb 3, 2025
56ca50a
further changes to support react 18 + 19
danstarns Feb 3, 2025
75970fc
refactor: use create root for react 19 demo
danstarns Feb 4, 2025
8bf3ebe
package: updates *
danstarns Feb 4, 2025
f8b9f0b
yarn lock *
danstarns Feb 4, 2025
dee0ea2
ci: init
danstarns Feb 4, 2025
a9809e9
ci: add core build
danstarns Feb 4, 2025
9a6049f
ci: *
danstarns Feb 4, 2025
3c83fb1
ci: *
danstarns Feb 4, 2025
afff6d9
ci: *
danstarns Feb 5, 2025
97c0b1b
ci: *
danstarns Feb 5, 2025
c50ce78
feat: add docker files
danstarns Feb 5, 2025
553a949
*
danstarns Feb 5, 2025
67c8e32
docker *
danstarns Feb 5, 2025
8b295d1
apply react codemod
danstarns Feb 5, 2025
18e0509
*
danstarns Feb 5, 2025
4a1967c
ci: *
danstarns Feb 5, 2025
291e0d6
*
danstarns Feb 5, 2025
63ae684
*
danstarns Feb 5, 2025
3b13b45
fix build errors?
danstarns Feb 5, 2025
4efd8ef
fix errors 2?
danstarns Feb 5, 2025
5cbba9d
fix 3
danstarns Feb 5, 2025
a73b018
*
danstarns Feb 5, 2025
af306b2
*
danstarns Feb 5, 2025
3fc3f4b
*
danstarns Feb 5, 2025
4dc5f0b
*
danstarns Feb 5, 2025
53771f2
feat: add two simple examples in 18 & 19
danstarns Feb 7, 2025
c38067b
fix: use import type newline vs same
danstarns Feb 7, 2025
a08a910
fix: build cjs main
danstarns Feb 7, 2025
4675a6b
fix: cjs and exclude react jsx runtime from build
danstarns Feb 7, 2025
7811a3e
refactor: remove simple example
danstarns Feb 7, 2025
7e5c319
pkg fix
danstarns Feb 7, 2025
3be616b
ci *
danstarns Feb 7, 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
20 changes: 20 additions & 0 deletions .github/actions/setup-project/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Setup Project
description: Sets up the project by installing dependencies

inputs:
node-version:
required: false
default: 22.4.1
description: "The version of Node.js to use."

runs:
using: composite
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
registry-url: "https://registry.npmjs.org"
cache: "yarn"
- name: Install dependencies
run: yarn
shell: bash
46 changes: 46 additions & 0 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: PR Checks

on:
pull_request:
branches:
- main

jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
react-version: [19, 18]
include:
- react-version: 19
app-name: react-app-19
react-dom-version: ^19.0.0
react-types-version: ^19.0.0
- react-version: 18
app-name: react-app-18
react-dom-version: ^18.2.0
react-types-version: ^18.2.0

name: Build with React ${{ matrix.react-version }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Project Base
uses: ./.github/actions/setup-project

## We specify the version of react and react-dom we want to run vite build with
- name: Install React Dependencies in Root
run: |
cd ./packages/grapesjs-react && yarn add \
react@^19.0.0 \
react-dom@^19.0.0 \
@types/react@^19.0.0 \
@types/react-dom@^19.0.0

- name: Build Core
run: yarn workspace @grapesjs/react run build

- name: Build Full Example App
run: yarn workspace @grapesjs/${{ matrix.app-name }} run build
48 changes: 48 additions & 0 deletions DOCKER.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Docker GrapesJS React

There is a few docker files in this repository, to assert that the project runs correctly using react 18 & react 19.

You will find the `Dockerfile.base` which will build and mount `@grapesjs/react` to each:

1. `Dockerfile.react18`
2. `Dockerfile.react19`

## Dockerfile.base

Build this first, we build React in version 19.

```bash
docker compose build base
```

## Dockerfile.react18

To test react 18, run the following command:

```bash
docker compose build react18
```

Wait for the build then run the react18 container:

```bash
docker compose up react18
```

Visit `http://localhost:5173/` to see the project running.

## Dockerfile.react19

To test react 19, run the following command:

```bash
docker compose build react19
```

Wait for the build then run the react19 container:

```bash
docker compose up react19
```

Visit `http://localhost:5174/` to see the project running.
26 changes: 26 additions & 0 deletions Dockerfile.base
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
FROM node:20-alpine

WORKDIR /app

RUN apk add --no-cache python3 make g++ wget

COPY package.json yarn.lock ./
COPY packages/grapesjs-react/package.json ./packages/grapesjs-react/package.json
COPY packages/grapesjs-react-app-18/package.json ./packages/grapesjs-react-app-18/package.json
COPY packages/grapesjs-react-app-19/package.json ./packages/grapesjs-react-app-19/package.json

RUN yarn install

WORKDIR /app/packages/grapesjs-react

RUN yarn add \
react@^19.0.0 \
react-dom@^19.0.0 \
@types/react@^19.0.0 \
@types/react-dom@^19.0.0

WORKDIR /app

COPY . .

RUN yarn workspace @grapesjs/react run build
22 changes: 22 additions & 0 deletions Dockerfile.react18
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM grapesjs-base:latest

RUN yarn add -W \
react@^18.2.0 \
react-dom@^18.2.0 \
@types/react@^18.2.0 \
@types/react-dom@^18.2.0

WORKDIR /app/packages/grapesjs-react
RUN yarn link

WORKDIR /app/packages/grapesjs-react-app-18
RUN yarn link @grapesjs/react

WORKDIR /app
RUN yarn install

WORKDIR /app/packages/grapesjs-react-app-18

EXPOSE 5173

CMD ["yarn", "dev", "--host", "0.0.0.0"]
22 changes: 22 additions & 0 deletions Dockerfile.react19
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM grapesjs-base:latest

RUN yarn add -W \
react@^19.0.0 \
react-dom@^19.0.0 \
@types/react@^19.0.0 \
@types/react-dom@^19.0.0

WORKDIR /app/packages/grapesjs-react
RUN yarn link

WORKDIR /app/packages/grapesjs-react-app-19
RUN yarn link @grapesjs/react

WORKDIR /app
RUN yarn install

WORKDIR /app/packages/grapesjs-react-app-19

EXPOSE 5173

CMD ["yarn", "dev", "--host", "0.0.0.0"]
44 changes: 44 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
version: "3.8"

services:
base:
build:
context: .
dockerfile: Dockerfile.base
image: grapesjs-base:latest

react18:
build:
context: .
dockerfile: Dockerfile.react18
ports:
- "5173:5173"
healthcheck:
test: ["CMD", "wget", "--spider", "http://localhost:5173"]
interval: 5s
timeout: 5s
retries: 10
environment:
- VITE_DEV_SERVER_HOST=0.0.0.0
- VITE_DEV_SERVER_PORT=5173
volumes:
- ./packages/grapesjs-react-app-18:/app/packages/grapesjs-react-app-18
- /app/packages/grapesjs-react-app-18/node_modules

react19:
build:
context: .
dockerfile: Dockerfile.react19
ports:
- "5173:5173"
healthcheck:
test: ["CMD", "wget", "--spider", "http://localhost:5173"]
interval: 5s
timeout: 5s
retries: 10
environment:
- VITE_DEV_SERVER_HOST=0.0.0.0
- VITE_DEV_SERVER_PORT=5173
volumes:
- ./packages/grapesjs-react-app-19:/app/packages/grapesjs-react-app-19
- /app/packages/grapesjs-react-app-19/node_modules
31 changes: 30 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,40 @@
"private": true,
"packageManager": "yarn@1.22.19",
"scripts": {
"start": "yarn workspace @grapesjs/react run dev & yarn workspace @grapesjs/react-app run dev"
"build": "yarn build:core && yarn build:app-18 && yarn build:app-19",
"start": "yarn workspace @grapesjs/react run dev & yarn workspace @grapesjs/react-app run dev",
"clean": "find . -type d \\( -name \"node_modules\" -o -name \"build\" -o -name \"dist\" \\) -exec rm -rf {} + && rm ./yarn.lock",
"build:core": "yarn workspace @grapesjs/react run build",
"build:app-18": "yarn workspace @grapesjs/react-app-18 run build",
"build:app-19": "yarn workspace @grapesjs/react-app-19 run build"
},
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**/react",
"**/react-dom",
"**/react/**",
"**/react-dom/**",
"**/@types/react",
"**/@types/react-dom"
]
},
"dependencies": {
"@types/node": "^20.3.3",
"grapesjs": "^0.22.5",
"vite-plugin-dts": "^4.5.0",
"@typescript-eslint/eslint-plugin": "^5.59.0",
"@typescript-eslint/parser": "^5.59.0",
"@vitejs/plugin-react": "^4.0.0",
"autoprefixer": "^10.4.14",
"eslint": "^8.38.0",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.3.4",
"postcss": "^8.4.24",
"tailwindcss": "^3.3.2",
"typescript": "^5.0.2",
"vite": "^4.3.9"
}
}
2 changes: 2 additions & 0 deletions packages/grapesjs-react-app-18/.yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
nodeLinker: node-modules
nmMode: hardlinks-local
30 changes: 30 additions & 0 deletions packages/grapesjs-react-app-18/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "@grapesjs/react-app-18",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite --force",
"build": "tsc && vite build",
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
"dependencies": {
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"@mdi/js": "^7.2.96",
"@mdi/react": "^1.6.1",
"@mui/material": "^5.13.5",
"@grapesjs/react": "1.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0"
},
"resolutions": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
}
41 changes: 41 additions & 0 deletions packages/grapesjs-react-app-18/src/examples/CustomEditor.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import GrapesJsEditor, { AssetsProvider, Canvas, EditorProps, ModalProvider } from '@grapesjs/react';
import { ThemeProvider } from '@mui/material/styles';
import { MAIN_BORDER_COLOR, customTheme, defaultEditorProps } from './common';
import CustomAssetManager from './components/CustomAssetManager';
import CustomModal from './components/CustomModal';
import RightSidebar from './components/RightSidebar';
import Topbar from './components/Topbar';

export default function CustomEditor(props: Partial<EditorProps>) {
return (
<ThemeProvider theme={customTheme}>
<GrapesJsEditor
className="gjs-custom-editor"
{...defaultEditorProps}
{...props}
>
<div className={`flex h-full border-t ${MAIN_BORDER_COLOR}`}>
<div className="gjs-column-m flex flex-col flex-grow">
<Topbar className="min-h-[48px]"/>
<Canvas className="flex-grow gjs-custom-editor-canvas"/>
</div>
<RightSidebar className={`gjs-column-r w-[300px] border-l ${MAIN_BORDER_COLOR}`}/>
</div>
<ModalProvider>
{({ open, title, content, close }) => (
<CustomModal open={open} title={<>{title}</>} close={close}>
<>{content}</>
</CustomModal>
)}
</ModalProvider>
<AssetsProvider>
{({ assets, select, close, Container }) => (
<Container>
<CustomAssetManager assets={assets} select={select} close={close}/>
</Container>
)}
</AssetsProvider>
</GrapesJsEditor>
</ThemeProvider>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export default function DefaultCustomEditor(props: Partial<EditorProps>) {
</AssetsProvider>
<ModalProvider>
{({ open, title, content, close }) => (
<CustomModal open={open} title={title} children={content} close={close}/>
<CustomModal open={open} title={<>{title}</>} children={<>{content}</>} close={close}/>
)}
</ModalProvider>
</GrapesJsEditor>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { mdiClose } from '@mdi/js';
import type { ReactNode } from 'react';
import Icon from '@mdi/react';
import Box from '@mui/material/Box';
import Fade from '@mui/material/Fade';
Expand All @@ -21,9 +22,9 @@ const style = {
};

interface CustomModalProps extends Omit<ModalProps, 'title'> {
title: React.ReactNode,
title: ReactNode,
close: () => void,
}
}

export default function CustomModal({ children, title, close, ...props }: CustomModalProps) {
return (
Expand Down
Loading