Skip to content

Commit 4e19429

Browse files
committed
feat(apps): scaffold experimentation apps
1 parent df62564 commit 4e19429

File tree

18 files changed

+474
-24
lines changed

18 files changed

+474
-24
lines changed

apps/dashboard/eslint.config.mjs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @ts-check
2+
import baseESLintConfig from '@repo/config-eslint'
3+
import reactConfig from '@repo/config-eslint/react'
4+
5+
export default [
6+
{
7+
ignores: [
8+
'.DS_Store',
9+
'**/node_modules',
10+
'**/build',
11+
'**/dist',
12+
'.env',
13+
'.env.*',
14+
'!.env.example',
15+
],
16+
},
17+
...baseESLintConfig,
18+
...reactConfig,
19+
]

apps/dashboard/index.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6+
<title>Dashboard</title>
7+
</head>
8+
<body>
9+
<div id="root"></div>
10+
<script type="module" src="/src/main.tsx"></script>
11+
</body>
12+
</html>

apps/dashboard/package.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"name": "@sanity/dashboard",
3+
"version": "0.0.0",
4+
"private": true,
5+
"type": "module",
6+
"scripts": {
7+
"build": "pnpm tsc && vite build",
8+
"clean": "rimraf dist",
9+
"dev": "vite",
10+
"lint": "eslint .",
11+
"preview": "vite preview",
12+
"tsc": "tsc --noEmit"
13+
},
14+
"prettier": "@sanity/prettier-config",
15+
"dependencies": {
16+
"@sanity/sdk-react": "workspace:*",
17+
"@sanity/ui": "^2.15.13",
18+
"react": "^18.3.1",
19+
"react-compiler-runtime": "19.1.0-rc.1",
20+
"react-dom": "^18.3.1",
21+
"typescript": "^5.8.3"
22+
},
23+
"devDependencies": {
24+
"@repo/config-eslint": "workspace:*",
25+
"@repo/tsconfig": "workspace:*",
26+
"@types/react": "^19.1.2",
27+
"@types/react-dom": "^19.1.2",
28+
"@vitejs/plugin-react": "^4.4.1",
29+
"eslint": "^9.25.1",
30+
"vite": "^6.3.4"
31+
}
32+
}

apps/dashboard/src/App.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import {SanityApp, SanityConfig} from '@sanity/sdk-react'
2+
import {Spinner, ThemeProvider} from '@sanity/ui'
3+
import {buildTheme} from '@sanity/ui/theme'
4+
import {type JSX, Suspense} from 'react'
5+
6+
const theme = buildTheme({})
7+
8+
const devConfigs: SanityConfig[] = [
9+
{
10+
projectId: 'ppsg7ml5',
11+
dataset: 'test',
12+
},
13+
{
14+
projectId: 'd45jg133',
15+
dataset: 'production',
16+
},
17+
{
18+
projectId: 'v28v5k8m',
19+
dataset: 'production',
20+
},
21+
]
22+
23+
export default function App(): JSX.Element {
24+
return (
25+
<ThemeProvider theme={theme}>
26+
<SanityApp fallback={<Spinner />} config={devConfigs}>
27+
<Suspense>
28+
<div
29+
style={{
30+
position: 'fixed',
31+
inset: 0,
32+
display: 'flex',
33+
flexDirection: 'column',
34+
}}
35+
>
36+
<div style={{padding: 12, borderBottom: '1px solid #eee'}}>
37+
Dashboard (iframes sdk-app below)
38+
</div>
39+
<iframe
40+
title="sdk-app"
41+
src="http://localhost:3341/"
42+
style={{
43+
flex: 1,
44+
border: 'none',
45+
width: '100%',
46+
}}
47+
/>
48+
</div>
49+
</Suspense>
50+
</SanityApp>
51+
</ThemeProvider>
52+
)
53+
}

apps/dashboard/src/main.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {StrictMode} from 'react'
2+
import {createRoot} from 'react-dom/client'
3+
4+
import App from './App'
5+
6+
createRoot(document.getElementById('root')!).render(
7+
<StrictMode>
8+
<App />
9+
</StrictMode>,
10+
)

