From e0cde76ee4e6234b501f2bdaba7024fd560ea313 Mon Sep 17 00:00:00 2001 From: "dev.cluna" Date: Fri, 3 Apr 2026 21:05:49 -0500 Subject: [PATCH 1/6] ci: add CI workflow with type check, build, verify and dry-run publish Runs on every push and PR across all branches. Checks: - TypeScript (server + admin) - Build - Strapi plugin verify - Version not already published on npm - Dry run publish publish.yml now requires CI to pass before publishing to npm. --- .github/workflows/ci.yml | 49 +++++++++++++++++++++++++++++++++++ .github/workflows/publish.yml | 4 +++ 2 files changed, 53 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..ab65bdc --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,49 @@ +name: CI + +on: + push: + branches: ['**'] + pull_request: + branches: ['**'] + 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..fb9e7fc 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: @@ -44,3 +45,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 From a14a00360e47f9d2ffab254eb57582e4ce310396 Mon Sep 17 00:00:00 2001 From: "dev.cluna" Date: Fri, 3 Apr 2026 21:09:36 -0500 Subject: [PATCH 2/6] fix: replace yarn run -T with npx tsc and fix implicit any type errors - Fix test:ts:front and test:ts:back scripts to use npx tsc (was yarn-only syntax) - Add explicit types for implicit any parameters caught by the type check: MouseEvent on DropZone drag handle click boolean on Modal.Root onOpenChange in EmbedModal and FormPreview string | number on SingleSelect onChange in FieldSettingsPanel and SubmissionsPage --- admin/src/components/DropZone.tsx | 2 +- admin/src/components/EmbedModal.tsx | 2 +- admin/src/components/FieldSettingsPanel.tsx | 2 +- admin/src/components/FormPreview.tsx | 2 +- admin/src/pages/SubmissionsPage.tsx | 2 +- package.json | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) 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..dff0c14 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,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", + "test:ts:back": "npx tsc -p server/tsconfig.json" }, "dependencies": { "@dnd-kit/core": "^6.3.1", From def7347b69996a89607fdf365750b50af1356f63 Mon Sep 17 00:00:00 2001 From: "dev.cluna" Date: Fri, 3 Apr 2026 21:18:38 -0500 Subject: [PATCH 3/6] ci: add Dependabot for npm and GitHub Actions weekly updates --- .github/dependabot.yml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .github/dependabot.yml 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" From 3ce6075c5916369f2d536c14c49f157231d1fc8d Mon Sep 17 00:00:00 2001 From: "dev.cluna" Date: Fri, 3 Apr 2026 21:22:02 -0500 Subject: [PATCH 4/6] fix: remove stale compiled JS files from src and ignore them in .gitignore Rollup was resolving register.js (and other compiled .js files) instead of the .ts sources, causing 'default is not exported' build failures in CI. Deleted all .js artifacts from server/src and admin/src and added them to .gitignore so they are never committed again. --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) 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 From 25e7d3650c02d95aeaece297cf762da5129fc1d0 Mon Sep 17 00:00:00 2001 From: "dev.cluna" Date: Fri, 3 Apr 2026 21:25:41 -0500 Subject: [PATCH 5/6] fix: add --noEmit to tsc type-check scripts to prevent JS file generation Without --noEmit, tsc outputs .js files next to the .ts sources. Rollup then resolves the CJS .js files instead of the .ts sources and fails with 'default is not exported' on the CommonJS interop boundary. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dff0c14..ffa40be 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ "watch": "strapi-plugin watch", "watch:link": "strapi-plugin watch:link", "verify": "strapi-plugin verify", - "test:ts:front": "npx tsc -p admin/tsconfig.json", - "test:ts:back": "npx 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", From ad17e83c63873498a64320851332a049ff0b56d7 Mon Sep 17 00:00:00 2001 From: "dev.cluna" Date: Fri, 3 Apr 2026 21:26:50 -0500 Subject: [PATCH 6/6] ci: prevent double CI run on PR branches Push trigger now only fires on main, development and production. Feature branches are covered by the pull_request trigger alone, so CI no longer runs twice when pushing to an open PR. --- .github/workflows/ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab65bdc..05b04bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,11 @@ name: CI on: push: - branches: ['**'] + branches: + - main + - development + - production pull_request: - branches: ['**'] workflow_call: jobs: