diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..ca7866c
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,40 @@
+version: 2
+
+updates:
+ - package-ecosystem: "npm"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ time: "09:00"
+ timezone: "America/Guayaquil"
+ open-pull-requests-limit: 10
+ target-branch: "development"
+ groups:
+ strapi:
+ patterns:
+ - "@strapi/*"
+ dnd-kit:
+ patterns:
+ - "@dnd-kit/*"
+ react:
+ patterns:
+ - "react"
+ - "react-dom"
+ - "@types/react"
+ - "@types/react-dom"
+ ignore:
+ - dependency-name: "@strapi/strapi"
+ update-types: ["version-update:semver-major"]
+ - dependency-name: "@strapi/design-system"
+ update-types: ["version-update:semver-major"]
+
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ time: "09:00"
+ timezone: "America/Guayaquil"
+ open-pull-requests-limit: 5
+ target-branch: "development"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..05b04bd
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,51 @@
+name: CI
+
+on:
+ push:
+ branches:
+ - main
+ - development
+ - production
+ pull_request:
+ workflow_call:
+
+jobs:
+ ci:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ registry-url: 'https://registry.npmjs.org'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Type check (server)
+ run: npm run test:ts:back
+
+ - name: Type check (admin)
+ run: npm run test:ts:front
+
+ - name: Build
+ run: npm run build
+
+ - name: Verify plugin
+ run: npm run verify
+
+ - name: Check version not already published
+ run: |
+ VERSION=$(node -p "require('./package.json').version")
+ if npm view strapi-plugin-form-builder-cms@$VERSION version 2>/dev/null; then
+ echo "❌ Version $VERSION is already published on npm. Bump the version before merging."
+ exit 1
+ fi
+ echo "✅ Version $VERSION is not yet published."
+
+ - name: Dry run publish
+ run: npm publish --dry-run --access public
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 2c64e7f..a2591b9 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -9,6 +9,7 @@ on:
jobs:
publish:
if: github.event.pull_request.merged == true
+ needs: ci
runs-on: ubuntu-latest
steps:
@@ -31,8 +32,22 @@ jobs:
id: pkg
run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT
+ - name: Set npm tag
+ id: tag
+ run: |
+ VERSION=$(node -p "require('./package.json').version")
+ if [[ "$VERSION" == *"alpha"* ]]; then
+ echo "tag=alpha" >> $GITHUB_OUTPUT
+ elif [[ "$VERSION" == *"beta"* ]]; then
+ echo "tag=beta" >> $GITHUB_OUTPUT
+ elif [[ "$VERSION" == *"rc"* ]]; then
+ echo "tag=rc" >> $GITHUB_OUTPUT
+ else
+ echo "tag=latest" >> $GITHUB_OUTPUT
+ fi
+
- name: Publish to npm
- run: npm publish --access public
+ run: npm publish --access public --tag ${{ steps.tag.outputs.tag }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -44,3 +59,6 @@ jobs:
body: |
Published from PR #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}
generate_release_notes: true
+
+ ci:
+ uses: ./.github/workflows/ci.yml
diff --git a/.gitignore b/.gitignore
index 0a150cc..5d0e68b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -102,6 +102,10 @@ public/uploads/*
dist
build
+# Compiled JS files inside src (TypeScript sources only)
+server/src/**/*.js
+admin/src/**/*.js
+
############################
# Node.js
diff --git a/admin/src/components/DropZone.tsx b/admin/src/components/DropZone.tsx
index eb3efb0..dff53a3 100644
--- a/admin/src/components/DropZone.tsx
+++ b/admin/src/components/DropZone.tsx
@@ -62,7 +62,7 @@ function SortableFieldRow({
{...attributes}
{...listeners}
style={{ cursor: 'grab', color: 'var(--strapi-neutral-400)', padding: '0 4px' }}
- onClick={(e) => e.stopPropagation()}
+ onClick={(e: React.MouseEvent) => e.stopPropagation()}
>
diff --git a/admin/src/components/EmbedModal.tsx b/admin/src/components/EmbedModal.tsx
index 2619106..b7d2b87 100644
--- a/admin/src/components/EmbedModal.tsx
+++ b/admin/src/components/EmbedModal.tsx
@@ -24,7 +24,7 @@ export function EmbedModal({ formId, open, onClose }: Props) {
};
return (
- !v && onClose()}>
+ !v && onClose()}>
Embed this form
diff --git a/admin/src/components/FieldSettingsPanel.tsx b/admin/src/components/FieldSettingsPanel.tsx
index 8d2ba1a..9d96867 100644
--- a/admin/src/components/FieldSettingsPanel.tsx
+++ b/admin/src/components/FieldSettingsPanel.tsx
@@ -260,7 +260,7 @@ export function FieldSettingsPanel({ field, onChange }: Props) {
updateValidation(i, { type: String(val), value: undefined, message: '' })}
+ onChange={(val: string | number) => updateValidation(i, { type: String(val), value: undefined, message: '' })}
size="S"
>
{available.map((opt) => (
diff --git a/admin/src/components/FormPreview.tsx b/admin/src/components/FormPreview.tsx
index ea84fa5..4b9c266 100644
--- a/admin/src/components/FormPreview.tsx
+++ b/admin/src/components/FormPreview.tsx
@@ -287,7 +287,7 @@ export function FormPreview({ title, fields, settings, open, onClose }: Props) {
if (!open) return null;
return (
- !v && onClose()}>
+ !v && onClose()}>
Preview — {title}
diff --git a/admin/src/pages/SubmissionsPage.tsx b/admin/src/pages/SubmissionsPage.tsx
index 793bf70..4dbbb12 100644
--- a/admin/src/pages/SubmissionsPage.tsx
+++ b/admin/src/pages/SubmissionsPage.tsx
@@ -93,7 +93,7 @@ export function SubmissionsPage() {
setStatusFilter(String(val))}
+ onChange={(val: string | number) => setStatusFilter(String(val))}
placeholder="All statuses"
size="S"
>
diff --git a/package.json b/package.json
index 62a5760..0584e36 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,25 @@
{
- "version": "0.0.0",
- "keywords": [],
+ "name": "strapi-plugin-form-builder-cms",
+ "version": "1.0.0-alpha.1",
+ "description": "Visual drag-and-drop form builder plugin for Strapi 5. Create, publish and embed forms on any website.",
+ "keywords": [
+ "strapi",
+ "strapi-plugin",
+ "form-builder",
+ "forms",
+ "drag-and-drop",
+ "cms"
+ ],
+ "license": "MIT",
+ "author": "dev.cluna ",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/devCluna/strapi-plugin-form-builder-cms.git"
+ },
+ "bugs": {
+ "url": "https://github.com/devCluna/strapi-plugin-form-builder-cms/issues"
+ },
+ "homepage": "https://github.com/devCluna/strapi-plugin-form-builder-cms#readme",
"type": "commonjs",
"exports": {
"./package.json": "./package.json",
@@ -27,8 +46,8 @@
"watch": "strapi-plugin watch",
"watch:link": "strapi-plugin watch:link",
"verify": "strapi-plugin verify",
- "test:ts:front": "run -T tsc -p admin/tsconfig.json",
- "test:ts:back": "run -T tsc -p server/tsconfig.json"
+ "test:ts:front": "npx tsc -p admin/tsconfig.json --noEmit",
+ "test:ts:back": "npx tsc -p server/tsconfig.json --noEmit"
},
"dependencies": {
"@dnd-kit/core": "^6.3.1",
@@ -67,11 +86,7 @@
"strapi": {
"kind": "plugin",
"name": "strapi-plugin-form-builder-cms",
- "displayName": "",
- "description": ""
- },
- "name": "strapi-plugin-form-builder-cms",
- "description": "",
- "license": "MIT",
- "author": "dev.cluna "
+ "displayName": "Form Builder CMS",
+ "description": "Visual drag-and-drop form builder plugin for Strapi 5"
+ }
}