apps/dashboard/tsconfig.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"extends": "@repo/tsconfig/base.json",
3+
"compilerOptions": {
4+
"rootDir": "../../",
5+
"baseUrl": "../../",
6+
"verbatimModuleSyntax": false,
7+
"noEmit": true,
8+
"module": "ESNext",
9+
"types": ["vite/client"],
10+
"paths": {
11+
"@sanity/sdk": ["./packages/core/src/_exports/index.ts"],
12+
"@sanity/sdk/*": ["./packages/core/src/_exports/*"],
13+
"@sanity/sdk-react": ["./packages/react/src/_exports/index.ts"],
14+
"@sanity/sdk-react/*": ["./packages/react/src/_exports/*"]
15+
}
16+
},
17+
"include": ["**/*.ts", "**/*.tsx"]
18+
}

apps/dashboard/vite.config.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import {resolve} from 'node:path'
2+
3+
import react from '@vitejs/plugin-react'
4+
import {defineConfig, loadEnv} from 'vite'
5+
6+
const ReactCompilerConfig = {
7+
target: '18',
8+
}
9+
10+
export default defineConfig(({mode}) => {
11+
const rootDir = resolve(process.cwd(), '../..')
12+
const env = loadEnv(mode, rootDir, '')
13+
14+
const isE2E = mode === 'e2e'
15+
16+
return {
17+
server: {
18+
port: 3340,
19+
fs: {strict: false},
20+
},
21+
plugins: [
22+
react({
23+
babel: {
24+
plugins: [['babel-plugin-react-compiler', ReactCompilerConfig]],
25+
},
26+
}),
27+
],
28+
clearScreen: false,
29+
resolve: {
30+
alias: {
31+
'@sanity/sdk': resolve(import.meta.dirname, '../../packages/core/src/_exports'),
32+
'@sanity/sdk-react': resolve(import.meta.dirname, '../../packages/react/src/_exports'),
33+
},
34+
},
35+
define: {
36+
'import.meta.env.VITE_IS_E2E': JSON.stringify(isE2E),
37+
'import.meta.env.VITE_E2E_PROJECT_ID': JSON.stringify(
38+
process.env['SDK_E2E_PROJECT_ID'] || env['SDK_E2E_PROJECT_ID'],
39+
),
40+
'import.meta.env.VITE_E2E_DATASET_0': JSON.stringify(
41+
process.env['SDK_E2E_DATASET_0'] || env['SDK_E2E_DATASET_0'],
42+
),
43+
'import.meta.env.VITE_E2E_DATASET_1': JSON.stringify(
44+
process.env['SDK_E2E_DATASET_1'] || env['SDK_E2E_DATASET_1'],
45+
),
46+
},
47+
}
48+
})

apps/kitchensink-react/src/AppRoutes.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import {ProtectedRoute} from './ProtectedRoute'
1717
import {DashboardContextRoute} from './routes/DashboardContextRoute'
1818
import {DashboardWorkspacesRoute} from './routes/DashboardWorkspacesRoute'
1919
import ExperimentalResourceClientRoute from './routes/ExperimentalResourceClientRoute'
20-
import {ProjectsRoute} from './routes/ProjectsRoute'
2120
import {PerspectivesRoute} from './routes/PerspectivesRoute'
21+
import {ProjectsRoute} from './routes/ProjectsRoute'
2222
import {ReleasesRoute} from './routes/releases/ReleasesRoute'
2323
import {UserDetailRoute} from './routes/UserDetailRoute'
2424
import {UsersRoute} from './routes/UsersRoute'

apps/sdk-app/eslint.config.mjs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @ts-check
2+
import baseESLintConfig from '@repo/config-eslint'
3+
import reactConfig from '@repo/config-eslint/react'
4+
5+
export default [
6+
{
7+
ignores: [
8+
'.DS_Store',
9+
'**/node_modules',
10+
'**/build',
11+
'**/dist',
12+
'.env',
13+
'.env.*',
14+
'!.env.example',
15+
],
16+
},
17+
...baseESLintConfig,
18+
...reactConfig,
19+
]

apps/sdk-app/index.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6+
<title>SDK App</title>
7+
</head>
8+
<body>
9+
<div id="root"></div>
10+
<script type="module" src="/src/main.tsx"></script>
11+
</body>
12+
</html>

0 commit comments

Comments
 (0)