Compare commits
37 Commits
tasks/auth
...
deploy/stg
| Author | SHA1 | Date | |
|---|---|---|---|
| 09c7fd8f3a | |||
| 656ffcc561 | |||
| 76ffa662c5 | |||
| 46423409fd | |||
| 2edf5e9b11 | |||
| af368eeee0 | |||
| e104cd8fcc | |||
| 50801e5c8a | |||
| 80186bf493 | |||
| d84edc44f5 | |||
| 8b14c6ce44 | |||
| 5e822f0b05 | |||
| 34a37dc63b | |||
| 0e6f7e1769 | |||
| feb853d06e | |||
| 3de412afe0 | |||
| 87d234e57f | |||
| fd18a22834 | |||
| 3e8b961e52 | |||
| 82d779e5e0 | |||
| a6517166cb | |||
| 483b6be677 | |||
| f8dad0dbcd | |||
| 74301fe074 | |||
| 8b19abc628 | |||
| 1a91f3c9ad | |||
| 9b74592101 | |||
| 55f4b94082 | |||
| 59ae8ad039 | |||
| c012d5778c | |||
| af31bd8aef | |||
| 721357adcf | |||
| 39776ec355 | |||
| 50a7356618 | |||
| 4494dd98ef | |||
| 970949a68b | |||
| 42bcba6c96 |
47
.dockerignore
Normal file
47
.dockerignore
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
node_modules
|
||||||
|
.next
|
||||||
|
.git
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
bun-debug.log*
|
||||||
|
|
||||||
|
# Docker files
|
||||||
|
Dockerfile
|
||||||
|
.dockerignore
|
||||||
|
|
||||||
|
# OS files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Markdown/Documentation
|
||||||
|
README.md
|
||||||
|
GEMINI.md
|
||||||
|
AGENTS.md
|
||||||
|
AUDIT_REPORT.md
|
||||||
|
QWEN.md
|
||||||
|
NOTE.md
|
||||||
|
task-project-apbdes.md
|
||||||
|
MUSIK_CREATE_ANALYSIS.md
|
||||||
|
darkMode.md
|
||||||
|
/test-results
|
||||||
|
/playwright-report
|
||||||
|
/tmp_assets
|
||||||
|
/foldergambar
|
||||||
|
/googleapi
|
||||||
|
/xx
|
||||||
|
/xx.ts
|
||||||
|
/xx.txt
|
||||||
|
/test.txt
|
||||||
|
/x.json
|
||||||
|
/x.sh
|
||||||
|
/xcoba.ts
|
||||||
|
/xcoba2.ts
|
||||||
|
/gambar.ttx
|
||||||
|
/test-berita-state.ts
|
||||||
19
.env
19
.env
@@ -1,19 +0,0 @@
|
|||||||
DATABASE_URL="postgresql://bip:Production_123@localhost:5433/desa-darmasaba-v0.0.1?schema=public"
|
|
||||||
# Seafile
|
|
||||||
SEAFILE_TOKEN=20a19f4a04032215d50ce53292e6abdd38b9f806
|
|
||||||
SEAFILE_REPO_ID=f0e9ee4a-fd13-49a2-81c0-f253951d063a
|
|
||||||
SEAFILE_URL=https://cld-dkr-makuro-seafile.wibudev.com
|
|
||||||
SEAFILE_PUBLIC_SHARE_TOKEN=3a9a9ecb5e244f4da8ae
|
|
||||||
|
|
||||||
# Upload
|
|
||||||
WIBU_UPLOAD_DIR=uploads
|
|
||||||
WIBU_DOWNLOAD_DIR="./download"
|
|
||||||
NEXT_PUBLIC_BASE_URL="http://localhost:3000"
|
|
||||||
EMAIL_USER=nicoarya20@gmail.com
|
|
||||||
EMAIL_PASS=hymmfpcaqzqkfgbh
|
|
||||||
BASE_SESSION_KEY=kp9sGx91as0Kj2Ls81nAsl2Kdj13KsxP
|
|
||||||
BASE_TOKEN_KEY=Qm82JsA92lMnKw0291mxKaaP02KjslaA
|
|
||||||
|
|
||||||
# BOT-TELE
|
|
||||||
BOT_TOKEN=8479423145:AAE9ArrOgTD3DyVxYSVs3IXN40u_sL6c9sw
|
|
||||||
CHAT_ID=-1003368982298
|
|
||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -30,10 +30,7 @@ yarn-error.log*
|
|||||||
|
|
||||||
# env
|
# env
|
||||||
# env local files (keep .env.example)
|
# env local files (keep .env.example)
|
||||||
.env.local
|
.env*
|
||||||
.env*.local
|
|
||||||
.env.production
|
|
||||||
.env.development
|
|
||||||
!.env.example
|
!.env.example
|
||||||
|
|
||||||
# QC
|
# QC
|
||||||
|
|||||||
13
.qwen/settings.json
Normal file
13
.qwen/settings.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"playwright-mcp": {
|
||||||
|
"command": "npx",
|
||||||
|
"args": [
|
||||||
|
"-y",
|
||||||
|
"playwright-mcp@latest"
|
||||||
|
],
|
||||||
|
"timeout": 60000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"$version": 3
|
||||||
|
}
|
||||||
9
.qwen/settings.json.orig
Normal file
9
.qwen/settings.json.orig
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"playwright-mcp": {
|
||||||
|
"command": "npx",
|
||||||
|
"args": ["-y", "playwright-mcp@latest"],
|
||||||
|
"timeout": 60000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
191
DEV-INSPECTOR-ANALYSIS.md
Normal file
191
DEV-INSPECTOR-ANALYSIS.md
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
# Dev Inspector - Analisis & Rekomendasi untuk Project Desa Darmasaba
|
||||||
|
|
||||||
|
## 📋 Ringkasan Analisis
|
||||||
|
|
||||||
|
Dokumen `dev-inspector-click-to-source.md` **TIDAK dapat diterapkan langsung** ke project ini karena perbedaan arsitektur fundamental.
|
||||||
|
|
||||||
|
## 🔍 Perbedaan Arsitektur
|
||||||
|
|
||||||
|
| Syarat di Dokumen | Project Desa Darmasaba | Status |
|
||||||
|
|-------------------|------------------------|--------|
|
||||||
|
| **Vite sebagai bundler** | Next.js 15 (Webpack/Turbopack) | ❌ Tidak kompatibel |
|
||||||
|
| **Elysia + Vite middlewareMode** | Next.js App Router + Elysia sebagai API handler | ❌ Berbeda |
|
||||||
|
| **React** | ✅ React 19 | ✅ Kompatibel |
|
||||||
|
| **Bun runtime** | ✅ Bun | ✅ Kompatibel |
|
||||||
|
|
||||||
|
## ✅ Solusi: Next.js Sudah Punya Built-in Click-to-Source
|
||||||
|
|
||||||
|
Next.js memiliki fitur **click-to-source bawaan** yang bekerja tanpa setup tambahan:
|
||||||
|
|
||||||
|
### Cara Menggunakan
|
||||||
|
|
||||||
|
1. **Pastikan dalam development mode:**
|
||||||
|
```bash
|
||||||
|
bun run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Klik elemen dengan modifier key:**
|
||||||
|
- **macOS**: `Option` + `Click` (atau `⌥` + `Click`)
|
||||||
|
- **Windows/Linux**: `Alt` + `Click`
|
||||||
|
|
||||||
|
3. **File akan terbuka di editor** pada baris dan kolom yang tepat
|
||||||
|
|
||||||
|
### Syarat Agar Berfungsi
|
||||||
|
|
||||||
|
1. **Editor harus ada di PATH**
|
||||||
|
|
||||||
|
VS Code biasanya sudah terdaftar. Jika menggunakan editor lain, set:
|
||||||
|
```bash
|
||||||
|
# Untuk Cursor
|
||||||
|
export EDITOR=cursor
|
||||||
|
|
||||||
|
# Untuk Windsurf
|
||||||
|
export EDITOR=windsurf
|
||||||
|
|
||||||
|
# Untuk Sublime Text
|
||||||
|
export EDITOR=subl
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Hanya berfungsi di development mode**
|
||||||
|
- Fitur ini otomatis tree-shaken di production
|
||||||
|
- Zero overhead di production build
|
||||||
|
|
||||||
|
3. **Browser DevTools harus terbuka** (beberapa browser memerlukan ini)
|
||||||
|
|
||||||
|
## 🎯 Rekomendasi untuk Project Ini
|
||||||
|
|
||||||
|
### Opsi 1: Gunakan Built-in Next.js (DIREKOMENDASIKAN)
|
||||||
|
|
||||||
|
**Kelebihan:**
|
||||||
|
- ✅ Zero setup
|
||||||
|
- ✅ Maintain oleh Vercel
|
||||||
|
- ✅ Otomatis compatible dengan Next.js updates
|
||||||
|
- ✅ Zero production overhead
|
||||||
|
|
||||||
|
**Kekurangan:**
|
||||||
|
- ⚠️ Hotkey berbeda (`Option+Click` vs `Ctrl+Shift+Cmd+C`)
|
||||||
|
- ⚠️ Tidak ada visual overlay/tooltip seperti di dokumen
|
||||||
|
|
||||||
|
**Cara:**
|
||||||
|
Tidak perlu melakukan apapun - fitur sudah aktif saat `bun run dev`.
|
||||||
|
|
||||||
|
### Opsi 2: Custom Implementation (JIKA DIPERLUKAN)
|
||||||
|
|
||||||
|
Jika ingin visual overlay dan tooltip seperti di dokumen, bisa dibuat custom component dengan pendekatan berbeda:
|
||||||
|
|
||||||
|
#### Arsitektur Alternatif untuk Next.js
|
||||||
|
|
||||||
|
```
|
||||||
|
BUILD TIME (Next.js/Webpack):
|
||||||
|
.tsx/.jsx file
|
||||||
|
→ [Custom Webpack Loader] inject data-inspector-* attributes
|
||||||
|
→ [Next.js internal transform] JSX to React.createElement
|
||||||
|
→ Browser menerima elemen dengan attributes
|
||||||
|
|
||||||
|
RUNTIME (Browser):
|
||||||
|
[SAMA seperti dokumen - DevInspector component]
|
||||||
|
|
||||||
|
BACKEND (Next.js API Route):
|
||||||
|
/__open-in-editor → Bun.spawn([editor, '--goto', 'file:line:col'])
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Komponen yang Dibutuhkan:
|
||||||
|
|
||||||
|
1. **Custom Webpack Loader** (bukan Vite Plugin)
|
||||||
|
- Inject attributes via webpack transform
|
||||||
|
- Taruh di `next.config.ts` webpack config
|
||||||
|
|
||||||
|
2. **DevInspector Component** (sama seperti dokumen)
|
||||||
|
- Browser runtime untuk handle hotkey & klik
|
||||||
|
|
||||||
|
3. **API Route `/__open-in-editor`**
|
||||||
|
- Buat sebagai Next.js API route: `src/app/api/__open-in-editor/route.ts`
|
||||||
|
- HARUS bypass auth middleware
|
||||||
|
|
||||||
|
4. **Conditional Import** (sama seperti dokumen)
|
||||||
|
```tsx
|
||||||
|
const InspectorWrapper = process.env.NODE_ENV === 'development'
|
||||||
|
? (await import('./DevInspector')).DevInspector
|
||||||
|
: ({ children }) => <>{children}</>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Implementasi Steps:
|
||||||
|
|
||||||
|
Jika Anda ingin melanjutkan dengan custom implementation, berikut steps:
|
||||||
|
|
||||||
|
1. ✅ Buat `src/components/DevInspector.tsx` (copy dari dokumen)
|
||||||
|
2. ⚠️ Buat webpack loader untuk inject attributes (perlu research)
|
||||||
|
3. ✅ Buat API route `src/app/api/__open-in-editor/route.ts`
|
||||||
|
4. ✅ Wrap root layout dengan DevInspector
|
||||||
|
5. ✅ Set `REACT_EDITOR` di `.env`
|
||||||
|
|
||||||
|
**Peringatan:**
|
||||||
|
- Webpack loader lebih kompleks daripada Vite plugin
|
||||||
|
- Mungkin ada edge cases dengan Next.js internals
|
||||||
|
- Perlu maintenance ekstra saat Next.js update
|
||||||
|
|
||||||
|
## 📊 Perbandingan
|
||||||
|
|
||||||
|
| Fitur | Built-in Next.js | Custom Implementation |
|
||||||
|
|-------|------------------|----------------------|
|
||||||
|
| Setup | ✅ Zero | ⚠️ Medium |
|
||||||
|
| Visual Overlay | ❌ Tidak ada | ✅ Ada |
|
||||||
|
| Tooltip | ❌ Tidak ada | ✅ Ada |
|
||||||
|
| Hotkey | `Option+Click` | Custom (bisa disesuaikan) |
|
||||||
|
| Maintenance | ✅ Vercel | ⚠️ Manual |
|
||||||
|
| Compatibility | ✅ Guaranteed | ⚠️ Perlu testing |
|
||||||
|
| Production Impact | ✅ Zero | ✅ Zero (dengan conditional import) |
|
||||||
|
|
||||||
|
## 🎯 Kesimpulan
|
||||||
|
|
||||||
|
**Rekomendasi: Gunakan Built-in Next.js**
|
||||||
|
|
||||||
|
Alasan:
|
||||||
|
1. ✅ Sudah tersedia - tidak perlu setup
|
||||||
|
2. ✅ Lebih stabil - maintain oleh Vercel
|
||||||
|
3. ✅ Lebih simple - tidak ada custom code
|
||||||
|
4. ✅ Future-proof - otomatis update dengan Next.js
|
||||||
|
|
||||||
|
**Custom implementation hanya diperlukan jika:**
|
||||||
|
- Anda sangat membutuhkan visual overlay & tooltip
|
||||||
|
- Anda ingin hotkey yang sama persis (`Ctrl+Shift+Cmd+C`)
|
||||||
|
- Anda punya waktu untuk maintenance
|
||||||
|
|
||||||
|
## 🚀 Quick Start - Built-in Feature
|
||||||
|
|
||||||
|
Untuk menggunakan click-to-source bawaan Next.js:
|
||||||
|
|
||||||
|
1. Jalankan development server:
|
||||||
|
```bash
|
||||||
|
bun run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Buka browser ke `http://localhost:3000`
|
||||||
|
|
||||||
|
3. Tahan `Option` (macOS) atau `Alt` (Windows/Linux)
|
||||||
|
|
||||||
|
4. Cursor akan berubah menjadi crosshair
|
||||||
|
|
||||||
|
5. Klik elemen mana pun - file akan terbuka di editor
|
||||||
|
|
||||||
|
6. **Opsional**: Set editor di `.env`:
|
||||||
|
```env
|
||||||
|
# .env.local
|
||||||
|
EDITOR=code # atau cursor, windsurf, subl
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 Notes
|
||||||
|
|
||||||
|
- Fitur ini hanya aktif di development mode (`NODE_ENV=development`)
|
||||||
|
- Production build (`bun run build`) otomatis menghilangkan fitur ini
|
||||||
|
- Next.js menggunakan mekanisme yang mirip (source mapping) untuk menentukan lokasi component
|
||||||
|
- Jika editor tidak terbuka, pastikan:
|
||||||
|
- Editor sudah terinstall dan ada di PATH
|
||||||
|
- Browser DevTools terbuka (beberapa browser require ini)
|
||||||
|
- Anda menggunakan development server, bukan production
|
||||||
|
|
||||||
|
## 🔗 Referensi
|
||||||
|
|
||||||
|
- [Next.js Documentation - Launching Editor](https://nextjs.org/docs/app/api-reference/config/next-config-js/reactStrictMode)
|
||||||
|
- [React DevTools - Component Inspection](https://react.dev/learn/react-developer-tools)
|
||||||
|
- [Original Dev Inspector Document](./dev-inspector-click-to-source.md)
|
||||||
98
Dockerfile
98
Dockerfile
@@ -1,60 +1,74 @@
|
|||||||
# Stage 1: Build
|
# ==============================
|
||||||
FROM oven/bun:1.3 AS build
|
# Stage 1: Builder
|
||||||
|
# ==============================
|
||||||
|
FROM oven/bun:1-debian AS builder
|
||||||
|
|
||||||
# Install build dependencies for native modules
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
python3 \
|
|
||||||
make \
|
|
||||||
g++ \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Set the working directory
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Copy package files
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY package.json bun.lock* ./
|
libc6 \
|
||||||
|
git \
|
||||||
|
openssl \
|
||||||
|
ca-certificates \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY package.json bun.lockb* ./
|
||||||
|
|
||||||
|
ENV SHARP_IGNORE_GLOBAL_LIBVIPS=1
|
||||||
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
|
ENV NODE_OPTIONS="--max-old-space-size=4096"
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
RUN bun install --frozen-lockfile
|
RUN bun install --frozen-lockfile
|
||||||
|
|
||||||
# Copy the rest of the application code
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# Use .env.example as default env for build
|
RUN cp .env.example .env || true
|
||||||
RUN cp .env.example .env
|
|
||||||
|
|
||||||
# Generate Prisma client
|
ENV PRISMA_CLI_BINARY_TARGETS=debian-openssl-3.0.x
|
||||||
RUN bun x prisma generate
|
RUN bunx prisma generate
|
||||||
|
|
||||||
|
# Generate API types (opsional)
|
||||||
|
RUN bun run gen:api || echo "tidak ada gen api"
|
||||||
|
|
||||||
# Build the application frontend
|
|
||||||
ENV NODE_ENV=production
|
|
||||||
RUN bun run build
|
RUN bun run build
|
||||||
|
|
||||||
# Stage 2: Runtime
|
# ==============================
|
||||||
FROM oven/bun:1.3-slim AS runtime
|
# Stage 2: Runner (Production)
|
||||||
|
# ==============================
|
||||||
|
FROM oven/bun:1-debian AS runner
|
||||||
|
|
||||||
# Set environment variables
|
|
||||||
ENV NODE_ENV=production
|
|
||||||
|
|
||||||
# Install runtime dependencies
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
postgresql-client \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Set the working directory
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Copy necessary files from build stage
|
ENV NODE_ENV=production
|
||||||
COPY --from=build /app/package.json ./
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
COPY --from=build /app/tsconfig.json ./
|
ENV PRISMA_CLI_BINARY_TARGETS=debian-openssl-3.0.x
|
||||||
COPY --from=build /app/.next ./.next
|
ENV PORT=3000
|
||||||
COPY --from=build /app/public ./public
|
ENV HOSTNAME="0.0.0.0"
|
||||||
COPY --from=build /app/src ./src
|
|
||||||
COPY --from=build /app/node_modules ./node_modules
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY --from=build /app/prisma ./prisma
|
openssl \
|
||||||
|
ca-certificates \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN groupadd --system --gid 1001 nodejs \
|
||||||
|
&& useradd --system --uid 1001 --gid nodejs nextjs
|
||||||
|
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/next.config.* ./
|
||||||
|
COPY --chmod=755 docker-entrypoint.sh ./docker-entrypoint.sh
|
||||||
|
|
||||||
|
# Create uploads directory with proper permissions
|
||||||
|
RUN mkdir -p /app/uploads && chown nextjs:nodejs /app/uploads
|
||||||
|
|
||||||
|
USER nextjs
|
||||||
|
|
||||||
|
# Persistent storage for uploaded files
|
||||||
|
VOLUME ["/app/uploads"]
|
||||||
|
|
||||||
# Expose the port
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
# Start the application
|
CMD ["/app/docker-entrypoint.sh"]
|
||||||
CMD ["bun", "start"]
|
|
||||||
5
QWEN.md
5
QWEN.md
@@ -229,4 +229,7 @@ Common issues and solutions:
|
|||||||
3. Test database changes with `bunx prisma db push`
|
3. Test database changes with `bunx prisma db push`
|
||||||
4. Use the integrated Swagger docs at `/api/docs` for API testing
|
4. Use the integrated Swagger docs at `/api/docs` for API testing
|
||||||
5. Check environment variables are properly configured
|
5. Check environment variables are properly configured
|
||||||
6. Verify responsive design on different screen sizes
|
6. Verify responsive design on different screen sizes
|
||||||
|
|
||||||
|
## Qwen Added Memories
|
||||||
|
- **GitHub Workflows**: Project ini memiliki workflow GitHub Action untuk deployment. User akan menangani workflow secara manual di GitHub.
|
||||||
|
|||||||
49
biome.json
Normal file
49
biome.json
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://biomejs.dev/schemas/2.4.10/schema.json",
|
||||||
|
"vcs": {
|
||||||
|
"enabled": true,
|
||||||
|
"clientKind": "git",
|
||||||
|
"useIgnoreFile": true
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"ignoreUnknown": false,
|
||||||
|
"experimentalScannerIgnores": [
|
||||||
|
"node_modules",
|
||||||
|
".next",
|
||||||
|
"out",
|
||||||
|
"public"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"formatter": {
|
||||||
|
"enabled": true,
|
||||||
|
"indentStyle": "space",
|
||||||
|
"indentWidth": 2,
|
||||||
|
"lineWidth": 100
|
||||||
|
},
|
||||||
|
"linter": {
|
||||||
|
"enabled": true,
|
||||||
|
"rules": {
|
||||||
|
"recommended": true,
|
||||||
|
"correctness": {
|
||||||
|
"noUnusedVariables": "warn",
|
||||||
|
"noUnusedImports": "warn"
|
||||||
|
},
|
||||||
|
"suspicious": {
|
||||||
|
"noExplicitAny": "warn"
|
||||||
|
},
|
||||||
|
"style": {
|
||||||
|
"noNonNullAssertion": "warn"
|
||||||
|
},
|
||||||
|
"complexity": {
|
||||||
|
"noForEach": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"javascript": {
|
||||||
|
"formatter": {
|
||||||
|
"quoteStyle": "single",
|
||||||
|
"trailingCommas": "all",
|
||||||
|
"semicolons": "always"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
553
dev-inspector-click-to-source.md
Normal file
553
dev-inspector-click-to-source.md
Normal file
@@ -0,0 +1,553 @@
|
|||||||
|
# Skill: Dev Inspector — Click-to-Source untuk Bun + Elysia + Vite + React
|
||||||
|
|
||||||
|
## Ringkasan
|
||||||
|
|
||||||
|
Fitur development: klik elemen UI di browser → langsung buka source code di editor (VS Code, Cursor, dll) pada baris dan kolom yang tepat. Zero overhead di production.
|
||||||
|
|
||||||
|
**Hotkey**: `Ctrl+Shift+Cmd+C` (macOS) / `Ctrl+Shift+Alt+C` → aktifkan mode inspect → klik elemen → file terbuka.
|
||||||
|
|
||||||
|
## Kenapa Tidak Pakai Library
|
||||||
|
|
||||||
|
`react-dev-inspector` crash di React 19 karena:
|
||||||
|
- `fiber.return.child.sibling` bisa null di React 19
|
||||||
|
- `_debugSource` dihapus dari React 19
|
||||||
|
- Walking fiber tree tidak stabil antar versi React
|
||||||
|
|
||||||
|
Solusi ini **regex-based + multi-fallback**, tidak bergantung pada React internals.
|
||||||
|
|
||||||
|
## Syarat Arsitektur
|
||||||
|
|
||||||
|
Fitur ini bekerja karena 4 syarat struktural terpenuhi. Jika salah satu tidak ada, fitur tidak bisa diimplementasi atau perlu adaptasi signifikan.
|
||||||
|
|
||||||
|
### 1. Vite sebagai Bundler (Wajib)
|
||||||
|
|
||||||
|
Seluruh mekanisme bergantung pada **Vite plugin transform pipeline**:
|
||||||
|
- `inspectorPlugin()` inject attributes ke JSX saat build/HMR
|
||||||
|
- `enforce: 'pre'` memastikan plugin jalan sebelum OXC/Babel transform JSX
|
||||||
|
- `import.meta.env?.DEV` sebagai compile-time constant untuk tree-shaking
|
||||||
|
|
||||||
|
**Tidak bisa diganti dengan**: esbuild standalone, webpack (perlu loader berbeda), SWC standalone.
|
||||||
|
**Bisa diganti dengan**: framework yang pakai Vite di dalamnya (Remix Vite, TanStack Start, Astro).
|
||||||
|
|
||||||
|
### 2. Server dan Frontend dalam Satu Proses (Wajib)
|
||||||
|
|
||||||
|
Endpoint `/__open-in-editor` harus **satu proses dengan dev server** yang melayani frontend:
|
||||||
|
- Browser POST ke origin yang sama (no CORS)
|
||||||
|
- Server punya akses ke filesystem lokal untuk `Bun.spawn(editor)`
|
||||||
|
- Endpoint harus bisa ditangani **sebelum routing & middleware** (auth, tenant, dll)
|
||||||
|
|
||||||
|
**Pola yang memenuhi syarat:**
|
||||||
|
- Elysia + Vite middlewareMode (project ini) — `onRequest` intercept sebelum route matching
|
||||||
|
- Express/Fastify + Vite middlewareMode — middleware biasa sebelum auth
|
||||||
|
- Vite dev server standalone (`vite dev`) — pakai `configureServer` hook
|
||||||
|
|
||||||
|
**Tidak memenuhi syarat:**
|
||||||
|
- Frontend dan backend di proses/port terpisah (misal: CRA + separate API server) — perlu proxy atau CORS config tambahan
|
||||||
|
- Serverless/edge deployment — tidak bisa `spawn` editor
|
||||||
|
|
||||||
|
### 3. React sebagai UI Framework (Wajib untuk Multi-Fallback)
|
||||||
|
|
||||||
|
Strategi extraction source info bergantung pada React internals:
|
||||||
|
1. `__reactProps$*` — React menyimpan props di DOM element
|
||||||
|
2. `__reactFiber$*` — React fiber tree untuk walk-up
|
||||||
|
3. DOM attribute — fallback universal
|
||||||
|
|
||||||
|
**Jika pakai framework lain** (Vue, Svelte, Solid):
|
||||||
|
- Hanya strategi 3 (DOM attribute) yang berfungsi — tetap cukup
|
||||||
|
- Hapus strategi 1 & 2 dari `getCodeInfoFromElement()`
|
||||||
|
- Inject attributes tetap via Vite plugin (framework-agnostic)
|
||||||
|
|
||||||
|
### 4. Bun sebagai Runtime (Direkomendasikan, Bukan Wajib)
|
||||||
|
|
||||||
|
Bun memberikan API yang lebih clean:
|
||||||
|
- `Bun.spawn()` — fire-and-forget tanpa import
|
||||||
|
- `Bun.which()` — cek executable ada di PATH (mencegah uncatchable error)
|
||||||
|
|
||||||
|
**Jika pakai Node.js:**
|
||||||
|
- `Bun.spawn()` → `child_process.spawn(editor, args, { detached: true, stdio: 'ignore' }).unref()`
|
||||||
|
- `Bun.which()` → `const which = require('which'); which.sync(editor, { nothrow: true })`
|
||||||
|
|
||||||
|
### Ringkasan Syarat
|
||||||
|
|
||||||
|
| Syarat | Wajib? | Alternatif |
|
||||||
|
|-------------------------------|----------|------------------------------------------------------|
|
||||||
|
| Vite sebagai bundler | Ya | Framework berbasis Vite (Remix, Astro, dll) |
|
||||||
|
| Server + frontend satu proses | Ya | Bisa diakali dengan proxy, tapi tambah kompleksitas |
|
||||||
|
| React | Sebagian | Framework lain bisa, hanya fallback ke DOM attribute |
|
||||||
|
| Bun runtime | Tidak | Node.js dengan `child_process` + `which` package |
|
||||||
|
|
||||||
|
## Arsitektur
|
||||||
|
|
||||||
|
```
|
||||||
|
BUILD TIME (Vite Plugin):
|
||||||
|
.tsx/.jsx file
|
||||||
|
→ [inspectorPlugin enforce:'pre'] inject data-inspector-* attributes ke JSX
|
||||||
|
→ [react() OXC] transform JSX ke createElement
|
||||||
|
→ Browser menerima elemen dengan attributes
|
||||||
|
|
||||||
|
RUNTIME (Browser):
|
||||||
|
Hotkey → aktifkan mode → hover elemen → baca attributes → klik
|
||||||
|
→ POST /__open-in-editor {relativePath, line, column}
|
||||||
|
|
||||||
|
BACKEND (Elysia onRequest):
|
||||||
|
/__open-in-editor → Bun.spawn([editor, '--goto', 'file:line:col'])
|
||||||
|
→ Editor terbuka di lokasi tepat
|
||||||
|
```
|
||||||
|
|
||||||
|
## Komponen yang Dibutuhkan
|
||||||
|
|
||||||
|
### 1. Vite Plugin — `inspectorPlugin()` (enforce: 'pre')
|
||||||
|
|
||||||
|
Inject `data-inspector-*` ke setiap JSX opening tag via regex.
|
||||||
|
|
||||||
|
**HARUS `enforce: 'pre'`** — kalau tidak, OXC transform JSX duluan dan regex tidak bisa menemukan `<Component`.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Taruh di file vite config (misal: src/vite.ts atau vite.config.ts)
|
||||||
|
import path from 'node:path'
|
||||||
|
import type { Plugin } from 'vite'
|
||||||
|
|
||||||
|
function inspectorPlugin(): Plugin {
|
||||||
|
const rootDir = process.cwd()
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: 'inspector-inject',
|
||||||
|
enforce: 'pre',
|
||||||
|
transform(code, id) {
|
||||||
|
// Hanya .tsx/.jsx, skip node_modules
|
||||||
|
if (!/\.[jt]sx(\?|$)/.test(id) || id.includes('node_modules')) return null
|
||||||
|
if (!code.includes('<')) return null
|
||||||
|
|
||||||
|
const relativePath = path.relative(rootDir, id)
|
||||||
|
let modified = false
|
||||||
|
const lines = code.split('\n')
|
||||||
|
const result: string[] = []
|
||||||
|
|
||||||
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
let line = lines[i]
|
||||||
|
// Match JSX opening tags: <Component atau <div
|
||||||
|
// Skip TypeScript generics (Record<string>) via charBefore check
|
||||||
|
const jsxPattern = /(<(?:[A-Z][a-zA-Z0-9.]*|[a-z][a-zA-Z0-9-]*))\b/g
|
||||||
|
let match: RegExpExecArray | null = null
|
||||||
|
|
||||||
|
while ((match = jsxPattern.exec(line)) !== null) {
|
||||||
|
// Skip jika karakter sebelum `<` adalah identifier char (TypeScript generic)
|
||||||
|
const charBefore = match.index > 0 ? line[match.index - 1] : ''
|
||||||
|
if (/[a-zA-Z0-9_$.]/.test(charBefore)) continue
|
||||||
|
|
||||||
|
const col = match.index + 1
|
||||||
|
const attr = ` data-inspector-line="${i + 1}" data-inspector-column="${col}" data-inspector-relative-path="${relativePath}"`
|
||||||
|
const insertPos = match.index + match[0].length
|
||||||
|
line = line.slice(0, insertPos) + attr + line.slice(insertPos)
|
||||||
|
modified = true
|
||||||
|
jsxPattern.lastIndex += attr.length
|
||||||
|
}
|
||||||
|
|
||||||
|
result.push(line)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!modified) return null
|
||||||
|
return result.join('\n')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Mengapa regex, bukan Babel?**
|
||||||
|
- `@vitejs/plugin-react` v6+ pakai OXC (Rust), bukan Babel
|
||||||
|
- Config `babel: { plugins: [...] }` di plugin-react **DIABAIKAN**
|
||||||
|
- Regex jalan sebelum OXC via `enforce: 'pre'`
|
||||||
|
|
||||||
|
**Gotcha: TypeScript generics**
|
||||||
|
- `Record<string>` → karakter sebelum `<` adalah `d` (identifier) → SKIP
|
||||||
|
- `<Button` → karakter sebelum `<` adalah space/newline → MATCH
|
||||||
|
|
||||||
|
### 2. Vite Plugin Order (KRITIS)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
plugins: [
|
||||||
|
// 1. Route generation (jika pakai TanStack Router)
|
||||||
|
TanStackRouterVite({ ... }),
|
||||||
|
|
||||||
|
// 2. Inspector inject — HARUS sebelum react()
|
||||||
|
inspectorPlugin(),
|
||||||
|
|
||||||
|
// 3. React OXC transform
|
||||||
|
react(),
|
||||||
|
|
||||||
|
// 4. (Opsional) Dedupe React Refresh untuk middlewareMode
|
||||||
|
dedupeRefreshPlugin(),
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Jika urutan salah (inspectorPlugin setelah react):**
|
||||||
|
- OXC transform `<Button>` → `React.createElement(Button, ...)`
|
||||||
|
- Regex tidak menemukan `<Button` → attributes TIDAK ter-inject
|
||||||
|
- Fitur tidak berfungsi, tanpa error
|
||||||
|
|
||||||
|
### 3. DevInspector Component (Browser Runtime)
|
||||||
|
|
||||||
|
Komponen React yang handle hotkey, overlay, dan klik.
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
// src/frontend/DevInspector.tsx
|
||||||
|
import { useCallback, useEffect, useRef, useState } from 'react'
|
||||||
|
|
||||||
|
interface CodeInfo {
|
||||||
|
relativePath: string
|
||||||
|
line: string
|
||||||
|
column: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Baca data-inspector-* dari fiber props atau DOM attributes */
|
||||||
|
function getCodeInfoFromElement(element: HTMLElement): CodeInfo | null {
|
||||||
|
// Strategi 1: React internal props __reactProps$ (paling akurat)
|
||||||
|
for (const key of Object.keys(element)) {
|
||||||
|
if (key.startsWith('__reactProps$')) {
|
||||||
|
const props = (element as any)[key]
|
||||||
|
if (props?.['data-inspector-relative-path']) {
|
||||||
|
return {
|
||||||
|
relativePath: props['data-inspector-relative-path'],
|
||||||
|
line: props['data-inspector-line'] || '1',
|
||||||
|
column: props['data-inspector-column'] || '1',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Strategi 2: Walk fiber tree __reactFiber$
|
||||||
|
if (key.startsWith('__reactFiber$')) {
|
||||||
|
const fiber = (element as any)[key]
|
||||||
|
let f = fiber
|
||||||
|
while (f) {
|
||||||
|
const p = f.pendingProps || f.memoizedProps
|
||||||
|
if (p?.['data-inspector-relative-path']) {
|
||||||
|
return {
|
||||||
|
relativePath: p['data-inspector-relative-path'],
|
||||||
|
line: p['data-inspector-line'] || '1',
|
||||||
|
column: p['data-inspector-column'] || '1',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Fallback: _debugSource (React < 19)
|
||||||
|
const src = f._debugSource ?? f._debugOwner?._debugSource
|
||||||
|
if (src?.fileName && src?.lineNumber) {
|
||||||
|
return {
|
||||||
|
relativePath: src.fileName,
|
||||||
|
line: String(src.lineNumber),
|
||||||
|
column: String(src.columnNumber ?? 1),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f = f.return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Strategi 3: Fallback DOM attribute langsung
|
||||||
|
const rp = element.getAttribute('data-inspector-relative-path')
|
||||||
|
if (rp) {
|
||||||
|
return {
|
||||||
|
relativePath: rp,
|
||||||
|
line: element.getAttribute('data-inspector-line') || '1',
|
||||||
|
column: element.getAttribute('data-inspector-column') || '1',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Walk up DOM tree sampai ketemu elemen yang punya source info */
|
||||||
|
function findCodeInfo(target: HTMLElement): CodeInfo | null {
|
||||||
|
let el: HTMLElement | null = target
|
||||||
|
while (el) {
|
||||||
|
const info = getCodeInfoFromElement(el)
|
||||||
|
if (info) return info
|
||||||
|
el = el.parentElement
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
function openInEditor(info: CodeInfo) {
|
||||||
|
fetch('/__open-in-editor', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
relativePath: info.relativePath,
|
||||||
|
lineNumber: info.line,
|
||||||
|
columnNumber: info.column,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function DevInspector({ children }: { children: React.ReactNode }) {
|
||||||
|
const [active, setActive] = useState(false)
|
||||||
|
const overlayRef = useRef<HTMLDivElement | null>(null)
|
||||||
|
const tooltipRef = useRef<HTMLDivElement | null>(null)
|
||||||
|
const lastInfoRef = useRef<CodeInfo | null>(null)
|
||||||
|
|
||||||
|
const updateOverlay = useCallback((target: HTMLElement | null) => {
|
||||||
|
const ov = overlayRef.current
|
||||||
|
const tt = tooltipRef.current
|
||||||
|
if (!ov || !tt) return
|
||||||
|
|
||||||
|
if (!target) {
|
||||||
|
ov.style.display = 'none'
|
||||||
|
tt.style.display = 'none'
|
||||||
|
lastInfoRef.current = null
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const info = findCodeInfo(target)
|
||||||
|
if (!info) {
|
||||||
|
ov.style.display = 'none'
|
||||||
|
tt.style.display = 'none'
|
||||||
|
lastInfoRef.current = null
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
lastInfoRef.current = info
|
||||||
|
|
||||||
|
const rect = target.getBoundingClientRect()
|
||||||
|
ov.style.display = 'block'
|
||||||
|
ov.style.top = `${rect.top + window.scrollY}px`
|
||||||
|
ov.style.left = `${rect.left + window.scrollX}px`
|
||||||
|
ov.style.width = `${rect.width}px`
|
||||||
|
ov.style.height = `${rect.height}px`
|
||||||
|
|
||||||
|
tt.style.display = 'block'
|
||||||
|
tt.textContent = `${info.relativePath}:${info.line}`
|
||||||
|
const ttTop = rect.top + window.scrollY - 24
|
||||||
|
tt.style.top = `${ttTop > 0 ? ttTop : rect.bottom + window.scrollY + 4}px`
|
||||||
|
tt.style.left = `${rect.left + window.scrollX}px`
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
// Activate/deactivate event listeners
|
||||||
|
useEffect(() => {
|
||||||
|
if (!active) return
|
||||||
|
|
||||||
|
const onMouseOver = (e: MouseEvent) => updateOverlay(e.target as HTMLElement)
|
||||||
|
|
||||||
|
const onClick = (e: MouseEvent) => {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
const info = lastInfoRef.current ?? findCodeInfo(e.target as HTMLElement)
|
||||||
|
if (info) {
|
||||||
|
const loc = `${info.relativePath}:${info.line}:${info.column}`
|
||||||
|
console.log('[DevInspector] Open:', loc)
|
||||||
|
navigator.clipboard.writeText(loc)
|
||||||
|
openInEditor(info)
|
||||||
|
}
|
||||||
|
setActive(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
const onKeyDown = (e: KeyboardEvent) => {
|
||||||
|
if (e.key === 'Escape') setActive(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('mouseover', onMouseOver, true)
|
||||||
|
document.addEventListener('click', onClick, true)
|
||||||
|
document.addEventListener('keydown', onKeyDown)
|
||||||
|
document.body.style.cursor = 'crosshair'
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener('mouseover', onMouseOver, true)
|
||||||
|
document.removeEventListener('click', onClick, true)
|
||||||
|
document.removeEventListener('keydown', onKeyDown)
|
||||||
|
document.body.style.cursor = ''
|
||||||
|
if (overlayRef.current) overlayRef.current.style.display = 'none'
|
||||||
|
if (tooltipRef.current) tooltipRef.current.style.display = 'none'
|
||||||
|
}
|
||||||
|
}, [active, updateOverlay])
|
||||||
|
|
||||||
|
// Hotkey: Ctrl+Shift+Cmd+C (macOS) / Ctrl+Shift+Alt+C
|
||||||
|
useEffect(() => {
|
||||||
|
const onKeyDown = (e: KeyboardEvent) => {
|
||||||
|
if (e.key.toLowerCase() === 'c' && e.ctrlKey && e.shiftKey && (e.metaKey || e.altKey)) {
|
||||||
|
e.preventDefault()
|
||||||
|
setActive((prev) => !prev)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
document.addEventListener('keydown', onKeyDown)
|
||||||
|
return () => document.removeEventListener('keydown', onKeyDown)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{children}
|
||||||
|
<div
|
||||||
|
ref={overlayRef}
|
||||||
|
style={{
|
||||||
|
display: 'none',
|
||||||
|
position: 'absolute',
|
||||||
|
pointerEvents: 'none',
|
||||||
|
border: '2px solid #3b82f6',
|
||||||
|
backgroundColor: 'rgba(59,130,246,0.1)',
|
||||||
|
zIndex: 99999,
|
||||||
|
transition: 'all 0.05s ease',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
ref={tooltipRef}
|
||||||
|
style={{
|
||||||
|
display: 'none',
|
||||||
|
position: 'absolute',
|
||||||
|
pointerEvents: 'none',
|
||||||
|
backgroundColor: '#1e293b',
|
||||||
|
color: '#e2e8f0',
|
||||||
|
fontSize: '12px',
|
||||||
|
fontFamily: 'monospace',
|
||||||
|
padding: '2px 6px',
|
||||||
|
borderRadius: '3px',
|
||||||
|
zIndex: 100000,
|
||||||
|
whiteSpace: 'nowrap',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Backend Endpoint — `/__open-in-editor`
|
||||||
|
|
||||||
|
**HARUS ditangani di `onRequest` / sebelum middleware**, bukan sebagai route biasa. Kalau jadi route, akan kena auth middleware dan gagal.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Di entry point server (src/index.tsx), dalam onRequest handler:
|
||||||
|
|
||||||
|
if (!isProduction && pathname === '/__open-in-editor' && request.method === 'POST') {
|
||||||
|
const { relativePath, lineNumber, columnNumber } = (await request.json()) as {
|
||||||
|
relativePath: string
|
||||||
|
lineNumber: string
|
||||||
|
columnNumber: string
|
||||||
|
}
|
||||||
|
const file = `${process.cwd()}/${relativePath}`
|
||||||
|
const editor = process.env.REACT_EDITOR || 'code'
|
||||||
|
const loc = `${file}:${lineNumber}:${columnNumber}`
|
||||||
|
const args = editor === 'subl' ? [loc] : ['--goto', loc]
|
||||||
|
const editorPath = Bun.which(editor)
|
||||||
|
console.log(`[inspector] ${editor} → ${editorPath ?? 'NOT FOUND'} → ${loc}`)
|
||||||
|
if (editorPath) {
|
||||||
|
Bun.spawn([editor, ...args], { stdio: ['ignore', 'ignore', 'ignore'] })
|
||||||
|
} else {
|
||||||
|
console.error(`[inspector] Editor "${editor}" not found in PATH. Set REACT_EDITOR in .env`)
|
||||||
|
}
|
||||||
|
return new Response('ok')
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Penting — `Bun.which()` sebelum `Bun.spawn()`:**
|
||||||
|
- `Bun.spawn()` throw native error yang TIDAK bisa di-catch jika executable tidak ada
|
||||||
|
- `Bun.which()` return null dengan aman → cek dulu sebelum spawn
|
||||||
|
|
||||||
|
**Editor yang didukung:**
|
||||||
|
|
||||||
|
| REACT_EDITOR | Editor | Args |
|
||||||
|
|------------------|--------------|--------------------------------|
|
||||||
|
| `code` (default) | VS Code | `--goto file:line:col` |
|
||||||
|
| `cursor` | Cursor | `--goto file:line:col` |
|
||||||
|
| `windsurf` | Windsurf | `--goto file:line:col` |
|
||||||
|
| `subl` | Sublime Text | `file:line:col` (tanpa --goto) |
|
||||||
|
|
||||||
|
### 5. Frontend Entry — Conditional Import (Zero Production Overhead)
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
// src/frontend.tsx (atau entry point React)
|
||||||
|
import type { ReactNode } from 'react'
|
||||||
|
|
||||||
|
const InspectorWrapper = import.meta.env?.DEV
|
||||||
|
? (await import('./frontend/DevInspector')).DevInspector
|
||||||
|
: ({ children }: { children: ReactNode }) => <>{children}</>
|
||||||
|
|
||||||
|
const app = (
|
||||||
|
<InspectorWrapper>
|
||||||
|
<App />
|
||||||
|
</InspectorWrapper>
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Bagaimana zero overhead tercapai:**
|
||||||
|
- `import.meta.env?.DEV` adalah compile-time constant
|
||||||
|
- Production build: `false` → dynamic import TIDAK dieksekusi
|
||||||
|
- Tree-shaking menghapus seluruh `DevInspector.tsx` dari bundle
|
||||||
|
- Tidak ada runtime check, tidak ada dead code di bundle
|
||||||
|
|
||||||
|
### 6. (Opsional) Dedupe React Refresh — Workaround Vite middlewareMode
|
||||||
|
|
||||||
|
Jika pakai Vite dalam `middlewareMode` (seperti di Elysia/Express), `@vitejs/plugin-react` v6 bisa inject React Refresh footer dua kali → error "already declared".
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
function dedupeRefreshPlugin(): Plugin {
|
||||||
|
return {
|
||||||
|
name: 'dedupe-react-refresh',
|
||||||
|
enforce: 'post',
|
||||||
|
transform(code, id) {
|
||||||
|
if (!/\.[jt]sx(\?|$)/.test(id) || id.includes('node_modules')) return null
|
||||||
|
|
||||||
|
const marker = 'import * as RefreshRuntime from "/@react-refresh"'
|
||||||
|
const firstIdx = code.indexOf(marker)
|
||||||
|
if (firstIdx === -1) return null
|
||||||
|
|
||||||
|
const secondIdx = code.indexOf(marker, firstIdx + marker.length)
|
||||||
|
if (secondIdx === -1) return null
|
||||||
|
|
||||||
|
const sourcemapIdx = code.indexOf('\n//# sourceMappingURL=', secondIdx)
|
||||||
|
const endIdx = sourcemapIdx !== -1 ? sourcemapIdx : code.length
|
||||||
|
|
||||||
|
const cleaned = code.slice(0, secondIdx) + code.slice(endIdx)
|
||||||
|
return { code: cleaned, map: null }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Langkah Implementasi di Project Baru
|
||||||
|
|
||||||
|
### Prasyarat
|
||||||
|
- Runtime: Bun
|
||||||
|
- Server: Elysia (atau framework lain dengan onRequest/beforeHandle)
|
||||||
|
- Frontend: React + Vite
|
||||||
|
- `@vitejs/plugin-react` (OXC)
|
||||||
|
|
||||||
|
### Step-by-step
|
||||||
|
|
||||||
|
1. **Buat `DevInspector.tsx`** — copy komponen dari Bagian 3 ke folder frontend
|
||||||
|
2. **Tambah `inspectorPlugin()`** — copy fungsi dari Bagian 1 ke file vite config
|
||||||
|
3. **Atur plugin order** — `inspectorPlugin()` SEBELUM `react()` (Bagian 2)
|
||||||
|
4. **Tambah endpoint `/__open-in-editor`** — di `onRequest` handler (Bagian 4)
|
||||||
|
5. **Wrap root app** — conditional import di entry point (Bagian 5)
|
||||||
|
6. **Set env** — `REACT_EDITOR=code` (atau cursor/windsurf/subl) di `.env`
|
||||||
|
7. **(Opsional)** Tambah `dedupeRefreshPlugin()` jika pakai Vite `middlewareMode`
|
||||||
|
|
||||||
|
### Checklist Verifikasi
|
||||||
|
|
||||||
|
- [ ] `inspectorPlugin` punya `enforce: 'pre'`
|
||||||
|
- [ ] Plugin order: inspector → react (bukan sebaliknya)
|
||||||
|
- [ ] Endpoint `/__open-in-editor` di LUAR middleware auth
|
||||||
|
- [ ] `Bun.which(editor)` dipanggil SEBELUM `Bun.spawn()`
|
||||||
|
- [ ] Conditional import pakai `import.meta.env?.DEV`
|
||||||
|
- [ ] `REACT_EDITOR` di `.env` sesuai editor yang dipakai
|
||||||
|
- [ ] Hotkey berfungsi: `Ctrl+Shift+Cmd+C` / `Ctrl+Shift+Alt+C`
|
||||||
|
|
||||||
|
## Gotcha & Pelajaran
|
||||||
|
|
||||||
|
| Masalah | Penyebab | Solusi |
|
||||||
|
|----------------------------------|---------------------------------------------|-----------------------------------------------|
|
||||||
|
| Attributes tidak ter-inject | Plugin order salah | `enforce: 'pre'`, taruh sebelum `react()` |
|
||||||
|
| `Record<string>` ikut ter-inject | Regex match TypeScript generics | Cek `charBefore` — skip jika identifier char |
|
||||||
|
| `Bun.spawn` crash | Editor tidak ada di PATH | Selalu `Bun.which()` dulu |
|
||||||
|
| Hotkey tidak response | `e.key` return 'C' (uppercase) karena Shift | Pakai `e.key.toLowerCase()` |
|
||||||
|
| React Refresh duplicate | Vite middlewareMode bug | `dedupeRefreshPlugin()` enforce: 'post' |
|
||||||
|
| Endpoint kena auth middleware | Didaftarkan sebagai route biasa | Tangani di `onRequest` sebelum routing |
|
||||||
|
| `_debugSource` undefined | React 19 menghapusnya | Multi-fallback: reactProps → fiber → DOM attr |
|
||||||
|
|
||||||
|
## Adaptasi untuk Framework Lain
|
||||||
|
|
||||||
|
### Express/Fastify (bukan Elysia)
|
||||||
|
- Endpoint `/__open-in-editor`: gunakan middleware biasa SEBELUM auth
|
||||||
|
- `Bun.spawn` → `child_process.spawn` jika pakai Node.js
|
||||||
|
- `Bun.which` → `which` npm package jika pakai Node.js
|
||||||
|
|
||||||
|
### Next.js
|
||||||
|
- Tidak perlu — Next.js punya built-in click-to-source
|
||||||
|
- Tapi jika ingin custom: taruh endpoint di `middleware.ts`, plugin di `next.config.js`
|
||||||
|
|
||||||
|
### Remix/Tanstack Start (SSR)
|
||||||
|
- Plugin tetap sama (Vite-based)
|
||||||
|
- Endpoint perlu di server entry, bukan di route loader
|
||||||
13
docker-entrypoint.sh
Normal file
13
docker-entrypoint.sh
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🔄 Running database migrations..."
|
||||||
|
cd /app
|
||||||
|
bunx prisma migrate deploy || {
|
||||||
|
echo "❌ Migration failed!"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
echo "✅ Migrations completed successfully"
|
||||||
|
|
||||||
|
echo "🚀 Starting application..."
|
||||||
|
exec bun start
|
||||||
@@ -11,6 +11,11 @@ const compat = new FlatCompat({
|
|||||||
|
|
||||||
const eslintConfig = [
|
const eslintConfig = [
|
||||||
...compat.extends("next/core-web-vitals", "next/typescript"),
|
...compat.extends("next/core-web-vitals", "next/typescript"),
|
||||||
|
{
|
||||||
|
rules: {
|
||||||
|
"@typescript-eslint/no-explicit-any": "warn",
|
||||||
|
},
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export default eslintConfig;
|
export default eslintConfig;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "desa-darmasaba",
|
"name": "desa-darmasaba",
|
||||||
"version": "0.1.5",
|
"version": "0.1.8",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
@@ -8,7 +8,8 @@
|
|||||||
"start": "next start",
|
"start": "next start",
|
||||||
"test:api": "vitest run",
|
"test:api": "vitest run",
|
||||||
"test:e2e": "playwright test",
|
"test:e2e": "playwright test",
|
||||||
"test": "bun run test:api && bun run test:e2e"
|
"test": "bun run test:api && bun run test:e2e",
|
||||||
|
"gen:api": ""
|
||||||
},
|
},
|
||||||
"prisma": {
|
"prisma": {
|
||||||
"seed": "bun run prisma/seed.ts"
|
"seed": "bun run prisma/seed.ts"
|
||||||
@@ -120,10 +121,11 @@
|
|||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
"@vitest/ui": "^4.0.18",
|
"@vitest/ui": "^4.0.18",
|
||||||
"eslint": "^9",
|
"eslint": "^9",
|
||||||
"eslint-config-next": "15.1.6",
|
"eslint-config-next": "15.5.12",
|
||||||
"jsdom": "^28.0.0",
|
"jsdom": "^28.0.0",
|
||||||
"msw": "^2.12.9",
|
"msw": "^2.12.9",
|
||||||
"parcel": "^2.6.2",
|
"parcel": "^2.6.2",
|
||||||
|
"playwright-mcp": "^0.0.19",
|
||||||
"postcss": "^8.5.1",
|
"postcss": "^8.5.1",
|
||||||
"postcss-preset-mantine": "^1.17.0",
|
"postcss-preset-mantine": "^1.17.0",
|
||||||
"postcss-simple-vars": "^7.0.1",
|
"postcss-simple-vars": "^7.0.1",
|
||||||
|
|||||||
57
prisma/_seeder_list/core/seed_app_menu.ts
Normal file
57
prisma/_seeder_list/core/seed_app_menu.ts
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const appMenuJson = loadJsonData("core/app-menu.json");
|
||||||
|
const appMenuChildJson = loadJsonData("core/app-menu-child.json");
|
||||||
|
|
||||||
|
export async function seedAppMenu() {
|
||||||
|
console.log("🔄 Seeding AppMenu...");
|
||||||
|
|
||||||
|
for (const item of appMenuJson) {
|
||||||
|
await prisma.appMenu.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
link: item.link,
|
||||||
|
isActive: item.isActive,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
link: item.link,
|
||||||
|
isActive: item.isActive,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ AppMenu seeded: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 AppMenu seed selesai");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedAppMenuChild() {
|
||||||
|
console.log("🔄 Seeding AppMenuChild...");
|
||||||
|
|
||||||
|
for (const item of appMenuChildJson) {
|
||||||
|
await prisma.appMenuChild.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
link: item.link,
|
||||||
|
isActive: item.isActive,
|
||||||
|
appMenuId: item.appMenuId,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
link: item.link,
|
||||||
|
isActive: item.isActive,
|
||||||
|
appMenuId: item.appMenuId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ AppMenuChild seeded: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 AppMenuChild seed selesai");
|
||||||
|
}
|
||||||
69
prisma/_seeder_list/core/seed_core.ts
Normal file
69
prisma/_seeder_list/core/seed_core.ts
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const layananJson = loadJsonData("core/layanan.json");
|
||||||
|
const potensiJson = loadJsonData("core/potensi.json");
|
||||||
|
const landingPageLayananJson = loadJsonData("core/landingpage-layanan.json");
|
||||||
|
|
||||||
|
export async function seedLayananCore() {
|
||||||
|
console.log("🔄 Seeding Layanan...");
|
||||||
|
|
||||||
|
for (const item of layananJson) {
|
||||||
|
await prisma.layanan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ Layanan seeded: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 Layanan seed selesai");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedPotensiCore() {
|
||||||
|
console.log("🔄 Seeding Potensi...");
|
||||||
|
|
||||||
|
for (const item of potensiJson) {
|
||||||
|
await prisma.potensi.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ Potensi seeded: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 Potensi seed selesai");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedLandingPageLayanan() {
|
||||||
|
console.log("🔄 Seeding LandingPage_Layanan...");
|
||||||
|
|
||||||
|
for (const item of landingPageLayananJson) {
|
||||||
|
await prisma.landingPage_Layanan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
deksripsi: item.deksripsi,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
deksripsi: item.deksripsi,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ LandingPage_Layanan seeded: ${item.id}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 LandingPage_Layanan seed selesai");
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import kategoriBerita from "../../../data/desa/berita/kategori-berita.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
import beritaJson from "../../../data/desa/berita/berita.json";
|
|
||||||
|
const kategoriBerita = loadJsonData("desa/berita/kategori-berita.json");
|
||||||
|
const beritaJson = loadJsonData("desa/berita/berita.json");
|
||||||
|
|
||||||
export async function seedBerita() {
|
export async function seedBerita() {
|
||||||
// ================== SUBMENU BERITA ========================
|
// ================== SUBMENU BERITA ========================
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import foto from "../../../../data/desa/gallery/foto/foto.json";
|
import { loadJsonData } from "../../../../load-json";
|
||||||
|
|
||||||
|
const foto = loadJsonData("desa/gallery/foto/foto.json");
|
||||||
|
|
||||||
export async function seedFoto() {
|
export async function seedFoto() {
|
||||||
console.log("🔄 Seeding Foto...");
|
console.log("🔄 Seeding Foto...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import galleryVideo from "../../../../data/desa/gallery/video/video.json";
|
import { loadJsonData } from "../../../../load-json";
|
||||||
|
|
||||||
|
const galleryVideo = loadJsonData("desa/gallery/video/video.json");
|
||||||
|
|
||||||
export async function seedVideo() {
|
export async function seedVideo() {
|
||||||
console.log("🔄 Seeding Gallery Video...");
|
console.log("🔄 Seeding Gallery Video...");
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import pelayananSuratKeterangan from "../../../data/desa/layanan/pelayananSuratKeterangan.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
import pelayananTelunjukSaktiDesa from "../../../data/desa/layanan/pelayananTelunjukSaktiDesa.json";
|
|
||||||
import pelayananPerizinanBerusaha from "../../../data/desa/layanan/pelayananPerizinanBerusaha.json";
|
const pelayananSuratKeterangan = loadJsonData("desa/layanan/pelayananSuratKeterangan.json");
|
||||||
import pelayananPendudukNonPermanen from "../../../data/desa/layanan/pelayananPendudukNonPermanen.json";
|
const pelayananTelunjukSaktiDesa = loadJsonData("desa/layanan/pelayananTelunjukSaktiDesa.json");
|
||||||
|
const pelayananPerizinanBerusaha = loadJsonData("desa/layanan/pelayananPerizinanBerusaha.json");
|
||||||
|
const pelayananPendudukNonPermanen = loadJsonData("desa/layanan/pelayananPendudukNonPermanen.json");
|
||||||
|
|
||||||
export async function seedLayanan() {
|
export async function seedLayanan() {
|
||||||
console.log("🔄 Seeding Pelayanan Surat Keterangan...");
|
console.log("🔄 Seeding Pelayanan Surat Keterangan...");
|
||||||
|
|||||||
57
prisma/_seeder_list/desa/musik-desa/seed_musik_desa.ts
Normal file
57
prisma/_seeder_list/desa/musik-desa/seed_musik_desa.ts
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const musikJson = loadJsonData("desa/musik-desa/musik-desa.json");
|
||||||
|
|
||||||
|
export async function seedMusikDesa() {
|
||||||
|
console.log("Seeding Musik Desa...");
|
||||||
|
|
||||||
|
for (const item of musikJson) {
|
||||||
|
let audioFileId: string | null = null;
|
||||||
|
let coverImageId: string | null = null;
|
||||||
|
|
||||||
|
if (item.audioFileName) {
|
||||||
|
const audio = await prisma.fileStorage.findUnique({
|
||||||
|
where: { name: item.audioFileName },
|
||||||
|
select: { id: true },
|
||||||
|
});
|
||||||
|
if (audio) audioFileId = audio.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.coverImageName) {
|
||||||
|
const cover = await prisma.fileStorage.findUnique({
|
||||||
|
where: { name: item.coverImageName },
|
||||||
|
select: { id: true },
|
||||||
|
});
|
||||||
|
if (cover) coverImageId = cover.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
await prisma.musikDesa.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
judul: item.judul,
|
||||||
|
artis: item.artis,
|
||||||
|
deskripsi: item.deskripsi,
|
||||||
|
durasi: item.durasi,
|
||||||
|
audioFileId,
|
||||||
|
coverImageId,
|
||||||
|
genre: item.genre,
|
||||||
|
tahunRilis: item.tahunRilis,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
judul: item.judul,
|
||||||
|
artis: item.artis,
|
||||||
|
deskripsi: item.deskripsi,
|
||||||
|
durasi: item.durasi,
|
||||||
|
audioFileId,
|
||||||
|
coverImageId,
|
||||||
|
genre: item.genre,
|
||||||
|
tahunRilis: item.tahunRilis,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Musik: ${item.judul} - ${item.artis}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Musik Desa seed selesai");
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import penghargaan from "../../../data/desa/penghargaan/penghargaan.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const penghargaan = loadJsonData("desa/penghargaan/penghargaan.json");
|
||||||
|
|
||||||
export async function seedPenghargaan() {
|
export async function seedPenghargaan() {
|
||||||
console.log("🔄 Seeding Penghargaan...");
|
console.log("🔄 Seeding Penghargaan...");
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../../load-json";
|
||||||
import { safeSeedUnique } from "../../../safeseedUnique";
|
import { safeSeedUnique } from "../../../safeseedUnique";
|
||||||
import kategoriPengumuman from "../../../data/desa/pengumuman/kategori-pengumuman.json";
|
|
||||||
import pengumuman from "../../../data/desa/pengumuman/pengumuman.json";
|
const kategoriPengumuman = loadJsonData("desa/pengumuman/kategori-pengumuman.json");
|
||||||
|
const pengumuman = loadJsonData("desa/pengumuman/pengumuman.json");
|
||||||
|
|
||||||
export async function seedPengumuman() {
|
export async function seedPengumuman() {
|
||||||
console.log("🔄 Seeding Kategori Pengumuman...");
|
console.log("🔄 Seeding Kategori Pengumuman...");
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import kategoriPotensi from "../../../data/desa/potensi/kategori-potensi.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
import potensiDesa from "../../../data/desa/potensi/potensi-desa.json";
|
|
||||||
|
const kategoriPotensi = loadJsonData("desa/potensi/kategori-potensi.json");
|
||||||
|
const potensiDesa = loadJsonData("desa/potensi/potensi-desa.json");
|
||||||
|
|
||||||
export async function seedPotensi() {
|
export async function seedPotensi() {
|
||||||
console.log("🔄Seeding Kategori Potensi Desa ...");
|
console.log("🔄Seeding Kategori Potensi Desa ...");
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import lambangDesa from "../../../data/desa/profile/lambang_desa.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
import maskotDesa from "../../../data/desa/profile/maskot_desa.json";
|
|
||||||
import profilePerbekel from "../../../data/desa/profile/profil_perbekel.json";
|
const lambangDesa = loadJsonData("desa/profile/lambang_desa.json");
|
||||||
import profileDesaImage from "../../../data/desa/profile/profileDesaImage.json";
|
const maskotDesa = loadJsonData("desa/profile/maskot_desa.json");
|
||||||
import sejarahDesa from "../../../data/desa/profile/sejarah_desa.json";
|
const profilePerbekel = loadJsonData("desa/profile/profil_perbekel.json");
|
||||||
import visiMisiDesa from "../../../data/desa/profile/visi_misi_desa.json";
|
const profileDesaImage = loadJsonData("desa/profile/profileDesaImage.json");
|
||||||
|
const sejarahDesa = loadJsonData("desa/profile/sejarah_desa.json");
|
||||||
|
const visiMisiDesa = loadJsonData("desa/profile/visi_misi_desa.json");
|
||||||
|
|
||||||
export async function seedProfileDesa() {
|
export async function seedProfileDesa() {
|
||||||
// =========== SEJARAH DESA ===========
|
// =========== SEJARAH DESA ===========
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import perbekelDariMasaKeMasa from "../../../data/desa/profile/profile-perbekel-lalu.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const perbekelDariMasaKeMasa = loadJsonData("desa/profile/profile-perbekel-lalu.json");
|
||||||
|
|
||||||
export async function seedProfilePerbekel() {
|
export async function seedProfilePerbekel() {
|
||||||
console.log("🔄 Seeding Perbekel Dari Masa Ke Masa...");
|
console.log("🔄 Seeding Perbekel Dari Masa Ke Masa...");
|
||||||
|
|||||||
45
prisma/_seeder_list/ekonomi/seed_apbdes.ts
Normal file
45
prisma/_seeder_list/ekonomi/seed_apbdes.ts
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const apbdesJson = loadJsonData("ekonomi/apbdes/apbdes.json");
|
||||||
|
|
||||||
|
export async function seedAPBDes() {
|
||||||
|
console.log("Seeding APBDes...");
|
||||||
|
|
||||||
|
for (const item of apbdesJson) {
|
||||||
|
let imageId: string | null = null;
|
||||||
|
let fileId: string | null = null;
|
||||||
|
|
||||||
|
if (item.imageName) {
|
||||||
|
const image = await prisma.fileStorage.findUnique({
|
||||||
|
where: { name: item.imageName },
|
||||||
|
select: { id: true },
|
||||||
|
});
|
||||||
|
if (image) imageId = image.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
await prisma.aPBDes.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
tahun: item.tahun,
|
||||||
|
name: item.name,
|
||||||
|
deskripsi: item.deskripsi,
|
||||||
|
jumlah: item.jumlah,
|
||||||
|
imageId,
|
||||||
|
fileId,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
tahun: item.tahun,
|
||||||
|
name: item.name,
|
||||||
|
deskripsi: item.deskripsi,
|
||||||
|
jumlah: item.jumlah,
|
||||||
|
imageId,
|
||||||
|
fileId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` APBDes: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("APBDes seed selesai");
|
||||||
|
}
|
||||||
63
prisma/_seeder_list/ekonomi/seed_apbdes_item.ts
Normal file
63
prisma/_seeder_list/ekonomi/seed_apbdes_item.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const itemsJson = loadJsonData("ekonomi/apbdes/apbdes-items.json");
|
||||||
|
const realisasiJson = loadJsonData("ekonomi/apbdes/realisasi-items.json");
|
||||||
|
|
||||||
|
export async function seedAPBDesItem() {
|
||||||
|
console.log("Seeding APBDes Items...");
|
||||||
|
|
||||||
|
// Seed items first (sorted by level to ensure parents exist)
|
||||||
|
const sortedItems = [...itemsJson].sort((a, b) => a.level - b.level);
|
||||||
|
|
||||||
|
for (const item of sortedItems) {
|
||||||
|
await prisma.aPBDesItem.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
kode: item.kode,
|
||||||
|
uraian: item.uraian,
|
||||||
|
anggaran: item.anggaran,
|
||||||
|
tipe: item.tipe,
|
||||||
|
level: item.level,
|
||||||
|
parentId: item.parentId,
|
||||||
|
apbdesId: item.apbdesId,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
kode: item.kode,
|
||||||
|
uraian: item.uraian,
|
||||||
|
anggaran: item.anggaran,
|
||||||
|
tipe: item.tipe,
|
||||||
|
level: item.level,
|
||||||
|
parentId: item.parentId,
|
||||||
|
apbdesId: item.apbdesId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` APBDes Item: ${item.kode} - ${item.uraian}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Realisasi Items...");
|
||||||
|
for (const item of realisasiJson) {
|
||||||
|
await prisma.realisasiItem.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
kode: item.kode,
|
||||||
|
apbdesItemId: item.apbdesItemId,
|
||||||
|
jumlah: item.jumlah,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
keterangan: item.keterangan,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
kode: item.kode,
|
||||||
|
apbdesItemId: item.apbdesItemId,
|
||||||
|
jumlah: item.jumlah,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
keterangan: item.keterangan,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Realisasi: ${item.kode} - Rp ${item.jumlah.toLocaleString("id-ID")}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("APBDes Item & Realisasi seed selesai");
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import demografiPekerjaan from "../../data/ekonomi/demografi-pekerjaan/demografi-pekerjaan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const demografiPekerjaan = loadJsonData("ekonomi/demografi-pekerjaan/demografi-pekerjaan.json");
|
||||||
|
|
||||||
export async function seedDemografiPekerjaan() {
|
export async function seedDemografiPekerjaan() {
|
||||||
console.log("🔄 Seeding Demografi Pekerjaan...");
|
console.log("🔄 Seeding Demografi Pekerjaan...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import jumlahPendudukMiskin from "../../data/ekonomi/jumlah-penduduk-miskin/jumlah-penduduk-miskin.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const jumlahPendudukMiskin = loadJsonData("ekonomi/jumlah-penduduk-miskin/jumlah-penduduk-miskin.json");
|
||||||
|
|
||||||
export async function seedJumlahPendudukMiskin() {
|
export async function seedJumlahPendudukMiskin() {
|
||||||
console.log("🔄 Seeding Jumlah Penduduk Miskin...");
|
console.log("🔄 Seeding Jumlah Penduduk Miskin...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import jumlahPengangguran from "../../data/ekonomi/jumlah-pengangguran/detail-data-pengangguran.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const jumlahPengangguran = loadJsonData("ekonomi/jumlah-pengangguran/detail-data-pengangguran.json");
|
||||||
|
|
||||||
export async function seedJumlahPengangguran() {
|
export async function seedJumlahPengangguran() {
|
||||||
for (const d of jumlahPengangguran) {
|
for (const d of jumlahPengangguran) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import lowonganKerjaLokal from "../../data/ekonomi/lowongan-kerja-lokal/lowongan-kerja-lokal.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const lowonganKerjaLokal = loadJsonData("ekonomi/lowongan-kerja-lokal/lowongan-kerja-lokal.json");
|
||||||
|
|
||||||
export async function seedLowonganKerjaLokal() {
|
export async function seedLowonganKerjaLokal() {
|
||||||
console.log("🔄 Seeding Lowongan Kerja Lokal...");
|
console.log("🔄 Seeding Lowongan Kerja Lokal...");
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import kategoriProduk from "../../data/ekonomi/pasar-desa/kategori-produk.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import pasarDesa from "../../data/ekonomi/pasar-desa/pasar-desa.json";
|
|
||||||
import kategoriToPasar from "../../data/ekonomi/pasar-desa/kategori-to-pasar.json";
|
const kategoriProduk = loadJsonData("ekonomi/pasar-desa/kategori-produk.json");
|
||||||
|
const pasarDesa = loadJsonData("ekonomi/pasar-desa/pasar-desa.json");
|
||||||
|
const kategoriToPasar = loadJsonData("ekonomi/pasar-desa/kategori-to-pasar.json");
|
||||||
|
|
||||||
export async function seedPasarDesa() {
|
export async function seedPasarDesa() {
|
||||||
console.log("🔄 Seeding Kategori Produk...");
|
console.log("🔄 Seeding Kategori Produk...");
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import apbdes from "../../data/ekonomi/pendapatan-asli-desa/apbDesa.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import pendapatan from "../../data/ekonomi/pendapatan-asli-desa/pendapatanDesa.json";
|
|
||||||
import belanja from "../../data/ekonomi/pendapatan-asli-desa/belanjaDesa.json";
|
const apbdes = loadJsonData("ekonomi/pendapatan-asli-desa/apbDesa.json");
|
||||||
import pembiayaan from "../../data/ekonomi/pendapatan-asli-desa/pembiayaanDesa.json";
|
const pendapatan = loadJsonData("ekonomi/pendapatan-asli-desa/pendapatanDesa.json");
|
||||||
|
const belanja = loadJsonData("ekonomi/pendapatan-asli-desa/belanjaDesa.json");
|
||||||
|
const pembiayaan = loadJsonData("ekonomi/pendapatan-asli-desa/pembiayaanDesa.json");
|
||||||
|
|
||||||
export async function seedPendapatanAsli() {
|
export async function seedPendapatanAsli() {
|
||||||
console.log("🔄 Seeding Pendapatan Asli...");
|
console.log("🔄 Seeding Pendapatan Asli...");
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import grafikMenganggurBerdasarkanUsia from "../../data/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran-berdasarkan-usia.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import grafikMenganggurBerdasarkanPendidikan from "../../data/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran-berdasarkan-pendidikan.json";
|
|
||||||
|
const grafikMenganggurBerdasarkanUsia = loadJsonData("ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran-berdasarkan-usia.json");
|
||||||
|
const grafikMenganggurBerdasarkanPendidikan = loadJsonData("ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran-berdasarkan-pendidikan.json");
|
||||||
|
|
||||||
export async function seedPendudukUsiaKerjaYangMenganggur() {
|
export async function seedPendudukUsiaKerjaYangMenganggur() {
|
||||||
for (const p of grafikMenganggurBerdasarkanUsia) {
|
for (const p of grafikMenganggurBerdasarkanUsia) {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import programKemiskinan from "../../data/ekonomi/program-kemiskinan/program-kemiskinan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import statistikKemiskinan from "../../data/ekonomi/program-kemiskinan/statistik-kemiskinan.json";
|
|
||||||
|
const programKemiskinan = loadJsonData("ekonomi/program-kemiskinan/program-kemiskinan.json");
|
||||||
|
const statistikKemiskinan = loadJsonData("ekonomi/program-kemiskinan/statistik-kemiskinan.json");
|
||||||
|
|
||||||
export async function seedProgramKemiskinan() {
|
export async function seedProgramKemiskinan() {
|
||||||
for (const s of statistikKemiskinan) {
|
for (const s of statistikKemiskinan) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import sektorUnggulanDesa from "../../data/ekonomi/sektor-unggulan/sektor-unggulan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const sektorUnggulanDesa = loadJsonData("ekonomi/sektor-unggulan/sektor-unggulan.json");
|
||||||
|
|
||||||
export async function seedSektorUnggulanDesa() {
|
export async function seedSektorUnggulanDesa() {
|
||||||
console.log("🔄 Seeding Sektor Unggulan Desa...");
|
console.log("🔄 Seeding Sektor Unggulan Desa...");
|
||||||
|
|||||||
@@ -1,6 +1,28 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import posisiOrganisasiBumDes from "../../data/ekonomi/struktur-organisasi/posisi-organisasi-bumdes.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import pegawai from "../../data/ekonomi/struktur-organisasi/pegawai-bumdes.json";
|
|
||||||
|
interface PosisiOrganisasi {
|
||||||
|
id: string;
|
||||||
|
nama: string;
|
||||||
|
deskripsi: string;
|
||||||
|
hierarki: number;
|
||||||
|
parentId: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PegawaiBumDes {
|
||||||
|
id: string;
|
||||||
|
namaLengkap: string;
|
||||||
|
gelarAkademik: string;
|
||||||
|
tanggalMasuk: string;
|
||||||
|
email: string;
|
||||||
|
telepon: string;
|
||||||
|
alamat: string;
|
||||||
|
posisiId: string;
|
||||||
|
isActive: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const posisiOrganisasiBumDes = loadJsonData<PosisiOrganisasi[][]>("ekonomi/struktur-organisasi/posisi-organisasi-bumdes.json");
|
||||||
|
const pegawai = loadJsonData<PegawaiBumDes[]>("ekonomi/struktur-organisasi/pegawai-bumdes.json");
|
||||||
|
|
||||||
export async function seedStrukturBumdes() {
|
export async function seedStrukturBumdes() {
|
||||||
const flattenedPosisi = posisiOrganisasiBumDes.flat();
|
const flattenedPosisi = posisiOrganisasiBumDes.flat();
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import ajukanIde from "../../data/inovasi/ajukan-ide/ajukan-ide.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const ajukanIde = loadJsonData("inovasi/ajukan-ide/ajukan-ide.json");
|
||||||
|
|
||||||
export async function seedAjukan() {
|
export async function seedAjukan() {
|
||||||
console.log("🔄 Seeding Ajukan Ide Inovatif...");
|
console.log("🔄 Seeding Ajukan Ide Inovatif...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import desaDigital from "../../data/inovasi/desa-digital/desa-digital.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const desaDigital = loadJsonData("inovasi/desa-digital/desa-digital.json");
|
||||||
|
|
||||||
export async function seedDesaDigital() {
|
export async function seedDesaDigital() {
|
||||||
console.log("🔄 Seeding Desa Digital...");
|
console.log("🔄 Seeding Desa Digital...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import infoTeknologi from "../../data/inovasi/info-teknologi/info-teknologi.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const infoTeknologi = loadJsonData("inovasi/info-teknologi/info-teknologi.json");
|
||||||
|
|
||||||
export async function seedInfoTeknologi() {
|
export async function seedInfoTeknologi() {
|
||||||
console.log("🔄 Seeding Info Teknologi...");
|
console.log("🔄 Seeding Info Teknologi...");
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import kolaborasiInovasi from "../../data/inovasi/kolaborasi-inovasi/kolaborasi-inovasi.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import mitraKolaborasi from "../../data/inovasi/kolaborasi-inovasi/mitra-kolaborasi.json";
|
|
||||||
|
const kolaborasiInovasi = loadJsonData("inovasi/kolaborasi-inovasi/kolaborasi-inovasi.json");
|
||||||
|
const mitraKolaborasi = loadJsonData("inovasi/kolaborasi-inovasi/mitra-kolaborasi.json");
|
||||||
|
|
||||||
export async function seedKolaborasiInovasi() {
|
export async function seedKolaborasiInovasi() {
|
||||||
console.log("🔄 Seeding Kolaborasi Inovasi...");
|
console.log("🔄 Seeding Kolaborasi Inovasi...");
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import jenisLayanan from "../../data/inovasi/layanan-online-desa/jenis-layanan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import administrasiOnline from "../../data/inovasi/layanan-online-desa/administrasi-online.json";
|
|
||||||
import jenisPengaduan from "../../data/inovasi/layanan-online-desa/jenis-pengaduan.json";
|
const jenisLayanan = loadJsonData("inovasi/layanan-online-desa/jenis-layanan.json");
|
||||||
import pengaduanMasyarakat from "../../data/inovasi/layanan-online-desa/pengaduan-masyarakat.json";
|
const administrasiOnline = loadJsonData("inovasi/layanan-online-desa/administrasi-online.json");
|
||||||
|
const jenisPengaduan = loadJsonData("inovasi/layanan-online-desa/jenis-pengaduan.json");
|
||||||
|
const pengaduanMasyarakat = loadJsonData("inovasi/layanan-online-desa/pengaduan-masyarakat.json");
|
||||||
|
|
||||||
export async function seedLayananOnlineDesa() {
|
export async function seedLayananOnlineDesa() {
|
||||||
console.log("🔄 Seeding Jenis Layanan...");
|
console.log("🔄 Seeding Jenis Layanan...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import programKreatif from "../../data/inovasi/program-kreatif-desa/program-kreatif-desa.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const programKreatif = loadJsonData("inovasi/program-kreatif-desa/program-kreatif-desa.json");
|
||||||
|
|
||||||
export async function seedProgramKreatifDesa() {
|
export async function seedProgramKreatifDesa() {
|
||||||
console.log("🔄 Seeding Program Kreatif...");
|
console.log("🔄 Seeding Program Kreatif...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import keamananLingkunganJson from "../../data/keamanan/keamanan-lingkungan/keamanan-lingkungan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const keamananLingkunganJson = loadJsonData("keamanan/keamanan-lingkungan/keamanan-lingkungan.json");
|
||||||
|
|
||||||
export async function seedKeamananLingkungan() {
|
export async function seedKeamananLingkungan() {
|
||||||
console.log("🔄 Seeding Keamanan Lingkungan...");
|
console.log("🔄 Seeding Keamanan Lingkungan...");
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import kontakDaruratKeamanan from "../../data/keamanan/kontak-darurat-keamanan/kontak-darurat-keamanan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import kontakItem from "../../data/keamanan/kontak-darurat-keamanan/kontakItem.json";
|
|
||||||
import kontakDaruratToItem from "../../data/keamanan/kontak-darurat-keamanan/kontakDaruratToItem.json";
|
const kontakDaruratKeamanan = loadJsonData("keamanan/kontak-darurat-keamanan/kontak-darurat-keamanan.json");
|
||||||
|
const kontakItem = loadJsonData("keamanan/kontak-darurat-keamanan/kontakItem.json");
|
||||||
|
const kontakDaruratToItem = loadJsonData("keamanan/kontak-darurat-keamanan/kontakDaruratToItem.json");
|
||||||
|
|
||||||
export async function seedKontakDaruratKeamanan() {
|
export async function seedKontakDaruratKeamanan() {
|
||||||
console.log("🔄 Seeding Kontak Item...");
|
console.log("🔄 Seeding Kontak Item...");
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import laporanPublik from "../../data/keamanan/laporan-publik/laporan-publik.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import penangananLaporan from "../../data/keamanan/laporan-publik/penanganan-laporan.json";
|
|
||||||
|
const laporanPublik = loadJsonData("keamanan/laporan-publik/laporan-publik.json");
|
||||||
|
const penangananLaporan = loadJsonData("keamanan/laporan-publik/penanganan-laporan.json");
|
||||||
|
|
||||||
export async function seedLaporanPublik() {
|
export async function seedLaporanPublik() {
|
||||||
console.log("🔄 Seeding Laporan Publik...");
|
console.log("🔄 Seeding Laporan Publik...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import pencegahanKriminalitas from "../../data/keamanan/pencegahan-kriminalitas/pencegahan-kriminalitas.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const pencegahanKriminalitas = loadJsonData("keamanan/pencegahan-kriminalitas/pencegahan-kriminalitas.json");
|
||||||
|
|
||||||
export async function seedPencegahanKriminalitas() {
|
export async function seedPencegahanKriminalitas() {
|
||||||
console.log("🔄 Seeding Pencegahan Kriminalitas...");
|
console.log("🔄 Seeding Pencegahan Kriminalitas...");
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import layananPolsek from "../../data/keamanan/polsek-terdekat/layanan-polsek.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import polsekTerdekat from "../../data/keamanan/polsek-terdekat/polsek-terdekat.json";
|
|
||||||
import layananToPolsek from "../../data/keamanan/polsek-terdekat/layanan-to-polsek.json";
|
const layananPolsek = loadJsonData("keamanan/polsek-terdekat/layanan-polsek.json");
|
||||||
|
const polsekTerdekat = loadJsonData("keamanan/polsek-terdekat/polsek-terdekat.json");
|
||||||
|
const layananToPolsek = loadJsonData("keamanan/polsek-terdekat/layanan-to-polsek.json");
|
||||||
|
|
||||||
export async function seedPolsekTerdekat() {
|
export async function seedPolsekTerdekat() {
|
||||||
console.log("🔄 Seeding Layanan Polsek...");
|
console.log("🔄 Seeding Layanan Polsek...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import tipsKeamananJson from "../../data/keamanan/tips-keamanan/tips-keamanan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const tipsKeamananJson = loadJsonData("keamanan/tips-keamanan/tips-keamanan.json");
|
||||||
|
|
||||||
export async function seedTipsKeamanan() {
|
export async function seedTipsKeamanan() {
|
||||||
console.log("🔄 Seeding Tips Keamanan...");
|
console.log("🔄 Seeding Tips Keamanan...");
|
||||||
|
|||||||
32
prisma/_seeder_list/kependudukan/seed_data_banjar.ts
Normal file
32
prisma/_seeder_list/kependudukan/seed_data_banjar.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const dataBanjarJson = loadJsonData("kependudukan/data-banjar/data-banjar.json");
|
||||||
|
|
||||||
|
export async function seedDataBanjar() {
|
||||||
|
console.log("Seeding Data Banjar...");
|
||||||
|
|
||||||
|
for (const item of dataBanjarJson) {
|
||||||
|
await prisma.dataBanjar.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
nama: item.nama,
|
||||||
|
penduduk: item.penduduk,
|
||||||
|
kk: item.kk,
|
||||||
|
miskin: item.miskin,
|
||||||
|
tahun: item.tahun,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
nama: item.nama,
|
||||||
|
penduduk: item.penduduk,
|
||||||
|
kk: item.kk,
|
||||||
|
miskin: item.miskin,
|
||||||
|
tahun: item.tahun,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Banjar: ${item.nama} (${item.penduduk} penduduk)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Data Banjar seed selesai");
|
||||||
|
}
|
||||||
32
prisma/_seeder_list/kependudukan/seed_dinamika_penduduk.ts
Normal file
32
prisma/_seeder_list/kependudukan/seed_dinamika_penduduk.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const dinamikaPendudukJson = loadJsonData("kependudukan/dinamika-penduduk/dinamika-penduduk.json");
|
||||||
|
|
||||||
|
export async function seedDinamikaPenduduk() {
|
||||||
|
console.log("Seeding Dinamika Penduduk...");
|
||||||
|
|
||||||
|
for (const item of dinamikaPendudukJson) {
|
||||||
|
await prisma.dinamikaPenduduk.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
tahun: item.tahun,
|
||||||
|
kelahiran: item.kelahiran,
|
||||||
|
kematian: item.kematian,
|
||||||
|
masuk: item.masuk,
|
||||||
|
keluar: item.keluar,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
tahun: item.tahun,
|
||||||
|
kelahiran: item.kelahiran,
|
||||||
|
kematian: item.kematian,
|
||||||
|
masuk: item.masuk,
|
||||||
|
keluar: item.keluar,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Tahun ${item.tahun}: ${item.kelahiran} kelahiran, ${item.kematian} kematian`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Dinamika Penduduk seed selesai");
|
||||||
|
}
|
||||||
28
prisma/_seeder_list/kependudukan/seed_distribusi_agama.ts
Normal file
28
prisma/_seeder_list/kependudukan/seed_distribusi_agama.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const distribusiAgamaJson = loadJsonData("kependudukan/distribusi-agama/distribusi-agama.json");
|
||||||
|
|
||||||
|
export async function seedDistribusiAgama() {
|
||||||
|
console.log("Seeding Distribusi Agama...");
|
||||||
|
|
||||||
|
for (const item of distribusiAgamaJson) {
|
||||||
|
await prisma.distribusiAgama.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
agama: item.agama,
|
||||||
|
jumlah: item.jumlah,
|
||||||
|
tahun: item.tahun,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
agama: item.agama,
|
||||||
|
jumlah: item.jumlah,
|
||||||
|
tahun: item.tahun,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` ${item.agama}: ${item.jumlah} penganut`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Distribusi Agama seed selesai");
|
||||||
|
}
|
||||||
28
prisma/_seeder_list/kependudukan/seed_distribusi_umur.ts
Normal file
28
prisma/_seeder_list/kependudukan/seed_distribusi_umur.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const distribusiUmurJson = loadJsonData("kependudukan/distribusi-umur/distribusi-umur.json");
|
||||||
|
|
||||||
|
export async function seedDistribusiUmur() {
|
||||||
|
console.log("Seeding Distribusi Umur...");
|
||||||
|
|
||||||
|
for (const item of distribusiUmurJson) {
|
||||||
|
await prisma.distribusiUmur.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
rentangUmur: item.rentangUmur,
|
||||||
|
jumlah: item.jumlah,
|
||||||
|
tahun: item.tahun,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
rentangUmur: item.rentangUmur,
|
||||||
|
jumlah: item.jumlah,
|
||||||
|
tahun: item.tahun,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Rentang ${item.rentangUmur}: ${item.jumlah} jiwa`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Distribusi Umur seed selesai");
|
||||||
|
}
|
||||||
34
prisma/_seeder_list/kependudukan/seed_migrasi_penduduk.ts
Normal file
34
prisma/_seeder_list/kependudukan/seed_migrasi_penduduk.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const migrasiPendudukJson = loadJsonData("kependudukan/migrasi-penduduk/migrasi-penduduk.json");
|
||||||
|
|
||||||
|
export async function seedMigrasiPenduduk() {
|
||||||
|
console.log("Seeding MigrASI PENDUDUK...");
|
||||||
|
|
||||||
|
for (const item of migrasiPendudukJson) {
|
||||||
|
await prisma.migrasiPenduduk.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
nama: item.nama,
|
||||||
|
jenis: item.jenis,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
asal: item.asal,
|
||||||
|
tujuan: item.tujuan,
|
||||||
|
alasan: item.alasan,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
nama: item.nama,
|
||||||
|
jenis: item.jenis,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
asal: item.asal,
|
||||||
|
tujuan: item.tujuan,
|
||||||
|
alasan: item.alasan,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` ${item.nama}: ${item.jenis} (${item.alasan})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Migrasi Penduduk seed selesai");
|
||||||
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const artikelJson = loadJsonData("kesehatan/artikel-kesehatan/artikel-kesehatan.json");
|
||||||
|
const introJson = loadJsonData("kesehatan/artikel-kesehatan/introduction.json");
|
||||||
|
const symptomJson = loadJsonData("kesehatan/artikel-kesehatan/symptom.json");
|
||||||
|
const preventionJson = loadJsonData("kesehatan/artikel-kesehatan/prevention.json");
|
||||||
|
const firstAidJson = loadJsonData("kesehatan/artikel-kesehatan/first-aid.json");
|
||||||
|
const mythVsFactJson = loadJsonData("kesehatan/artikel-kesehatan/myth-vs-fact.json");
|
||||||
|
const doctorSignJson = loadJsonData("kesehatan/artikel-kesehatan/doctor-sign.json");
|
||||||
|
|
||||||
|
export async function seedArtikelKesehatan() {
|
||||||
|
console.log("Seeding Introduction...");
|
||||||
|
for (const item of introJson) {
|
||||||
|
await prisma.introduction.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { content: item.content },
|
||||||
|
create: { id: item.id, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Symptom...");
|
||||||
|
for (const item of symptomJson) {
|
||||||
|
await prisma.symptom.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { title: item.title, content: item.content },
|
||||||
|
create: { id: item.id, title: item.title, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Prevention...");
|
||||||
|
for (const item of preventionJson) {
|
||||||
|
await prisma.prevention.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { title: item.title, content: item.content },
|
||||||
|
create: { id: item.id, title: item.title, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding First Aid...");
|
||||||
|
for (const item of firstAidJson) {
|
||||||
|
await prisma.firstAid.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { title: item.title, content: item.content },
|
||||||
|
create: { id: item.id, title: item.title, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Myth vs Fact...");
|
||||||
|
for (const item of mythVsFactJson) {
|
||||||
|
await prisma.mythVsFact.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
title: item.title,
|
||||||
|
mitos: item.mitos,
|
||||||
|
fakta: item.fakta,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
title: item.title,
|
||||||
|
mitos: item.mitos,
|
||||||
|
fakta: item.fakta,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Doctor Sign...");
|
||||||
|
for (const item of doctorSignJson) {
|
||||||
|
await prisma.doctorSign.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { content: item.content },
|
||||||
|
create: { id: item.id, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Artikel Kesehatan...");
|
||||||
|
for (const item of artikelJson) {
|
||||||
|
await prisma.artikelKesehatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
title: item.title,
|
||||||
|
content: item.content,
|
||||||
|
introductionId: item.introductionId,
|
||||||
|
symptomId: item.symptomId,
|
||||||
|
preventionId: item.preventionId,
|
||||||
|
firstAidId: item.firstAidId,
|
||||||
|
mythVsFactId: item.mythVsFactId,
|
||||||
|
doctorSignId: item.doctorSignId,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
title: item.title,
|
||||||
|
content: item.content,
|
||||||
|
introductionId: item.introductionId,
|
||||||
|
symptomId: item.symptomId,
|
||||||
|
preventionId: item.preventionId,
|
||||||
|
firstAidId: item.firstAidId,
|
||||||
|
mythVsFactId: item.mythVsFactId,
|
||||||
|
doctorSignId: item.doctorSignId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Artikel: ${item.title}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Artikel Kesehatan seed selesai");
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const faskesJson = loadJsonData("kesehatan/fasilitas-kesehatan/fasilitas-kesehatan.json");
|
||||||
|
const infoUmumJson = loadJsonData("kesehatan/fasilitas-kesehatan/informasi-umum.json");
|
||||||
|
const layananUnggulanJson = loadJsonData("kesehatan/fasilitas-kesehatan/layanan-unggulan.json");
|
||||||
|
const dokterJson = loadJsonData("kesehatan/fasilitas-kesehatan/dokter-tenaga-medis.json");
|
||||||
|
const fasilitasPendukungJson = loadJsonData("kesehatan/fasilitas-kesehatan/fasilitas-pendukung.json");
|
||||||
|
const prosedurJson = loadJsonData("kesehatan/fasilitas-kesehatan/prosedur-pendaftaran.json");
|
||||||
|
const tarifJson = loadJsonData("kesehatan/fasilitas-kesehatan/tarif-layanan.json");
|
||||||
|
|
||||||
|
export async function seedFasilitasKesehatan() {
|
||||||
|
console.log("Seeding Informasi Umum...");
|
||||||
|
for (const item of infoUmumJson) {
|
||||||
|
await prisma.informasiUmum.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
fasilitas: item.fasilitas,
|
||||||
|
alamat: item.alamat,
|
||||||
|
jamOperasional: item.jamOperasional,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
fasilitas: item.fasilitas,
|
||||||
|
alamat: item.alamat,
|
||||||
|
jamOperasional: item.jamOperasional,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Informasi Umum: ${item.fasilitas}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Layanan Unggulan...");
|
||||||
|
for (const item of layananUnggulanJson) {
|
||||||
|
await prisma.layananUnggulan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { content: item.content },
|
||||||
|
create: { id: item.id, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Fasilitas Pendukung...");
|
||||||
|
for (const item of fasilitasPendukungJson) {
|
||||||
|
await prisma.fasilitasPendukung.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { content: item.content },
|
||||||
|
create: { id: item.id, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Prosedur Pendaftaran...");
|
||||||
|
for (const item of prosedurJson) {
|
||||||
|
await prisma.prosedurPendaftaran.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { content: item.content },
|
||||||
|
create: { id: item.id, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Tarif dan Layanan...");
|
||||||
|
for (const item of tarifJson) {
|
||||||
|
await prisma.tarifDanLayanan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { layanan: item.layanan, tarif: item.tarif },
|
||||||
|
create: { id: item.id, layanan: item.layanan, tarif: item.tarif },
|
||||||
|
});
|
||||||
|
console.log(` Tarif: ${item.layanan}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Dokter dan Tenaga Medis...");
|
||||||
|
for (const item of dokterJson) {
|
||||||
|
await prisma.dokterdanTenagaMedis.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
specialist: item.specialist,
|
||||||
|
jadwal: item.jadwal,
|
||||||
|
jadwalLibur: item.jadwalLibur,
|
||||||
|
jamBukaOperasional: item.jamBukaOperasional,
|
||||||
|
jamTutupOperasional: item.jamTutupOperasional,
|
||||||
|
jamBukaLibur: item.jamBukaLibur,
|
||||||
|
jamTutupLibur: item.jamTutupLibur,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
specialist: item.specialist,
|
||||||
|
jadwal: item.jadwal,
|
||||||
|
jadwalLibur: item.jadwalLibur,
|
||||||
|
jamBukaOperasional: item.jamBukaOperasional,
|
||||||
|
jamTutupOperasional: item.jamTutupOperasional,
|
||||||
|
jamBukaLibur: item.jamBukaLibur,
|
||||||
|
jamTutupLibur: item.jamTutupLibur,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Dokter: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Fasilitas Kesehatan...");
|
||||||
|
for (const item of faskesJson) {
|
||||||
|
await prisma.fasilitasKesehatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
informasiUmumId: item.informasiUmumId,
|
||||||
|
layananUnggulanId: item.layananUnggulanId,
|
||||||
|
fasilitasPendukungId: item.fasilitasPendukungId,
|
||||||
|
prosedurPendaftaranId: item.prosedurPendaftaranId,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
informasiUmumId: item.informasiUmumId,
|
||||||
|
layananUnggulanId: item.layananUnggulanId,
|
||||||
|
fasilitasPendukungId: item.fasilitasPendukungId,
|
||||||
|
prosedurPendaftaranId: item.prosedurPendaftaranId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Fasilitas Kesehatan: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Fasilitas Kesehatan seed selesai");
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import infoWabahPenyakitJson from "../../../data/kesehatan/infowabahpenyakit/infowabahpenyakit.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const infoWabahPenyakitJson = loadJsonData("kesehatan/infowabahpenyakit/infowabahpenyakit.json");
|
||||||
|
|
||||||
export async function seedInfoWabahPenyakit() {
|
export async function seedInfoWabahPenyakit() {
|
||||||
console.log("🔄 Seeding Info Wabah Penyakit...");
|
console.log("🔄 Seeding Info Wabah Penyakit...");
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const jadwalJson = loadJsonData("kesehatan/jadwal-kegiatan/jadwal-kegiatan.json");
|
||||||
|
const infoJadwalJson = loadJsonData("kesehatan/jadwal-kegiatan/informasi-jadwal.json");
|
||||||
|
const deskJadwalJson = loadJsonData("kesehatan/jadwal-kegiatan/deskripsi-jadwal.json");
|
||||||
|
const layananJadwalJson = loadJsonData("kesehatan/jadwal-kegiatan/layanan-jadwal.json");
|
||||||
|
const syaratJadwalJson = loadJsonData("kesehatan/jadwal-kegiatan/syarat-ketentuan.json");
|
||||||
|
const dokumenJadwalJson = loadJsonData("kesehatan/jadwal-kegiatan/dokumen-jadwal.json");
|
||||||
|
const daftarJadwalJson = loadJsonData("kesehatan/jadwal-kegiatan/pendaftaran-jadwal.json");
|
||||||
|
|
||||||
|
export async function seedJadwalKegiatan() {
|
||||||
|
console.log("Seeding Informasi Jadwal Kegiatan...");
|
||||||
|
for (const item of infoJadwalJson) {
|
||||||
|
await prisma.informasiJadwalKegiatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
tanggal: item.tanggal,
|
||||||
|
waktu: item.waktu,
|
||||||
|
lokasi: item.lokasi,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
tanggal: item.tanggal,
|
||||||
|
waktu: item.waktu,
|
||||||
|
lokasi: item.lokasi,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Informasi: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Deskripsi Jadwal Kegiatan...");
|
||||||
|
for (const item of deskJadwalJson) {
|
||||||
|
await prisma.deskripsiJadwalKegiatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { deskripsi: item.deskripsi },
|
||||||
|
create: { id: item.id, deskripsi: item.deskripsi },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Layanan Jadwal Kegiatan...");
|
||||||
|
for (const item of layananJadwalJson) {
|
||||||
|
await prisma.layananJadwalKegiatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { content: item.content },
|
||||||
|
create: { id: item.id, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Syarat & Ketentuan Jadwal...");
|
||||||
|
for (const item of syaratJadwalJson) {
|
||||||
|
await prisma.syaratKetentuanJadwalKegiatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { content: item.content },
|
||||||
|
create: { id: item.id, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Dokumen Jadwal Kegiatan...");
|
||||||
|
for (const item of dokumenJadwalJson) {
|
||||||
|
await prisma.dokumenJadwalKegiatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: { content: item.content },
|
||||||
|
create: { id: item.id, content: item.content },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Pendaftaran Jadwal Kegiatan...");
|
||||||
|
for (const item of daftarJadwalJson) {
|
||||||
|
await prisma.pendaftaranJadwalKegiatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
tanggal: item.tanggal,
|
||||||
|
namaOrangtua: item.namaOrtu,
|
||||||
|
nomor: item.nomor,
|
||||||
|
alamat: item.alamat,
|
||||||
|
catatan: item.catatan,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
tanggal: item.tanggal,
|
||||||
|
namaOrangtua: item.namaOrtu,
|
||||||
|
nomor: item.nomor,
|
||||||
|
alamat: item.alamat,
|
||||||
|
catatan: item.catatan,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Pendaftaran: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Jadwal Kegiatan...");
|
||||||
|
for (const item of jadwalJson) {
|
||||||
|
await prisma.jadwalKegiatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
content: item.content,
|
||||||
|
informasiJadwalKegiatanId: item.informasiJadwalKegiatanId,
|
||||||
|
deskripsiJadwalKegiatanId: item.deskripsiJadwalKegiatanId,
|
||||||
|
layananJadwalKegiatanId: item.layananJadwalKegiatanId,
|
||||||
|
syaratKetentuanJadwalKegiatanId: item.syaratKetentuanJadwalKegiatanId,
|
||||||
|
dokumenJadwalKegiatanId: item.dokumenJadwalKegiatanId,
|
||||||
|
pendaftaranJadwalKegiatanId: item.pendaftaranJadwalKegiatanId,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
content: item.content,
|
||||||
|
informasiJadwalKegiatanId: item.informasiJadwalKegiatanId,
|
||||||
|
deskripsiJadwalKegiatanId: item.deskripsiJadwalKegiatanId,
|
||||||
|
layananJadwalKegiatanId: item.layananJadwalKegiatanId,
|
||||||
|
syaratKetentuanJadwalKegiatanId: item.syaratKetentuanJadwalKegiatanId,
|
||||||
|
dokumenJadwalKegiatanId: item.dokumenJadwalKegiatanId,
|
||||||
|
pendaftaranJadwalKegiatanId: item.pendaftaranJadwalKegiatanId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Jadwal Kegiatan seeded`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Jadwal Kegiatan seed selesai");
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import kontakDaruratJson from "../../../data/kesehatan/kontak-darurat/kontak-darurat.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
|
|
||||||
|
const kontakDaruratJson = loadJsonData("kesehatan/kontak-darurat/kontak-darurat.json");
|
||||||
|
|
||||||
export async function seedKontakDarurat() {
|
export async function seedKontakDarurat() {
|
||||||
console.log("🔄 Seeding Kontak Darurat...");
|
console.log("🔄 Seeding Kontak Darurat...");
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import penangananDaruratJson from "../../../data/kesehatan/penanganan-darurat/penganan-darurat.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const penangananDaruratJson = loadJsonData("kesehatan/penanganan-darurat/penganan-darurat.json");
|
||||||
|
|
||||||
export async function seedPenangananDarurat() {
|
export async function seedPenangananDarurat() {
|
||||||
console.log("🔄 Seeding Penanganan Darurat...");
|
console.log("🔄 Seeding Penanganan Darurat...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import posyanduJson from "../../../data/kesehatan/posyandu/posyandu.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const posyanduJson = loadJsonData("kesehatan/posyandu/posyandu.json");
|
||||||
|
|
||||||
export async function seedPosyandu() {
|
export async function seedPosyandu() {
|
||||||
console.log("🔄 Seeding Posyandu...");
|
console.log("🔄 Seeding Posyandu...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import programKesehatanJson from "../../../data/kesehatan/program-kesehatan/program-kesehatan.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const programKesehatanJson = loadJsonData("kesehatan/program-kesehatan/program-kesehatan.json");
|
||||||
|
|
||||||
export async function seedProgramKesehatan() {
|
export async function seedProgramKesehatan() {
|
||||||
for (const p of programKesehatanJson) {
|
for (const p of programKesehatanJson) {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import puskesmasJson from "../../../data/kesehatan/puskesmas/puskesmas.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
import kontakPuskesmasJson from "../../../data/kesehatan/puskesmas/kontak-puskesmas/kontak.json";
|
|
||||||
import jamPuskesmasJson from "../../../data/kesehatan/puskesmas/jam-puskesmas/jam.json";
|
const puskesmasJson = loadJsonData("kesehatan/puskesmas/puskesmas.json");
|
||||||
|
const kontakPuskesmasJson = loadJsonData("kesehatan/puskesmas/kontak-puskesmas/kontak.json");
|
||||||
|
const jamPuskesmasJson = loadJsonData("kesehatan/puskesmas/jam-puskesmas/jam.json");
|
||||||
|
|
||||||
export async function seedPuskesmas() {
|
export async function seedPuskesmas() {
|
||||||
console.log("🔄 Seeding Kontak Puskesmas...");
|
console.log("🔄 Seeding Kontak Puskesmas...");
|
||||||
|
|||||||
32
prisma/_seeder_list/kesehatan/seed_grafik_kepuasan.ts
Normal file
32
prisma/_seeder_list/kesehatan/seed_grafik_kepuasan.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const grafikKepuasanJson = loadJsonData("kesehatan/grafik-kepuasan/grafik-kepuasan.json");
|
||||||
|
|
||||||
|
export async function seedGrafikKepuasan() {
|
||||||
|
console.log("Seeding Grafik Kepuasan...");
|
||||||
|
|
||||||
|
for (const item of grafikKepuasanJson) {
|
||||||
|
await prisma.grafikKepuasan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
nama: item.nama,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
jenisKelamin: item.jenisKelamin,
|
||||||
|
alamat: item.alamat,
|
||||||
|
penyakit: item.penyakit,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
nama: item.nama,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
jenisKelamin: item.jenisKelamin,
|
||||||
|
alamat: item.alamat,
|
||||||
|
penyakit: item.penyakit,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Grafik Kepuasan: ${item.nama}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Grafik Kepuasan seed selesai");
|
||||||
|
}
|
||||||
70
prisma/_seeder_list/kesehatan/seed_kelahiran_kematian.ts
Normal file
70
prisma/_seeder_list/kesehatan/seed_kelahiran_kematian.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const kelahiranJson = loadJsonData("kesehatan/kelahiran/kelahiran.json");
|
||||||
|
const kematianJson = loadJsonData("kesehatan/kematian/kematian.json");
|
||||||
|
const dataKematianKelahiranJson = loadJsonData("kesehatan/kematian-kelahiran/data-kematian-kelahiran.json");
|
||||||
|
|
||||||
|
export async function seedKelahiranKematian() {
|
||||||
|
console.log("Seeding Kelahiran...");
|
||||||
|
for (const item of kelahiranJson) {
|
||||||
|
await prisma.kelahiran.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
nama: item.nama,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
jenisKelamin: item.jenisKelamin,
|
||||||
|
alamat: item.alamat,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
nama: item.nama,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
jenisKelamin: item.jenisKelamin,
|
||||||
|
alamat: item.alamat,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Kelahiran: ${item.nama}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Kematian...");
|
||||||
|
for (const item of kematianJson) {
|
||||||
|
await prisma.kematian.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
nama: item.nama,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
jenisKelamin: item.jenisKelamin,
|
||||||
|
alamat: item.alamat,
|
||||||
|
penyebab: item.penyebab,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
nama: item.nama,
|
||||||
|
tanggal: new Date(item.tanggal),
|
||||||
|
jenisKelamin: item.jenisKelamin,
|
||||||
|
alamat: item.alamat,
|
||||||
|
penyebab: item.penyebab,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Kematian: ${item.nama}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Seeding Data Kematian-Kelahiran...");
|
||||||
|
for (const item of dataKematianKelahiranJson) {
|
||||||
|
await prisma.dataKematian_Kelahiran.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
kematianId: item.kematianId,
|
||||||
|
kelahiranId: item.kelahiranId,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
kematianId: item.kematianId,
|
||||||
|
kelahiranId: item.kelahiranId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Kelahiran & Kematian seed selesai");
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import kategoriDesaAntiKorupsi from "../../../data/landing-page/desa-anti-korupsi/kategoriDesaAntiKorupsi.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
import desaAntiKorupsi from "../../../data/landing-page/desa-anti-korupsi/desaantiKorpusi.json"
|
|
||||||
|
const kategoriDesaAntiKorupsi = loadJsonData("landing-page/desa-anti-korupsi/kategoriDesaAntiKorupsi.json");
|
||||||
|
const desaAntiKorupsi = loadJsonData("landing-page/desa-anti-korupsi/desaantiKorpusi.json");
|
||||||
|
|
||||||
export async function seedDesaAntiKorupsi() {
|
export async function seedDesaAntiKorupsi() {
|
||||||
for (const k of kategoriDesaAntiKorupsi) {
|
for (const k of kategoriDesaAntiKorupsi) {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import prestasiDesa from "../../../data/landing-page/prestasi-desa/prestasi-desa.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
import kategoriPrestasiDesa from "../../../data/landing-page/prestasi-desa/kategori-prestasi.json"
|
|
||||||
|
const prestasiDesa = loadJsonData("landing-page/prestasi-desa/prestasi-desa.json");
|
||||||
|
const kategoriPrestasiDesa = loadJsonData("landing-page/prestasi-desa/kategori-prestasi.json");
|
||||||
|
|
||||||
export async function seedPrestasiDesa() {
|
export async function seedPrestasiDesa() {
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import mediaSosial from "../../../data/landing-page/profile/mediaSosial.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const mediaSosial = loadJsonData("landing-page/profile/mediaSosial.json");
|
||||||
|
|
||||||
export async function seedMediaSosial() {
|
export async function seedMediaSosial() {
|
||||||
console.log("🔄 Seeding Media Sosial...");
|
console.log("🔄 Seeding Media Sosial...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import profilePejabatDesa from "../../../data/landing-page/profile/profile.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const profilePejabatDesa = loadJsonData("landing-page/profile/profile.json");
|
||||||
|
|
||||||
export async function seedProfileLP() {
|
export async function seedProfileLP() {
|
||||||
console.log("🔄 Seeding Pejabat Desa...");
|
console.log("🔄 Seeding Pejabat Desa...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import programInovasi from "../../../data/landing-page/profile/programInovasi.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const programInovasi = loadJsonData("landing-page/profile/programInovasi.json");
|
||||||
|
|
||||||
export async function seedProgramInovasi() {
|
export async function seedProgramInovasi() {
|
||||||
console.log("🔄 Seeding Program Inovasi...");
|
console.log("🔄 Seeding Program Inovasi...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import sdgsDesa from "../../../data/landing-page/sdgs-desa/sdgs-desa.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const sdgsDesa = loadJsonData("landing-page/sdgs-desa/sdgs-desa.json");
|
||||||
|
|
||||||
export async function seedSDGSDesa() {
|
export async function seedSDGSDesa() {
|
||||||
console.log("🔄 Seeding SDGS Desa...");
|
console.log("🔄 Seeding SDGS Desa...");
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import kategoriGotongRoyong from "../../data/lingkungan/gotong-royong/kategori-gotong-royong.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import gotongRoyong from "../../data/lingkungan/gotong-royong/gotong-royong.json";
|
|
||||||
|
const kategoriGotongRoyong = loadJsonData("lingkungan/gotong-royong/kategori-gotong-royong.json");
|
||||||
|
const gotongRoyong = loadJsonData("lingkungan/gotong-royong/gotong-royong.json");
|
||||||
|
|
||||||
export async function seedDataGotongRoyong() {
|
export async function seedDataGotongRoyong() {
|
||||||
console.log("🔄 Seeding Kategori Gotong Royong...");
|
console.log("🔄 Seeding Kategori Gotong Royong...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import dataLingkunganDesa from "../../data/lingkungan/data-lingkungan-desa/data-lingkungan-desa.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const dataLingkunganDesa = loadJsonData("lingkungan/data-lingkungan-desa/data-lingkungan-desa.json");
|
||||||
|
|
||||||
export async function seedDataLingkunganDesa() {
|
export async function seedDataLingkunganDesa() {
|
||||||
console.log("🔄 Seeding Data Lingkungan Desa...");
|
console.log("🔄 Seeding Data Lingkungan Desa...");
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import tujuanEdukasiLingkungan from "../../data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import materiEdukasiLingkungan from "../../data/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json";
|
|
||||||
import contohEdukasiLingkungan from "../../data/lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json";
|
const tujuanEdukasiLingkungan = loadJsonData("lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json");
|
||||||
|
const materiEdukasiLingkungan = loadJsonData("lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json");
|
||||||
|
const contohEdukasiLingkungan = loadJsonData("lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json");
|
||||||
|
|
||||||
export async function seedEdukasiLingkungan() {
|
export async function seedEdukasiLingkungan() {
|
||||||
for (const e of tujuanEdukasiLingkungan) {
|
for (const e of tujuanEdukasiLingkungan) {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import filosofiTriHita from "../../data/lingkungan/konservasi-adat-bali/filosofi-tri-hita.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import bentukKonservasiBerdasarkanAdat from "../../data/lingkungan/konservasi-adat-bali/bentuk-konservasi.json";
|
|
||||||
import nilaiKonservasiAdat from "../../data/lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json";
|
const filosofiTriHita = loadJsonData("lingkungan/konservasi-adat-bali/filosofi-tri-hita.json");
|
||||||
|
const bentukKonservasiBerdasarkanAdat = loadJsonData("lingkungan/konservasi-adat-bali/bentuk-konservasi.json");
|
||||||
|
const nilaiKonservasiAdat = loadJsonData("lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json");
|
||||||
|
|
||||||
export async function seedKonservasiAdatBali() {
|
export async function seedKonservasiAdatBali() {
|
||||||
for (const f of filosofiTriHita) {
|
for (const f of filosofiTriHita) {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import pengelolaanSampah from "../../data/lingkungan/pengelolaan-sampah/pengelolaan-sampah.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import keteranganBankSampah from "../../data/lingkungan/pengelolaan-sampah/keterangan-bank-sampah.json";
|
|
||||||
|
const pengelolaanSampah = loadJsonData("lingkungan/pengelolaan-sampah/pengelolaan-sampah.json");
|
||||||
|
const keteranganBankSampah = loadJsonData("lingkungan/pengelolaan-sampah/keterangan-bank-sampah.json");
|
||||||
|
|
||||||
export async function seedPengelolaanSampah() {
|
export async function seedPengelolaanSampah() {
|
||||||
console.log("🔄 Seeding Pengelolaan Sampah...");
|
console.log("🔄 Seeding Pengelolaan Sampah...");
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import programPenghijauan from "../../data/lingkungan/program-penghijauan/program-penghijauan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const programPenghijauan = loadJsonData("lingkungan/program-penghijauan/program-penghijauan.json");
|
||||||
|
|
||||||
export async function seedProgramPenghijauan() {
|
export async function seedProgramPenghijauan() {
|
||||||
console.log("🔄 Seeding Program Penghijauan...");
|
console.log("🔄 Seeding Program Penghijauan...");
|
||||||
|
|||||||
58
prisma/_seeder_list/pendidikan/seed_beasiswa_pendaftar.ts
Normal file
58
prisma/_seeder_list/pendidikan/seed_beasiswa_pendaftar.ts
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const beasiswaJson = loadJsonData("pendidikan/beasiswa-pendaftar/beasiswa-pendaftar.json");
|
||||||
|
|
||||||
|
export async function seedBeasiswaPendaftar() {
|
||||||
|
console.log("Seeding Beasiswa Pendaftar...");
|
||||||
|
|
||||||
|
for (const item of beasiswaJson) {
|
||||||
|
await prisma.beasiswaPendaftar.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
namaLengkap: item.namaLengkap,
|
||||||
|
nis: item.nis,
|
||||||
|
kelas: item.kelas,
|
||||||
|
jenisKelamin: item.jenisKelamin,
|
||||||
|
alamatDomisili: item.alamatDomisili,
|
||||||
|
tempatLahir: item.tempatLahir,
|
||||||
|
tanggalLahir: new Date(item.tanggalLahir),
|
||||||
|
namaOrtu: item.namaOrtu,
|
||||||
|
nik: item.nik,
|
||||||
|
pekerjaanOrtu: item.pekerjaanOrtu,
|
||||||
|
penghasilan: item.penghasilan,
|
||||||
|
noHp: item.noHp,
|
||||||
|
kewarganegaraan: item.kewarganegaraan,
|
||||||
|
agama: item.agama,
|
||||||
|
alamatKTP: item.alamatKTP,
|
||||||
|
email: item.email,
|
||||||
|
statusPernikahan: item.statusPernikahan,
|
||||||
|
ukuranBaju: item.ukuranBaju,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
namaLengkap: item.namaLengkap,
|
||||||
|
nis: item.nis,
|
||||||
|
kelas: item.kelas,
|
||||||
|
jenisKelamin: item.jenisKelamin,
|
||||||
|
alamatDomisili: item.alamatDomisili,
|
||||||
|
tempatLahir: item.tempatLahir,
|
||||||
|
tanggalLahir: new Date(item.tanggalLahir),
|
||||||
|
namaOrtu: item.namaOrtu,
|
||||||
|
nik: item.nik,
|
||||||
|
pekerjaanOrtu: item.pekerjaanOrtu,
|
||||||
|
penghasilan: item.penghasilan,
|
||||||
|
noHp: item.noHp,
|
||||||
|
kewarganegaraan: item.kewarganegaraan,
|
||||||
|
agama: item.agama,
|
||||||
|
alamatKTP: item.alamatKTP,
|
||||||
|
email: item.email,
|
||||||
|
statusPernikahan: item.statusPernikahan,
|
||||||
|
ukuranBaju: item.ukuranBaju,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Beasiswa: ${item.namaLengkap} (NIS: ${item.nis})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Beasiswa Pendaftar seed selesai");
|
||||||
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import tujuanBimbinganBelajarDesa from "../../data/pendidikan/bimbingan-belajar-desa/tujuan-bimbingan-belajar-desa.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import lokasiJadwalBimbinganBelajarDesa from "../../data/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal.json";
|
|
||||||
import fasilitasBimbinganBelajarDesa from "../../data/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan.json";
|
const tujuanBimbinganBelajarDesa = loadJsonData("pendidikan/bimbingan-belajar-desa/tujuan-bimbingan-belajar-desa.json");
|
||||||
|
const lokasiJadwalBimbinganBelajarDesa = loadJsonData("pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal.json");
|
||||||
|
const fasilitasBimbinganBelajarDesa = loadJsonData("pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan.json");
|
||||||
|
|
||||||
export async function seedBimbinganBelajar() {
|
export async function seedBimbinganBelajar() {
|
||||||
for (const t of tujuanBimbinganBelajarDesa) {
|
for (const t of tujuanBimbinganBelajarDesa) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import dataPendidikan from "../../data/pendidikan/data-pendidikan/data-pendidikan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const dataPendidikan = loadJsonData("pendidikan/data-pendidikan/data-pendidikan.json");
|
||||||
|
|
||||||
export async function seedDataPendidikan() {
|
export async function seedDataPendidikan() {
|
||||||
console.log("🔄 Seeding Data pendidikan...");
|
console.log("🔄 Seeding Data pendidikan...");
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import dataPerpustakaan from "../../data/pendidikan/perpustakaan-digital/perpustakaan-digital.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import kategoriBuku from "../../data/pendidikan/perpustakaan-digital/kategori-buku.json";
|
|
||||||
|
const dataPerpustakaan = loadJsonData("pendidikan/perpustakaan-digital/perpustakaan-digital.json");
|
||||||
|
const kategoriBuku = loadJsonData("pendidikan/perpustakaan-digital/kategori-buku.json");
|
||||||
|
|
||||||
export async function seedDataPerpustakaan() {
|
export async function seedDataPerpustakaan() {
|
||||||
console.log("🔄 Seeding Kategori Buku...");
|
console.log("🔄 Seeding Kategori Buku...");
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import tujuanProgram from "../../data/pendidikan/program-pendidikan-anak/tujuan-program.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import programUnggulan from "../../data/pendidikan/program-pendidikan-anak/program-unggulan.json";
|
|
||||||
|
const tujuanProgram = loadJsonData("pendidikan/program-pendidikan-anak/tujuan-program.json");
|
||||||
|
const programUnggulan = loadJsonData("pendidikan/program-pendidikan-anak/program-unggulan.json");
|
||||||
|
|
||||||
export async function seedInfoProgramPendidikan() {
|
export async function seedInfoProgramPendidikan() {
|
||||||
for (const t of tujuanProgram) {
|
for (const t of tujuanProgram) {
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import jenjangPendidikan from "../../data/pendidikan/info-sekolah/jenjang-pendidikan.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import lembagaPendidikan from "../../data/pendidikan/info-sekolah/lembaga.json";
|
|
||||||
import siswa from "../../data/pendidikan/info-sekolah/siswa.json";
|
const jenjangPendidikan = loadJsonData("pendidikan/info-sekolah/jenjang-pendidikan.json");
|
||||||
import pengajar from "../../data/pendidikan/info-sekolah/pengajar.json";
|
const lembagaPendidikan = loadJsonData("pendidikan/info-sekolah/lembaga.json");
|
||||||
|
const siswa = loadJsonData("pendidikan/info-sekolah/siswa.json");
|
||||||
|
const pengajar = loadJsonData("pendidikan/info-sekolah/pengajar.json");
|
||||||
|
|
||||||
export async function seedInfoSekolah() {
|
export async function seedInfoSekolah() {
|
||||||
for (const j of jenjangPendidikan) {
|
for (const j of jenjangPendidikan) {
|
||||||
|
|||||||
32
prisma/_seeder_list/pendidikan/seed_keunggulan_program.ts
Normal file
32
prisma/_seeder_list/pendidikan/seed_keunggulan_program.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { readFileSync } from "fs";
|
||||||
|
import { join } from "path";
|
||||||
|
|
||||||
|
const keunggulanJson = JSON.parse(
|
||||||
|
readFileSync(
|
||||||
|
join(process.cwd(), "prisma/data/pendidikan/keunggulan-program/keunggulan-program.json"),
|
||||||
|
"utf-8"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
export async function seedKeunggulanProgram() {
|
||||||
|
console.log("Seeding Keunggulan Program...");
|
||||||
|
|
||||||
|
for (const item of keunggulanJson) {
|
||||||
|
await prisma.keunggulanProgram.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
judul: item.judul,
|
||||||
|
deskripsi: item.deskripsi,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
judul: item.judul,
|
||||||
|
deskripsi: item.deskripsi,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log(` Keunggulan: ${item.judul}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Keunggulan Program seed selesai");
|
||||||
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import tujuanProgram from "../../data/pendidikan/pendidikan-non-formal/tujuan-program2.json";
|
import { loadJsonData } from "../../load-json";
|
||||||
import tempatKegiatan from "../../data/pendidikan/pendidikan-non-formal/tempat-kegiatan.json";
|
|
||||||
import jenisProgramYangDiselenggarakan from "../../data/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan.json";
|
const tujuanProgram = loadJsonData("pendidikan/pendidikan-non-formal/tujuan-program2.json");
|
||||||
|
const tempatKegiatan = loadJsonData("pendidikan/pendidikan-non-formal/tempat-kegiatan.json");
|
||||||
|
const jenisProgramYangDiselenggarakan = loadJsonData("pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan.json");
|
||||||
|
|
||||||
export async function seedPendidikanNonFormal() {
|
export async function seedPendidikanNonFormal() {
|
||||||
for (const t of tujuanProgram) {
|
for (const t of tujuanProgram) {
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import daftarInformasiPublik from "../../../data/ppid/daftar-informasi-publik-desa-darmasaba/daftarInformasi.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
import jenisInformasiDiminta from "../../../data/list-jenisInfromasi.json"
|
|
||||||
import caraMemperolehInformasi from "../../../data/list-caraMemperolehInformasi.json"
|
const daftarInformasiPublik = loadJsonData("ppid/daftar-informasi-publik-desa-darmasaba/daftarInformasi.json");
|
||||||
import caraMemperolehSalinanInformasi from "../../../data/list-caraMemperolehSalinanInformasi.json"
|
const jenisInformasiDiminta = loadJsonData("list-jenisInfromasi.json");
|
||||||
|
const caraMemperolehInformasi = loadJsonData("list-caraMemperolehInformasi.json");
|
||||||
|
const caraMemperolehSalinanInformasi = loadJsonData("list-caraMemperolehSalinanInformasi.json");
|
||||||
|
|
||||||
export async function seedDaftarInformasiPublikPpid() {
|
export async function seedDaftarInformasiPublikPpid() {
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import dasarHukumPPID from "../../../data/ppid/dasar-hukum-ppid/dasarhukumPPID.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const dasarHukumPPID = loadJsonData("ppid/dasar-hukum-ppid/dasarhukumPPID.json");
|
||||||
|
|
||||||
export async function seedDasarHukumPpid() {
|
export async function seedDasarHukumPpid() {
|
||||||
for (const v of dasarHukumPPID) {
|
for (const v of dasarHukumPPID) {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import jenisKelamin from "../../../data/ppid/ikm/jenis-kelamin/jenis-kelamin.json";
|
import { loadJsonData } from "../../../load-json";
|
||||||
import pilihanRatingResponden from "../../../data/ppid/ikm/pilihan-rating-responden/rating-responden.json";
|
|
||||||
import umurResponden from "../../../data/ppid/ikm/umur-responden/umur-responden.json";
|
const jenisKelamin = loadJsonData("ppid/ikm/jenis-kelamin/jenis-kelamin.json");
|
||||||
|
const pilihanRatingResponden = loadJsonData("ppid/ikm/pilihan-rating-responden/rating-responden.json");
|
||||||
|
const umurResponden = loadJsonData("ppid/ikm/umur-responden/umur-responden.json");
|
||||||
|
|
||||||
export async function seedIkmPpid() {
|
export async function seedIkmPpid() {
|
||||||
for (const j of jenisKelamin) {
|
for (const j of jenisKelamin) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import profilPpd from "../../../data/ppid/profile-ppid/profilePPid.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const profilPpd = loadJsonData("ppid/profile-ppid/profilePPid.json");
|
||||||
|
|
||||||
export async function seedProfilPpd() {
|
export async function seedProfilPpd() {
|
||||||
console.log("🔄 Seeding Profil PPD...");
|
console.log("🔄 Seeding Profil PPD...");
|
||||||
|
|||||||
161
prisma/_seeder_list/ppid/seed_ppid_extra.ts
Normal file
161
prisma/_seeder_list/ppid/seed_ppid_extra.ts
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
import prisma from "@/lib/prisma";
|
||||||
|
import { loadJsonData } from "../../load-json";
|
||||||
|
|
||||||
|
const strukturOrganisasiPpidJson = loadJsonData("ppid/struktur-organisasi-ppid/struktur-organisasi-ppid.json");
|
||||||
|
const formulirPermohonanKeberatanJson = loadJsonData("ppid/formulir-permohonan-keberatan/formulir-permohonan-keberatan.json");
|
||||||
|
const ikmJson = loadJsonData("ppid/ikm/indeks-kepuasan-masyarakat/indeks-kepuasan-masyarakat.json");
|
||||||
|
const grafikJenisKelaminJson = loadJsonData("ppid/ikm/grafik-jenis-kelamin/grafik-jenis-kelamin.json");
|
||||||
|
const grafikRespondenJson = loadJsonData("ppid/ikm/grafik-responden/grafik-responden.json");
|
||||||
|
const grafikUmurJson = loadJsonData("ppid/ikm/grafik-umur/grafik-umur.json");
|
||||||
|
|
||||||
|
export async function seedStrukturOrganisasiPpid() {
|
||||||
|
console.log("🔄 Seeding StrukturOrganisasiPPID...");
|
||||||
|
|
||||||
|
for (const item of strukturOrganisasiPpidJson) {
|
||||||
|
await prisma.strukturOrganisasiPPID.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
posisiOrganisasiId: item.posisiOrganisasiId,
|
||||||
|
pegawaiId: item.pegawaiId,
|
||||||
|
hubunganOrganisasiId: item.hubunganOrganisasiId,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
posisiOrganisasiId: item.posisiOrganisasiId,
|
||||||
|
pegawaiId: item.pegawaiId,
|
||||||
|
hubunganOrganisasiId: item.hubunganOrganisasiId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ StrukturOrganisasiPPID seeded: ${item.id}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 StrukturOrganisasiPPID seed selesai");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedFormulirPermohonanKeberatan() {
|
||||||
|
console.log("🔄 Seeding FormulirPermohonanKeberatan...");
|
||||||
|
|
||||||
|
for (const item of formulirPermohonanKeberatanJson) {
|
||||||
|
await prisma.formulirPermohonanKeberatan.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
name: item.name,
|
||||||
|
email: item.email,
|
||||||
|
notelp: item.notelp,
|
||||||
|
alasan: item.alasan,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
email: item.email,
|
||||||
|
notelp: item.notelp,
|
||||||
|
alasan: item.alasan,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ FormulirPermohonanKeberatan seeded: ${item.name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 FormulirPermohonanKeberatan seed selesai");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedIndeksKepuasanMasyarakat() {
|
||||||
|
console.log("🔄 Seeding IndeksKepuasanMasyarakat...");
|
||||||
|
|
||||||
|
for (const item of ikmJson) {
|
||||||
|
await prisma.indeksKepuasanMasyarakat.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
label: item.label,
|
||||||
|
kepuasan: item.kepuasan,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
label: item.label,
|
||||||
|
kepuasan: item.kepuasan,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ IndeksKepuasanMasyarakat seeded: ${item.label}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 IndeksKepuasanMasyarakat seed selesai");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedGrafikBerdasarkanJenisKelamin() {
|
||||||
|
console.log("🔄 Seeding GrafikBerdasarkanJenisKelamin...");
|
||||||
|
|
||||||
|
for (const item of grafikJenisKelaminJson) {
|
||||||
|
await prisma.grafikBerdasarkanJenisKelamin.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
perempuan: item.perempuan,
|
||||||
|
laki: item.laki,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
perempuan: item.perempuan,
|
||||||
|
laki: item.laki,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ GrafikBerdasarkanJenisKelamin seeded: ${item.id}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 GrafikBerdasarkanJenisKelamin seed selesai");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedGrafikBerdasarkanResponden() {
|
||||||
|
console.log("🔄 Seeding GrafikBerdasarkanResponden...");
|
||||||
|
|
||||||
|
for (const item of grafikRespondenJson) {
|
||||||
|
await prisma.grafikBerdasarkanResponden.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
sangatbaik: item.sangatbaik,
|
||||||
|
baik: item.baik,
|
||||||
|
kurangbaik: item.kurangbaik,
|
||||||
|
tidakbaik: item.tidakbaik,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
sangatbaik: item.sangatbaik,
|
||||||
|
baik: item.baik,
|
||||||
|
kurangbaik: item.kurangbaik,
|
||||||
|
tidakbaik: item.tidakbaik,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ GrafikBerdasarkanResponden seeded: ${item.id}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 GrafikBerdasarkanResponden seed selesai");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedGrafikBerdasarkanUmur() {
|
||||||
|
console.log("🔄 Seeding GrafikBerdasarkanUmur...");
|
||||||
|
|
||||||
|
for (const item of grafikUmurJson) {
|
||||||
|
await prisma.grafikBerdasarkanUmur.upsert({
|
||||||
|
where: { id: item.id },
|
||||||
|
update: {
|
||||||
|
remaja: item.remaja,
|
||||||
|
dewasa: item.dewasa,
|
||||||
|
orangtua: item.orangtua,
|
||||||
|
lansia: item.lansia,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: item.id,
|
||||||
|
remaja: item.remaja,
|
||||||
|
dewasa: item.dewasa,
|
||||||
|
orangtua: item.orangtua,
|
||||||
|
lansia: item.lansia,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`✅ GrafikBerdasarkanUmur seeded: ${item.id}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("🎉 GrafikBerdasarkanUmur seed selesai");
|
||||||
|
}
|
||||||
@@ -1,6 +1,29 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import pegawaiPpid from "../../../data/ppid/struktur-ppid/pegawai-PPID.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
import posisiOrganisasiPPID from "../../../data/ppid/struktur-ppid/posisi-organisasi-PPID.json"
|
|
||||||
|
interface PegawaiPPID {
|
||||||
|
id: string;
|
||||||
|
namaLengkap: string;
|
||||||
|
gelarAkademik: string;
|
||||||
|
tanggalMasuk: string;
|
||||||
|
email: string;
|
||||||
|
telepon: string;
|
||||||
|
alamat: string;
|
||||||
|
imageName?: string;
|
||||||
|
posisiId: string;
|
||||||
|
isActive: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PosisiOrganisasiPPID {
|
||||||
|
id: string;
|
||||||
|
nama: string;
|
||||||
|
deskripsi: string;
|
||||||
|
hierarki: number;
|
||||||
|
parentId: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const pegawaiPpid = loadJsonData<PegawaiPPID[]>("ppid/struktur-ppid/pegawai-PPID.json");
|
||||||
|
const posisiOrganisasiPPID = loadJsonData<PosisiOrganisasiPPID[][]>("ppid/struktur-ppid/posisi-organisasi-PPID.json");
|
||||||
|
|
||||||
export async function seedPegawaiPpid() {
|
export async function seedPegawaiPpid() {
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import visiMisiPPID from "../../../data/ppid/visi-misi-ppid/visimisiPPID.json"
|
import { loadJsonData } from "../../../load-json";
|
||||||
|
|
||||||
|
const visiMisiPPID = loadJsonData("ppid/visi-misi-ppid/visimisiPPID.json");
|
||||||
|
|
||||||
export async function seedVisiMisiPpid() {
|
export async function seedVisiMisiPpid() {
|
||||||
for (const v of visiMisiPPID) {
|
for (const v of visiMisiPPID) {
|
||||||
|
|||||||
44
prisma/data/core/app-menu-child.json
Normal file
44
prisma/data/core/app-menu-child.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "menu-child-001",
|
||||||
|
"name": "Sejarah Desa",
|
||||||
|
"link": "/profil-desa/sejarah",
|
||||||
|
"isActive": true,
|
||||||
|
"appMenuId": "menu-002"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-child-002",
|
||||||
|
"name": "Visi Misi",
|
||||||
|
"link": "/profil-desa/visi-misi",
|
||||||
|
"isActive": true,
|
||||||
|
"appMenuId": "menu-002"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-child-003",
|
||||||
|
"name": "Surat Keterangan",
|
||||||
|
"link": "/layanan/surat-keterangan",
|
||||||
|
"isActive": true,
|
||||||
|
"appMenuId": "menu-003"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-child-004",
|
||||||
|
"name": "Perizinan",
|
||||||
|
"link": "/layanan/perizinan",
|
||||||
|
"isActive": true,
|
||||||
|
"appMenuId": "menu-003"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-child-005",
|
||||||
|
"name": "Berita Desa",
|
||||||
|
"link": "/informasi/berita",
|
||||||
|
"isActive": true,
|
||||||
|
"appMenuId": "menu-004"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-child-006",
|
||||||
|
"name": "Pengumuman",
|
||||||
|
"link": "/informasi/pengumuman",
|
||||||
|
"isActive": true,
|
||||||
|
"appMenuId": "menu-004"
|
||||||
|
}
|
||||||
|
]
|
||||||
32
prisma/data/core/app-menu.json
Normal file
32
prisma/data/core/app-menu.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "menu-001",
|
||||||
|
"name": "Beranda",
|
||||||
|
"link": "/",
|
||||||
|
"isActive": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-002",
|
||||||
|
"name": "Profil Desa",
|
||||||
|
"link": "/profil-desa",
|
||||||
|
"isActive": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-003",
|
||||||
|
"name": "Layanan",
|
||||||
|
"link": "/layanan",
|
||||||
|
"isActive": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-004",
|
||||||
|
"name": "Informasi",
|
||||||
|
"link": "/informasi",
|
||||||
|
"isActive": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "menu-005",
|
||||||
|
"name": "Kontak",
|
||||||
|
"link": "/kontak",
|
||||||
|
"isActive": true
|
||||||
|
}
|
||||||
|
]
|
||||||
6
prisma/data/core/landingpage-layanan.json
Normal file
6
prisma/data/core/landingpage-layanan.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "lp-layanan-001",
|
||||||
|
"deksripsi": "Melayani masyarakat Desa Darmasaba dengan sepenuh hati untuk memberikan pelayanan terbaik dalam bidang administrasi, kesehatan, pendidikan, dan keamanan."
|
||||||
|
}
|
||||||
|
]
|
||||||
22
prisma/data/core/layanan.json
Normal file
22
prisma/data/core/layanan.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "layanan-001",
|
||||||
|
"name": "Administrasi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "layanan-002",
|
||||||
|
"name": "Kesehatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "layanan-003",
|
||||||
|
"name": "Pendidikan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "layanan-004",
|
||||||
|
"name": "Keamanan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "layanan-005",
|
||||||
|
"name": "Lingkungan"
|
||||||
|
}
|
||||||
|
]
|
||||||
22
prisma/data/core/potensi.json
Normal file
22
prisma/data/core/potensi.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "potensi-001",
|
||||||
|
"name": "Pertanian"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "potensi-002",
|
||||||
|
"name": "Peternakan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "potensi-003",
|
||||||
|
"name": "Perikanan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "potensi-004",
|
||||||
|
"name": "Kerajinan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "potensi-005",
|
||||||
|
"name": "Pariwisata"
|
||||||
|
}
|
||||||
|
]
|
||||||
41
prisma/data/desa/musik-desa/musik-desa.json
Normal file
41
prisma/data/desa/musik-desa/musik-desa.json
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "cmk-musik-001",
|
||||||
|
"judul": "Darmasaba Swara",
|
||||||
|
"artis": "Gamelan Desa Darmasaba",
|
||||||
|
"deskripsi": "Lagu tradisional Bali yang dibawakan oleh grup gamelan desa Darmasaba. Lagu ini menceritakan keindahan alam dan kearifan lokal desa.",
|
||||||
|
"durasi": "04:32",
|
||||||
|
"audioFileId": null,
|
||||||
|
"audioFileName": null,
|
||||||
|
"coverImageId": null,
|
||||||
|
"coverImageName": "TDQReg1lQ73s39crXW0ra-mobile.webp",
|
||||||
|
"genre": "Gamelan Tradisional",
|
||||||
|
"tahunRilis": 2024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmk-musik-002",
|
||||||
|
"judul": "Mekar di Badung",
|
||||||
|
"artis": "Kadek Wira & Darmasaba Band",
|
||||||
|
"deskripsi": "Lagu pop Bali modern yang mengangkat tema semangat pemuda desa dalam membangun kampung halaman.",
|
||||||
|
"durasi": "03:45",
|
||||||
|
"audioFileId": null,
|
||||||
|
"audioFileName": null,
|
||||||
|
"coverImageId": null,
|
||||||
|
"coverImageName": "EcQIGOF6LW1dIKE53vmba-mobile.webp",
|
||||||
|
"genre": "Pop Bali",
|
||||||
|
"tahunRilis": 2025
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmk-musik-003",
|
||||||
|
"judul": "Tri Hita Karana",
|
||||||
|
"artis": "Sekaa Gong Darmasaba",
|
||||||
|
"deskripsi": "Komposisi gamelan yang terinspirasi dari filosofi Tri Hita Karana - tiga penyebab kebahagiaan dalam kehidupan masyarakat Bali.",
|
||||||
|
"durasi": "05:18",
|
||||||
|
"audioFileId": null,
|
||||||
|
"audioFileName": null,
|
||||||
|
"coverImageId": null,
|
||||||
|
"coverImageName": "Gc79mlIlGuoRQuTqskFj--mobile.webp",
|
||||||
|
"genre": "Gamelan Kontemporer",
|
||||||
|
"tahunRilis": 2024
|
||||||
|
}
|
||||||
|
]
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user