diff --git a/.dockerignore b/.dockerignore
index d3af2a345..4708f41f3 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,27 +1,80 @@
-Dockerfile
-Dockerfile.*
-*docker-compose.*.yml
-.dockerignore
-node_modules/
+# Version control
+.git
+.gitignore
+.gitattributes
+
+# GitHub
+.github
+
+# IDE & Editor
+.vscode
+.idea
+.editorconfig
+.prettierrc
+.prettierrc.json
+.eslintrc
+.eslintrc.js
+.eslintrc.json
+
+# Dependencies & Build Artifacts
+node_modules
**/node_modules
+dist
+build
+.next
+.cache
+.turbo
+pnpm-store
+.pnpm-store
+.strapi
+next-env.d.ts
+tsconfig.tsbuildinfo
+.strapi-updater.json
+
+# Logs
npm-debug.log
-README.md
-.next/
-.git
-.tmp/
-.cache/
-build/
-data/
+pnpm-debug.log
+yarn-error.log
+*.log
+
+# Temporary & OS
+.DS_Store
+.tmp
.env
-.env*
+.env.local
+.env.*.local
+Thumbs.db
+
+# Documentation
+README.md
+*.md
+docs/
+
+# Testing
+coverage/
+.nyc_output/
+cypress/
+**/*.test.*
+**/*.spec.*
+__tests__/
+**/__tests__/
+
+# Docker files (not needed in context)
+Dockerfile
+Dockerfile.*
+docker-compose*.yml
+.dockerignore
-**/.next
+# CI/CD (not needed in image)
+.github/
+.gitlab-ci.yml
+.travis.yml
+
+# Misc
+*.pem
+.vercel
+.eslintcache
+.next/
**/.tmp
-**/build/
**/data/
-**/dist/
-**/.cache/
-**/node_modules/
-**/.DS_Store
-docs
-*.log
\ No newline at end of file
+**/.cache/
\ No newline at end of file
diff --git a/.envrc.json b/.envrc.json
index ea7aeed40..dd64df4e5 100644
--- a/.envrc.json
+++ b/.envrc.json
@@ -24,6 +24,14 @@
"example": "http://localhost:8000/static/sdk/open-forms-sdk.js",
"developmentDefault": "http://localhost:8000/static/sdk/open-forms-sdk.js"
},
+ {
+ "name": "OPEN_FORMS_MOCK",
+ "description": "Whether to use a mock implementation of the Open Forms API. This can be used for development and testing without needing to set up an actual Open Forms instance.",
+ "required": false,
+ "valueType": "string",
+ "examples": ["true", "false"],
+ "developmentDefault": "false"
+ },
{
"name": "OVERIGE_OBJECTEN_API_PORT",
"description": "Port number for the Overige Objecten API. This is used to access the Overige Objecten API from the frontend.",
@@ -130,10 +138,18 @@
},
{
"name": "FRONTEND_PUBLIC_URL",
- "description": "URL where the preview of pages in the Strapi Dashboard are hosted. You can use the Docker container name as the URL, for example: http://pdc_frontend:3000.",
+ "description": "URL where the preview of pages in the Strapi Dashboard are hosted. You can use the Docker container name as the URL, for example: http://overige-objecten-api:3000.",
+ "required": true,
+ "valueType": "url",
+ "developmentDefault": "http://localhost:3000"
+ },
+ {
+ "name": "KISS_PREVIEW_URL",
+ "description": "URL where the preview of pages in the Strapi Dashboard are hosted. You can use the Docker container name as the URL, for example: http://overige-objecten-api:3000.",
"required": true,
"valueType": "url",
- "developmentDefault": "http://pdc_frontend:3000"
+ "developmentDefault": "http://localhost:4001/api/v2/preview",
+ "example": "http://localhost:4001/api/v2/preview"
},
{
"name": "HOST",
@@ -149,7 +165,7 @@
"required": true,
"valueType": "string",
"examples": ["development", "production"],
- "developmentDefault": "production"
+ "developmentDefault": "development"
},
{
"name": "PGADMIN_DEFAULT_EMAIL",
@@ -184,20 +200,29 @@
"valueType": "base64",
"developmentDefault": "SGVsbG8sIHdvcmxkIQ=="
},
+ {
+ "name": "KISS_PREVIEW_TOKEN",
+ "description": "Configure Strapi Dashboard and the website with the same secret, to be able to show unpublished content in preview mode.",
+ "required": true,
+ "secret": true,
+ "valueType": "base64",
+ "developmentDefault": "aGVsbG8gd29ybGQ=",
+ "example": "aGVsbG8gd29ybGQ="
+ },
{
"name": "STRAPI_PRIVATE_URL",
"description": "URL where Strapi is available on the internal network, for example to access the GraphQL API. You can use the Docker container name, e.g. http://pdc_strapi:1337.",
"required": true,
- "example": "http://pdc_strapi:1337",
- "developmentDefault": "http://pdc_strapi:1337"
+ "example": "http://localhost:1337",
+ "developmentDefault": "http://localhost:1337"
},
{
"name": "STRAPI_PUBLIC_URL",
"description": "URL where Strapi is available to the public. You can use the Docker container name, e.g. http://pdc_strapi:1337.",
"required": true,
"valueType": "url",
- "example": "http://pdc_strapi:1337",
- "developmentDefault": "http://pdc_strapi:1337"
+ "example": "http://localhost:1337",
+ "developmentDefault": "http://localhost:1337"
},
{
"name": "TRANSFER_TOKEN_SALT",
@@ -317,7 +342,7 @@
"name": "STRAPI_ENV_LABEL",
"description": "Text describing the environment, used to warn users of Strapi Dashboard when they are not working in production. Can not be localized.",
"required": false,
- "developmentDefault": "Development",
+ "developmentDefault": "development",
"valueType": "string"
},
{
@@ -341,7 +366,7 @@
"description": "URL for the Flo Legal API, used to access legal documents and templates.",
"required": false,
"valueType": "url",
- "example": "https://example.com/api"
+ "example": "https://services-acc.flolegal.app/builder-api"
},
{
"name": "KCM_SURVEY_API_KEY",
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 63350707a..000000000
--- a/.eslintignore
+++ /dev/null
@@ -1,37 +0,0 @@
-# Ignore 3rd party files
-node_modules
-SearchBar
-
-# Ignore minified files
-*.min.js
-
-# Ignore generated files
-.strapi-updater.json
-patches
-dist
-build
-tmp
-sample
-.cache
-generated
-.rollup.cache
-.tmp
-yarn-error.log
-gql
-.next
-**/build
-**/.next
-**/.cache
-**/.tmp
-**/dist
-**/node_modules
-**/.rollup.cache
-**/yarn-error.log
-**/.strapi-updater.json
-**/generated
-packages/editoria11y/lib/**
-packages/editoria11y/loader/**
-packages/editoria11y/www/**
-apps/overige-objecten-api/src/types
-apps/pdc-frontend/public/flo-client-plugin.js
-apps/pdc-frontend/public/flo-client-plugin-polyfills.js
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index de4d5deb5..000000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/* eslint-env node */
-
-module.exports = {
- root: true,
- globals: {
- process: true,
- },
- env: {
- browser: true,
- es6: true,
- node: false,
- jest: true,
- },
- parserOptions: {
- ecmaVersion: 2021,
- sourceType: 'module',
- ecmaFeatures: {
- jsx: true,
- },
- },
- settings: {
- react: {
- version: 'detect',
- },
- },
- overrides: [
- {
- extends: ['plugin:json/recommended'],
- files: ['*.json'],
- },
- {
- extends: ['plugin:react/recommended', 'eslint-config-prettier', './.eslintrc.js.json', './.eslintrc.react.json'],
- files: ['*.js', '*.jsx'],
- plugins: ['import', 'jest', 'prettier'],
- rules: {
- 'prettier/prettier': 'error',
- },
- },
- {
- extends: ['plugin:react/recommended', 'eslint-config-prettier', './.eslintrc.js.json', './.eslintrc.react.json'],
- files: ['*.ts', '*.tsx'],
- parser: '@typescript-eslint/parser',
- plugins: ['@typescript-eslint', 'import', 'jest', 'prettier'],
- rules: {
- 'prettier/prettier': 'error',
- },
- },
- {
- extends: ['plugin:react/recommended', 'eslint-config-prettier', './.eslintrc.js.json', './.eslintrc.react.json'],
- files: ['*.ts', '*.tsx'],
- parser: '@typescript-eslint/parser',
- parserOptions: {
- project: [
- './apps/overige-objecten-api/tsconfig.json',
- './apps/overige-objecten-api/tsconfig.test.json',
- './apps/strapi-admin-extensions/tsconfig.json',
- './apps/strapi-admin-extensions/tsconfig.test.json',
- './apps/kennisbank-dashboard/src/admin/tsconfig.json',
- './apps/kennisbank-dashboard/tsconfig.json',
- './apps/kennisbank-frontend/tsconfig.json',
- './apps/pdc-dashboard/src/admin/tsconfig.json',
- './apps/pdc-dashboard/tsconfig.json',
- './apps/pdc-frontend/tsconfig.json',
- './apps/pdc-sc/tsconfig.json',
- './apps/strapi.frameless.io/tsconfig.json',
- './apps/tiptap-sandbox/tsconfig.json',
- './apps/tiptap-sandbox/tsconfig.node.json',
- './apps/vth-dashboard/src/admin/tsconfig.json',
- './apps/vth-dashboard/tsconfig.json',
- './apps/vth-frontend/tsconfig.json',
- './packages/catalogi-data/tsconfig.json',
- './packages/content-compliance-checker/tsconfig.json',
- './packages/content-compliance-checker/tsconfig.server.json',
- './packages/editoria11y/tsconfig.json',
- './packages/provider-upload-vercel/tsconfig.json',
- './packages/samenwerkende-catalogi/tsconfig.json',
- './packages/strapi-plugin-env-label/tsconfig.json',
- './packages/strapi-plugin-env-label/tsconfig.server.json',
- './packages/strapi-plugin-flo-legal-embed/tsconfig.json',
- './packages/strapi-plugin-flo-legal-embed/tsconfig.server.json',
- './packages/strapi-plugin-language/tsconfig.json',
- './packages/strapi-plugin-language/tsconfig.server.json',
- './packages/strapi-plugin-old-slugs/tsconfig.json',
- './packages/strapi-plugin-old-slugs/tsconfig.server.json',
- './packages/strapi-plugin-old-slugs/tsconfig.test.json',
- './packages/strapi-plugin-open-forms-embed/tsconfig.json',
- './packages/strapi-plugin-open-forms-embed/tsconfig.server.json',
- './packages/strapi-plugin-uniform-product-name/tsconfig.json',
- './packages/strapi-plugin-uniform-product-name/tsconfig.server.json',
- './packages/strapi-plugin-uuid-field/tsconfig.json',
- './packages/strapi-plugin-uuid-field/tsconfig.server.json',
- './packages/strapi-tiptap-editor/tsconfig.json',
- './packages/strapi-tiptap-editor/tsconfig.server.json',
- './packages/strapi-tiptap-editor/tsconfig.test.json',
- './packages/ui/tsconfig.json',
- './packages/ui/tsconfig.test.json',
- './packages/upl/tsconfig.json',
- './packages/utils/tsconfig.json',
- './packages/utils/tsconfig.test.json',
- './packages/tiptap-editor/tsconfig.json',
- ],
- tsconfigRootDir: __dirname,
- },
- plugins: ['@typescript-eslint', 'import', 'prettier'],
- rules: {
- 'prettier/prettier': 'error',
- 'no-unused-vars': 'off',
- },
- },
- ],
-};
diff --git a/.eslintrc.js.json b/.eslintrc.js.json
deleted file mode 100644
index beade8ffb..000000000
--- a/.eslintrc.js.json
+++ /dev/null
@@ -1,116 +0,0 @@
-{
- "rules": {
- "array-callback-return": ["error", { "checkForEach": false }],
- "block-scoped-var": "error",
- "consistent-return": "error",
- "constructor-super": "error",
- "no-console": "error",
- "eqeqeq": "error",
- "for-direction": "error",
- "getter-return": "error",
- "import/order": [
- "error",
- {
- "alphabetize": { "order": "asc", "caseInsensitive": false },
- "groups": [
- ["builtin", "external"],
- ["internal", "unknown"],
- ["parent", "sibling", "index"]
- ],
- "newlines-between": "never",
- "warnOnUnassignedImports": false
- }
- ],
- "no-alert": "error",
- "no-async-promise-executor": "error",
- "no-caller": "error",
- "no-case-declarations": "error",
- "no-class-assign": "error",
- "no-compare-neg-zero": "error",
- "no-cond-assign": "error",
- "no-const-assign": "error",
- "no-constant-condition": "error",
- "no-constructor-return": "error",
- "no-control-regex": "error",
- "no-debugger": "error",
- "no-delete-var": "error",
- "no-dupe-args": "error",
- "no-dupe-class-members": "error",
- "no-dupe-else-if": "error",
- "no-dupe-keys": "error",
- "no-duplicate-case": "error",
- "no-empty": "error",
- "no-empty-character-class": "error",
- "no-empty-pattern": "error",
- "no-eval": "error",
- "no-ex-assign": "error",
- "no-extra-boolean-cast": "error",
- "no-extra-semi": "error",
- "no-fallthrough": "error",
- "no-func-assign": "error",
- "no-global-assign": "error",
- "no-implicit-globals": "error",
- "no-implied-eval": "error",
- "no-import-assign": "error",
- "no-inner-declarations": "error",
- "no-invalid-regexp": "error",
- "no-invalid-this": "error",
- "no-irregular-whitespace": "error",
- "no-lone-blocks": "error",
- "no-loop-func": "error",
- "no-misleading-character-class": "error",
- "no-multi-str": "error",
- "no-new-func": "error",
- "no-new-symbol": "error",
- "no-new-wrappers": "error",
- "no-obj-calls": "error",
- "no-octal": "error",
- "no-octal-escape": "error",
- "no-param-reassign": "error",
- "no-prototype-builtins": "error",
- "no-redeclare": "error",
- "no-regex-spaces": "error",
- "no-return-assign": "error",
- "no-return-await": "error",
- "no-self-assign": "error",
- "no-self-compare": "error",
- "no-sequences": "error",
- "no-setter-return": "error",
- "no-shadow-restricted-names": "error",
- "no-sparse-arrays": "error",
- "no-this-before-super": "error",
- "no-throw-literal": "error",
- "no-undef": "error",
- "no-unexpected-multiline": "error",
- "no-unmodified-loop-condition": "error",
- "no-unreachable": "error",
- "no-unsafe-finally": "error",
- "no-unsafe-negation": "error",
- "no-unused-expressions": "error",
- "no-unused-labels": "error",
- "no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
- "no-useless-call": "error",
- "no-useless-catch": "error",
- "no-useless-concat": "error",
- "no-useless-escape": "error",
- "no-useless-return": "error",
- "no-void": "error",
- "no-with": "error",
- "prefer-regex-literals": "error",
- "radix": "error",
- "require-yield": "error",
- "sort-imports": [
- "error",
- {
- "ignoreCase": true,
- "ignoreDeclarationSort": true,
- "ignoreMemberSort": false,
- "allowSeparatedGroups": false
- }
- ],
- "use-isnan": "error",
- "valid-typeof": "error",
- "vars-on-top": "off",
- "yoda": "error"
- }
-}
diff --git a/.eslintrc.react.json b/.eslintrc.react.json
deleted file mode 100644
index f75735163..000000000
--- a/.eslintrc.react.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "rules": {
- "react/no-unknown-property": "off",
- "react/prop-types": "off",
- "react/jsx-key": "error",
- "react/react-in-jsx-scope": "off"
- }
-}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 64d159202..5197a9639 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -11,17 +11,40 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
fetch-depth: 0
- name: Use Node.js
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.4.0
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f #v6.3.0
with:
node-version-file: .nvmrc
- cache: "yarn"
- registry-url: "https://npm.pkg.github.com/"
+ registry-url: "https://registry.npmjs.org/"
scope: "@frameless"
- - run: yarn install --frozen-lockfile
+ - name: Install pnpm
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 #v5.0.0
+ - name: Set pnpm store path
+ run: pnpm config set store-dir ~/.pnpm-store/v10
+ - name: Setup pnpm cache
+ uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 #v5.0.3
+ id: pnpm-store-cache
+ with:
+ path: ~/.pnpm-store/v10
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+ - name: Cache Puppeteer browsers
+ uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 #v5.0.3
+ with:
+ path: ~/.cache/puppeteer
+ key: ${{ runner.os }}-puppeteer-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-puppeteer-
+ - run: pnpm install --frozen-lockfile
+ env:
+ SCARF_ANALYTICS: false
+ PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true
+ PUPPETEER_SKIP_DOWNLOAD: "true"
+ PUPPETEER_CACHE_DIR: ~/.cache/puppeteer
- name: Make the root envfile
uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f #v2.0.3
with:
@@ -59,38 +82,34 @@ jobs:
- name: Lint
env:
NODE_OPTIONS: "--max_old_space_size=4096"
- run: yarn run lint
+ run: pnpm run lint
- name: Test
- run: yarn run test
+ run: pnpm run test
- name: Upload coverage reports to Codecov
- uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.0.1
+ uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Build
- run: yarn run build
+ run: pnpm run build
- name: Upload artifact for GitHub Pages
- uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1
+ uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
with:
path: apps/strapi.frameless.io/build/
- - name: Upload Build artifacts
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
- with:
- name: build
- path: apps/tiptap-sandbox/dist/
+
continuous-deployment:
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- name: Checkout
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
- name: Check Free Disk Space
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be #v1.3.1
with:
swap-storage: false
- name: Docker meta
id: meta
- uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 #v5.7.0
+ uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf #v6.0.0
with:
images: |
ghcr.io/${{ github.repository }}
@@ -100,17 +119,17 @@ jobs:
type=semver,pattern={{major}}.{{minor}}
type=raw,value={{sha}},enable=${{ github.ref_type != 'tag' }}
- name: Set up QEMU
- uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 #v3.6.0
+ uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a #v4.0.0
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 #v3.10.0
+ uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd #v4.0.0
- name: Login to GitHub Container Registry
- uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 #v3.4.0
+ uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 #v4.0.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GH_CLASSIC_TOKEN }}
- name: Build and push
- uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 #v6.16.0
+ uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 #v7.0.0
with:
context: .
file: Dockerfile.prod
@@ -123,21 +142,22 @@ jobs:
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
- name: Use Node.js
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.4.0
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f #v6.3.0
with:
node-version-file: .nvmrc
- cache: "yarn"
- registry-url: "https://npm.pkg.github.com/"
+ registry-url: "https://registry.npmjs.org/"
scope: "@frameless"
+ - name: Install pnpm
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 #v5.0.0
- name: Install
- run: yarn install --frozen-lockfile
+ run: pnpm install --frozen-lockfile
- name: Build
- run: yarn run build
+ run: pnpm run build
- name: Publish to GitHub repository
if: github.ref == 'refs/heads/main'
- uses: changesets/action@06245a4e0a36c064a573d4150030f5ec548e4fcc # v1.4.10
+ uses: changesets/action@6a0a831ff30acef54f2c6aa1cbbc1096b066edaf # v1.7.0
id: changeset
env:
GIT_AUTHOR_EMAIL: "devops@frameless.io"
@@ -150,7 +170,7 @@ jobs:
commit: "docs(release): strapi packages"
setupGitUser: false
title: "docs(release): strapi packages"
- publish: "yarn run publish"
+ publish: "pnpm run publish"
publish-strapi-docs-website:
runs-on: ubuntu-latest
needs: continuous-integration
@@ -165,53 +185,3 @@ jobs:
- name: Deploy to GitHub Pages
id: deploy-pages
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
- deploy-to-vercel:
- runs-on: ubuntu-latest
- needs: continuous-integration
- steps:
- - name: Checkout
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
- - name: Download build artifacts
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 #v4.3.0
- with:
- name: build
- path: apps/tiptap-sandbox/dist/
- - name: Start Deploy to Vercel
- uses: bobheadxi/deployments@648679e8e4915b27893bd7dbc35cb504dc915bc8 # v1.5.0
- id: deployment-preview
- with:
- step: start
- token: ${{ secrets.GITHUB_TOKEN }}
- env: Preview
- - name: Deploy to Vercel/Preview
- id: vercel-action-preview
- if: github.ref != 'refs/heads/main'
- uses: amondnet/vercel-action@16e87c0a08142b0d0d33b76aeaf20823c381b9b9 # v25.2.0
- with:
- vercel-token: ${{ secrets.VERCEL_TOKEN }}
- vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
- vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
- scope: ${{ secrets.VERCEL_ORG_ID }}
- github-token: ${{ secrets.GITHUB_TOKEN }}
- - name: Deploy to Vercel/Production
- uses: amondnet/vercel-action@16e87c0a08142b0d0d33b76aeaf20823c381b9b9 # v25.2.0
- id: vercel-action-production
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
- with:
- vercel-token: ${{ secrets.VERCEL_TOKEN }}
- vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
- vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
- scope: ${{ secrets.VERCEL_ORG_ID }}
- github-comment: false
- vercel-args: "--prod"
- github-token: ${{ secrets.GITHUB_TOKEN }}
- - name: Update Deployment Status on Vercel
- uses: bobheadxi/deployments@648679e8e4915b27893bd7dbc35cb504dc915bc8 # v1.5.0
- if: github.ref != 'refs/heads/main'
- with:
- step: finish
- token: ${{ secrets.GITHUB_TOKEN }}
- status: ${{ job.status }}
- deployment_id: ${{ steps.deployment-preview.outputs.deployment_id }}
- env_url: ${{ steps.vercel-action-preview.outputs.preview-url }}
- env: ${{ steps.deployment-preview.outputs.env }}
diff --git a/.github/workflows/wcag.yaml b/.github/workflows/wcag.yaml
index 17b283bb8..5c850c37f 100644
--- a/.github/workflows/wcag.yaml
+++ b/.github/workflows/wcag.yaml
@@ -18,7 +18,7 @@ jobs:
steps:
- name: Checkout branch
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
- name: Include GitHub Issues as WCAG result
uses: frameless/wcag-issues-action@latest
diff --git a/.gitignore b/.gitignore
index c22f412f5..ad57e7a62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,7 +10,7 @@ Icon
.Trashes
._*
vendor/
-
+.turbo
############################
# Linux
@@ -148,3 +148,9 @@ apps/overige-objecten-api/src/types
############################
apps/pdc-frontend/public/flo-client-plugin.js
apps/pdc-frontend/public/flo-client-plugin-polyfills.js
+
+
+############################
+# TypeScript
+############################
+tsconfig.test.tsbuildinfo
diff --git a/.lintstagedrc.js b/.lintstagedrc.js
deleted file mode 100644
index 90e520553..000000000
--- a/.lintstagedrc.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
- '**/*.{ts,tsx,js,scss,css,html,json,md}?(x)': () => 'npm run lint',
- '**/*.{ts,tsx}': () => 'npm run lint-build',
-};
diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs
new file mode 100644
index 000000000..ec7dae529
--- /dev/null
+++ b/.lintstagedrc.mjs
@@ -0,0 +1,4 @@
+export default {
+ '**/*.{ts,tsx,js,scss,css,html,json,md}?(x)': () => 'pnpm lint',
+ '**/*.{ts,tsx}': () => 'pnpm lint-build',
+};
diff --git a/.npmrc b/.npmrc
index b028546be..d791f5e8d 100644
--- a/.npmrc
+++ b/.npmrc
@@ -1,2 +1,29 @@
+# Save exact versions in package.json (no ^ or ~ prefixes)
+# Example: "react": "18.3.1" instead of "react": "^18.3.1"
save-exact=true
+
+# Remove version prefix when saving (works with save-exact)
save-prefix=
+
+# Hoist all dependencies to root node_modules (fixes Strapi v5 plugin resolution issues)
+# Required for community plugins to find @strapi/design-system and other shared deps
+shamefully-hoist=true
+
+# Automatically install peer dependencies without prompting
+# Prevents "missing peer dependency" warnings during install
+auto-install-peers=true
+
+# Don't fail installation when peer dependency versions don't match exactly
+# Allows slightly mismatched peer deps (useful in monorepos with multiple Strapi plugins)
+strict-peer-dependencies=false
+
+# Hoist Strapi and React deps to root for plugins
+public-hoist-pattern[]=*@strapi/*
+public-hoist-pattern[]=*react*
+public-hoist-pattern[]=*react-dom*
+public-hoist-pattern[]=*styled-components*
+
+provenance=true
+
+# This package moved to public npm
+@frameless/preview-button:registry=https://registry.npmjs.org/
diff --git a/.nvmrc b/.nvmrc
index c8ac5a416..cabf43b5d 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-20.19
\ No newline at end of file
+24
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
index 8c6806368..f424275ed 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -16,6 +16,7 @@ tmp
CHANGELOG.md
package-lock.json
yarn.lock
+pnpm-lock.yaml
.strapi-updater.json
generated
gql
diff --git a/.prettierrc.json b/.prettierrc.json
index 4b2e58f36..8c66792ff 100644
--- a/.prettierrc.json
+++ b/.prettierrc.json
@@ -10,6 +10,16 @@
"singleQuote": true
}
},
+ {
+ "files": ["*.mjs"],
+ "options": {
+ "parser": "babel",
+ "printWidth": 120,
+ "trailingComma": "all",
+ "tabWidth": 2,
+ "singleQuote": true
+ }
+ },
{
"files": ["*.json"],
"options": {
diff --git a/.stylelintrc.json b/.stylelintrc.json
index 911d15ec0..15d11db3c 100644
--- a/.stylelintrc.json
+++ b/.stylelintrc.json
@@ -1,5 +1,5 @@
{
- "extends": ["stylelint-config-standard", "stylelint-config-standard-scss"],
+ "extends": ["stylelint-config-standard-scss"],
"plugins": ["stylelint-order"],
"rules": {
"order/order": ["custom-properties", "declarations"],
@@ -32,7 +32,6 @@
"no-duplicate-at-import-rules": [true],
"no-duplicate-selectors": [true],
"no-empty-source": [true],
- "no-extra-semicolons": null,
"no-invalid-double-slash-comments": [true],
"property-no-unknown": [true],
"selector-pseudo-class-no-unknown": [true],
@@ -57,8 +56,6 @@
"function-url-no-scheme-relative": [true],
"font-family-name-quotes": ["always-unless-keyword"],
"function-url-quotes": ["always"],
- "number-leading-zero": null,
- "number-no-trailing-zeros": null,
"declaration-property-value-disallowed-list": [
{
"text-align": ["left", "right"]
@@ -79,71 +76,9 @@
]
],
"selector-max-id": [0],
- "indentation": null,
- "linebreaks": null,
- "max-line-length": null,
- "function-comma-newline-after": null,
- "function-comma-newline-before": null,
- "function-comma-space-after": null,
- "function-comma-space-before": null,
- "function-max-empty-lines": null,
- "function-parentheses-newline-inside": null,
- "function-parentheses-space-inside": null,
- "value-list-comma-newline-after": null,
- "value-list-comma-newline-before": null,
- "value-list-comma-space-after": null,
- "value-list-comma-space-before": null,
- "value-list-max-empty-lines": null,
- "declaration-colon-newline-after": null,
- "declaration-colon-space-after": null,
- "declaration-colon-space-before": null,
- "declaration-block-semicolon-newline-after": null,
- "declaration-block-semicolon-newline-before": null,
- "declaration-block-semicolon-space-after": null,
- "declaration-block-semicolon-space-before": null,
- "declaration-block-trailing-semicolon": null,
- "block-closing-brace-empty-line-before": null,
- "block-closing-brace-newline-after": null,
- "block-closing-brace-newline-before": null,
- "block-closing-brace-space-after": null,
- "block-closing-brace-space-before": null,
- "block-opening-brace-newline-after": null,
- "block-opening-brace-newline-before": null,
- "block-opening-brace-space-after": null,
- "block-opening-brace-space-before": null,
"selector-attribute-quotes": ["always"],
- "selector-combinator-space-after": null,
- "selector-combinator-space-before": null,
- "selector-descendant-combinator-no-non-space": null,
- "selector-list-comma-newline-after": null,
- "selector-list-comma-newline-before": null,
- "selector-list-comma-space-after": null,
- "selector-list-comma-space-before": null,
- "media-query-list-comma-newline-after": null,
- "media-query-list-comma-newline-before": null,
- "media-query-list-comma-space-after": null,
- "media-query-list-comma-space-before": null,
- "at-rule-empty-line-before": null,
- "at-rule-name-newline-after": null,
- "at-rule-semicolon-newline-after": null,
- "max-empty-lines": null,
- "no-eol-whitespace": null,
- "no-missing-end-of-source-newline": null,
- "no-empty-first-line": null,
- "unicode-bom": null,
- "rule-empty-line-before": null,
- "color-hex-case": null,
- "unit-case": null,
- "property-case": null,
- "selector-pseudo-class-case": null,
- "selector-pseudo-element-case": null,
- "selector-max-empty-lines": null,
- "media-feature-name-case": null,
- "at-rule-name-case": null,
- "string-quotes": null,
"property-no-vendor-prefix": null,
"value-keyword-case": ["lower", { "camelCaseSvgKeywords": true }],
- "declaration-block-no-redundant-longhand-properties": null,
- "scss/at-import-no-partial-leading-underscore": null
+ "declaration-block-no-redundant-longhand-properties": null
}
}
diff --git a/.yarnrc b/.yarnrc
deleted file mode 100644
index 89a20e53c..000000000
--- a/.yarnrc
+++ /dev/null
@@ -1,2 +0,0 @@
-install --frozen-lockfile true
-disable-self-update-check true
diff --git a/Dockerfile.dev b/Dockerfile.dev
index 0b719b06b..fe171eeb9 100644
--- a/Dockerfile.dev
+++ b/Dockerfile.dev
@@ -1,69 +1,62 @@
-FROM node:20.19-alpine3.22 as build
-# Installing libvips-dev for sharp Compatibility
-RUN apk update && apk add --no-cache git libc6-compat build-base bash gcc autoconf automake zlib-dev libpng-dev vips-dev > /dev/null 2>&1
+# ---------- base ----------
+FROM node:24-alpine AS base
+
+RUN apk add --no-cache libc6-compat git bash
+
+ENV PNPM_HOME="/pnpm"
+ENV PATH="$PNPM_HOME:$PATH"
+RUN corepack enable && corepack prepare pnpm@10.23.0 --activate
+
+WORKDIR /app
+
+
+# ---------- dependencies ----------
+FROM base AS dependencies
ARG NODE_ENV=development
+ARG STRAPI_PUBLIC_URL
ENV NODE_ENV=${NODE_ENV}
+ENV STRAPI_PUBLIC_URL=${STRAPI_PUBLIC_URL}
+
+RUN apk add --no-cache \
+ build-base \
+ python3 \
+ autoconf \
+ automake \
+ vips-dev
+
+COPY pnpm-lock.yaml package.json pnpm-workspace.yaml ./
+COPY apps ./apps
+COPY packages ./packages
+
+# Install with both shamefully-hoist AND auto-install-peers
+RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
+ pnpm install --frozen-lockfile --shamefully-hoist
+
+# ---------- development ----------
+FROM base AS development
+
+ARG NODE_ENV=development
ARG STRAPI_PUBLIC_URL
+ENV NODE_ENV=${NODE_ENV}
ENV STRAPI_PUBLIC_URL=${STRAPI_PUBLIC_URL}
-WORKDIR /opt/app
-COPY ./package.json ./yarn.lock ./
-ENV PATH /opt/app/node_modules/.bin:$PATH
-COPY ./apps/pdc-dashboard/package.json apps/pdc-dashboard/package.json
-COPY ./apps/pdc-frontend/package.json apps/pdc-frontend/package.json
-COPY ./apps/pdc-sc/package.json apps/pdc-sc/package.json
-COPY ./apps/vth-dashboard/package.json apps/vth-dashboard/package.json
-COPY ./apps/vth-frontend/package.json apps/vth-frontend/package.json
-COPY ./apps/kennisbank-dashboard/package.json apps/kennisbank-dashboard/package.json
-COPY ./apps/overige-objecten-api/package.json apps/overige-objecten-api/package.json
-COPY ./apps/strapi-admin-extensions/package.json apps/strapi-admin-extensions/package.json
-COPY ./apps/kennisbank-frontend/package.json apps/kennisbank-frontend/package.json
-COPY ./packages/catalogi-data/package.json packages/catalogi-data/package.json
-COPY ./packages/preview-button/package.json packages/preview-button/package.json
-COPY ./packages/samenwerkende-catalogi/package.json packages/samenwerkende-catalogi/package.json
-COPY ./packages/strapi-plugin-gemeente-select/package.json packages/strapi-plugin-gemeente-select/package.json
-COPY ./packages/strapi-plugin-scheme-select/package.json packages/strapi-plugin-scheme-select/package.json
-COPY ./packages/strapi-tiptap-editor/package.json packages/strapi-tiptap-editor/package.json
-COPY ./packages/ui/package.json packages/ui/package.json
-COPY ./packages/upl/package.json packages/upl/package.json
-COPY ./packages/strapi-plugin-uniform-product-name/package.json packages/strapi-plugin-uniform-product-name/package.json
-COPY ./packages/strapi-plugin-open-forms-embed/package.json packages/strapi-plugin-open-forms-embed/package.json
-COPY ./packages/strapi-plugin-uuid-field/package.json packages/strapi-plugin-uuid-field/package.json
-COPY ./packages/strapi-plugin-env-label/package.json packages/strapi-plugin-env-label/package.json
-COPY ./packages/strapi-plugin-language/package.json packages/strapi-plugin-language/package.json
-
-
-# Build target dependencies #
-#############################
-FROM build AS dependencies
-# Install prod dependencies
-COPY ./patches /opt/app/patches
-RUN yarn install --frozen-lockfile
-
-# Build target builder #
-########################
-FROM build AS builder
-COPY --from=dependencies /opt/app/node_modules /opt/app/node_modules
-COPY . /opt/app/
-RUN npm run build --workspace @frameless/upl && \
- npm run build --workspace @frameless/strapi-plugin-uniform-product-name && \
- npm run build --workspace @frameless/strapi-tiptap-editor && \
- npm run build --workspace @frameless/ui && \
- npm run build --workspace @frameless/catalogi-data && \
- npm run build --workspace @frameless/samenwerkende-catalogi && \
- npm run build --workspace @frameless/pdc-sc && \
- npm run build --workspace @frameless/strapi-plugin-open-forms-embed && \
- npm run build --workspace @frameless/strapi-plugin-uuid-field && \
- npm run build --workspace @frameless/strapi-plugin-env-label && \
- npm run build --workspace @frameless/strapi-plugin-language && \
- npm run build --workspace @frameless/overige-objecten-api && \
- npm run build --workspace @frameless/strapi-admin-extensions
-
-# Build target production #
-###########################
-FROM build AS development
-COPY --from=builder /opt/app /opt/app
-COPY --from=dependencies /opt/app/node_modules /opt/app/node_modules
-RUN chmod +x ./bin/wait-for-it.sh
-EXPOSE 1337
-CMD ["yarn", "dev"]
+
+RUN apk add --no-cache \
+ build-base \
+ python3 \
+ autoconf \
+ automake \
+ vips-dev
+
+COPY --from=dependencies /app .
+
+# Create necessary Strapi directories
+RUN mkdir -p /app/apps/pdc-dashboard/dist && \
+ mkdir -p /app/apps/pdc-dashboard/.strapi && \
+ mkdir -p /app/apps/vth-dashboard/dist && \
+ mkdir -p /app/apps/vth-dashboard/.strapi && \
+ chmod +x ./bin/wait-for-it.sh 2>/dev/null || true
+
+EXPOSE 1337 3000 4000
+
+CMD ["pnpm", "dev"]
\ No newline at end of file
diff --git a/Dockerfile.prod b/Dockerfile.prod
index 1238e5d23..1cec348d3 100644
--- a/Dockerfile.prod
+++ b/Dockerfile.prod
@@ -1,67 +1,103 @@
-FROM node:20.19-alpine3.22 AS build
-# Update package index and install build dependencies.
-# These packages are needed for building native modules and ensuring compatibility.
-RUN set -eux; apk update && apk add --no-cache \
- git libc6-compat build-base gcc bash autoconf automake \
- zlib-dev libpng-dev vips-dev shadow python3 python3-dev py3-pip && \
- # Create a symlink for python3 so node-gyp can locate Python as 'python'
- ln -sf "$(which python3)" /usr/bin/python && \
- echo "Python version: $(python --version)"
-
-# Set build-time variable for the public URL.
-ARG STRAPI_PUBLIC_URL
-ENV STRAPI_PUBLIC_URL=${STRAPI_PUBLIC_URL}
-
-# Set working directory and update PATH for local binaries.
-WORKDIR /opt/app
-ENV PATH /opt/app/node_modules/.bin:$PATH
-
-# Install global Node.js tools needed for patching and native module building.
-RUN yarn global add patch-package node-gyp
-
-# Copy dependency definitions.
-COPY ./package.json ./yarn.lock ./
-
-# Copy all application files.
-COPY ./ .
-
-# Install all dependencies (including devDependencies) required for the build.
-RUN set -eux; yarn install --frozen-lockfile
-
-# --- Builder stage: Compile and build assets ---
-FROM build AS builder
-# Copy remaining files and build the application.
-COPY . /opt/app/
-RUN set -eux; NODE_OPTIONS="--max-old-space-size=4096" yarn build
-
-# --- Production stage: Prepare a lean image for runtime ---
-FROM node:20.19-alpine3.22 AS production
-# Copy built application from the builder stage.
-COPY --from=builder /opt/app /opt/app
-
-WORKDIR /opt/app
-# Install runtime dependencies and ensure essential tools are available.
-RUN set -eux; \
- apk add --no-cache git make g++ python3 bash && \
- ln -sf "$(which python3)" /usr/bin/python && \
- yarn global add patch-package && \
- export PYTHON=/usr/bin/python3 && \
- yarn install --production=true
-
-# Configure container permissions and executable permissions.
-RUN set -eux; \
- chmod +x ./bin/wait-for-it.sh && \
- addgroup --system --gid 1001 pdcgroup && \
- adduser --system --uid 1001 --ingroup pdcgroup pdcuser && \
- chown -R pdcuser:pdcgroup /opt/app
-
-# Switch to a non-root user for security.
+# ---------- base ----------
+FROM node:24-alpine AS base
+
+RUN apk add --no-cache libc6-compat git bash
+
+ENV PNPM_HOME="/pnpm"
+ENV PATH="$PNPM_HOME:$PATH"
+ENV PUPPETEER_SKIP_DOWNLOAD=true
+RUN corepack enable && corepack prepare pnpm@10.23.0 --activate
+
+WORKDIR /app
+
+
+# ---------- prune workspace (ALL apps) ----------
+FROM base AS pruner
+
+COPY . .
+
+# Prune everything - no specific app, builds all
+RUN pnpm dlx turbo prune \
+ @frameless/pdc-dashboard \
+ @frameless/vth-dashboard \
+ @frameless/pdc-frontend \
+ @frameless/vth-frontend \
+ @frameless/pdc-sc \
+ @frameless/strapi-admin-extensions \
+ @frameless/overige-objecten-api \
+ @frameless/editoria11y \
+ @frameless/samenwerkende-catalogi \
+ @frameless/ui \
+ @frameless/utils \
+ --docker
+
+
+# ---------- dependencies ----------
+FROM base AS deps
+
+RUN apk add --no-cache \
+ build-base \
+ python3 \
+ autoconf \
+ automake \
+ vips-dev
+
+COPY --from=pruner /app/out/json/ .
+COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
+
+RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
+ pnpm install --frozen-lockfile
+
+
+# ---------- build (ALL apps) ----------
+FROM deps AS builder
+
+COPY --from=pruner /app/out/full/ .
+
+# Build everything - no filter, builds all apps
+RUN NODE_OPTIONS="--max-old-space-size=4096" \
+ pnpm \
+ --filter @frameless/utils \
+ --filter @frameless/ui \
+ --filter @frameless/editoria11y \
+ --filter @frameless/samenwerkende-catalogi \
+ --filter @frameless/pdc-dashboard \
+ --filter @frameless/pdc-frontend \
+ --filter @frameless/overige-objecten-api \
+ --filter @frameless/strapi-admin-extensions \
+ --filter @frameless/vth-dashboard \
+ --filter @frameless/vth-frontend \
+ --filter @frameless/pdc-sc \
+ build
+
+
+# ---------- runtime ----------
+FROM node:24-alpine AS runner
+
+RUN apk add --no-cache libc6-compat vips bash
+
+ENV PNPM_HOME="/pnpm"
+ENV PATH="$PNPM_HOME:$PATH"
+ENV NODE_ENV=production
+ENV CI=true
+
+RUN corepack enable && corepack prepare pnpm@10.23.0 --activate
+
+WORKDIR /app
+
+COPY --from=builder /app .
+COPY bin ./bin
+RUN chmod +x ./bin/wait-for-it.sh 2>/dev/null || true
+
+RUN pnpm install --prod --frozen-lockfile
+
+RUN addgroup -S pdcgroup -g 1001 \
+ && adduser -S pdcuser -u 1001 -G pdcgroup \
+ && chown -R pdcuser:pdcgroup /app
+
USER pdcuser
-# Set runtime environment and expose application port.
-ARG NODE_ENV=production
-ENV NODE_ENV=${NODE_ENV}
-EXPOSE 1337
+# Expose all ports
+EXPOSE 1337 1338 3000 4000 4001 4002
-# Set default command.
-CMD ["yarn", "start"]
+# No CMD - let docker-compose specify what to run
\ No newline at end of file
diff --git a/ENVIRONMENT_VARIABLES.md b/ENVIRONMENT_VARIABLES.md
index 105754bd2..eaafa677d 100644
--- a/ENVIRONMENT_VARIABLES.md
+++ b/ENVIRONMENT_VARIABLES.md
@@ -21,22 +21,25 @@
| `DATABASE_SSL` | string | ✅ | | Enable SSL to use an encrypted connection. Typically `false` during development, and `true` in production. | `` | `false` |
| `DATABASE_USERNAME` | string | ✅ | | Username for your database. | `postgres` | `postgres` |
| `FLO_LEGAL_API_TOKEN` | string | | ✅ | API token for the Flo Legal API, used to access legal documents and templates. | `xxxxxxxx` | `xxxxxxxx` |
-| `FLO_LEGAL_API_URL` | url | | | URL for the Flo Legal API, used to access legal documents and templates. | `https://example.com/api` | `` |
-| `FRONTEND_PUBLIC_URL` | url | ✅ | | URL where the preview of pages in the Strapi Dashboard are hosted. You can use the Docker container name as the URL, for example: http://pdc_frontend:3000. | `` | `http://pdc_frontend:3000` |
+| `FLO_LEGAL_API_URL` | url | | | URL for the Flo Legal API, used to access legal documents and templates. | `https://services-acc.flolegal.app/builder-api` | `` |
+| `FRONTEND_PUBLIC_URL` | url | ✅ | | URL where the preview of pages in the Strapi Dashboard are hosted. You can use the Docker container name as the URL, for example: http://overige-objecten-api:3000. | `` | `http://localhost:3000` |
| `HOST` | hostname | ✅ | | Strapi Dashboard hostname where users will access Strapi. Use `0.0.0.0` to respond to any hostname. | `0.0.0.0` | `0.0.0.0` |
| `JWT_SECRET` | base64 | ✅ | ✅ | Secret for signing JSON Web Tokens for the Strapi API | `pIUa5y9fIImYq2Nf92AUEw==` | `` |
| `KCM_SURVEY_API_KEY` | string | | ✅ | API key for the KCM Survey widget, used to authenticate requests to the KCM survey service. | `add-your-api-key` | `` |
| `KCM_SURVEY_ID` | string | | | Survey ID for the KCM Survey widget, used to identify which survey to display. | `add-kcm-survey-id` | `` |
| `KCM_SURVEY_STYLESHEETS_LINK` | url | | | URL for the custom stylesheet for the KCM Survey widget (e.g., https://www.utrecht.nl/fileadmin/kcm-radio.css). | `https://www.utrecht.nl` | `https://www.utrecht.nl` |
| `KCM_SURVEY_URL` | url | | | Base URL for the KCM Survey service where the survey widget is hosted. | `https://viewer.kcmg.nl/` | `https://viewer.kcmg.nl/` |
+| `KISS_PREVIEW_TOKEN` | base64 | ✅ | ✅ | Configure Strapi Dashboard and the website with the same secret, to be able to show unpublished content in preview mode. | `aGVsbG8gd29ybGQ=` | `aGVsbG8gd29ybGQ=` |
+| `KISS_PREVIEW_URL` | url | ✅ | | URL where the preview of pages in the Strapi Dashboard are hosted. You can use the Docker container name as the URL, for example: http://overige-objecten-api:3000. | `http://localhost:4001/api/v2/preview` | `http://localhost:4001/api/v2/preview` |
| `MATOMO_CONTAINER_ID` | string | | | Container ID for the Matomo tracker API. See: https://matomo.org/faq/general/faq_19212/ | `36D0C594-E017-485B-B032-C436` | `36D0C594-E017-485B-B032-C436` |
| `MATOMO_HOST` | url | | | URL where the Matomo is hosted | `https://example.com` | `https://example.com` |
| `MATOMO_SITE_ID` | string | | | Website ID for the Matomo tracker API. See: https://matomo.org/faq/general/faq_19212/ | `36D0C594-E017-485B-B032-C436` | `36D0C594-E017-485B-B032-C436EC876E5B` |
-| `NODE_ENV` | string | ✅ | | Enable production mode for Node.js. See: https://nodejs.org/en/learn/getting-started/nodejs-the-difference-between-development-and-production | `` | `production` |
+| `NODE_ENV` | string | ✅ | | Enable production mode for Node.js. See: https://nodejs.org/en/learn/getting-started/nodejs-the-difference-between-development-and-production | `` | `development` |
| `OGONE_PAYMENT_SERVICE_URL` | url | | | URL of the Ogone payment form target. Typically you will use different values for acceptance and production. | `` | `` |
| `OPEN_FORMS_API_TOKEN` | base64 | | ✅ | Open Forms API token, used to access access forms from the website and the Strapi Dashboard. See: https://open-forms.readthedocs.io/en/stable/configuration/general/cms_integration.html | `pIUa5y9fIImYq2Nf92AUEw==` | `pIUa5y9fIImYq2Nf92AUEw==` |
| `OPEN_FORMS_API_URL` | url | | | URL for the Open Forms v2 API. See: https://open-forms.readthedocs.io/en/stable/developers/embedding.html | `` | `http://localhost:8000/api/v2/` |
| `OPEN_FORMS_CSS_URL` | url | | | URL for the Open Forms SDK CSS file. See: https://open-forms.readthedocs.io/en/stable/developers/embedding.html | `` | `http://localhost:8000/static/sdk/open-forms-sdk.css` |
+| `OPEN_FORMS_MOCK` | string | | | Whether to use a mock implementation of the Open Forms API. This can be used for development and testing without needing to set up an actual Open Forms instance. | `` | `false` |
| `OPEN_FORMS_SDK_URL` | url | | | URL for the Open Forms SDK JavaScript file. See: https://open-forms.readthedocs.io/en/stable/developers/embedding.html | `http://localhost:8000/static/sdk/open-forms-sdk.js` | `http://localhost:8000/static/sdk/open-forms-sdk.js` |
| `OVERIGE_OBJECTEN_API_CORS` | url | | | CORS settings for the Overige Objecten API. This is used to access the Overige Objecten API from the frontend. | `http://localhost:8000` | `` |
| `OVERIGE_OBJECTEN_API_PORT` | port-number | | | Port number for the Overige Objecten API. This is used to access the Overige Objecten API from the frontend. | `4001` | `4001` |
@@ -48,7 +51,7 @@
| `PREVIEW_SECRET_TOKEN` | base64 | ✅ | ✅ | Configure Strapi Dashboard and the website with the same secret, to be able to show unpublished content in preview mode. | `` | `SGVsbG8sIHdvcmxkIQ==` |
| `STRAPI_ADMIN_EXTENSIONS_PORT` | port-number | | | Port number for the Strapi Admin Extensions. This is used to access the Strapi Admin Extensions from the frontend. | `4002` | `4002` |
| `STRAPI_API_TOKEN` | string | | ✅ | API token for the Strapi CMS, used to authenticate requests to the Strapi REST or GraphQL API. | `strapiToken_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx` | `` |
-| `STRAPI_ENV_LABEL` | string | | | Text describing the environment, used to warn users of Strapi Dashboard when they are not working in production. Can not be localized. | `` | `Development` |
-| `STRAPI_PRIVATE_URL` | | ✅ | | URL where Strapi is available on the internal network, for example to access the GraphQL API. You can use the Docker container name, e.g. http://pdc_strapi:1337. | `http://pdc_strapi:1337` | `http://pdc_strapi:1337` |
-| `STRAPI_PUBLIC_URL` | url | ✅ | | URL where Strapi is available to the public. You can use the Docker container name, e.g. http://pdc_strapi:1337. | `http://pdc_strapi:1337` | `http://pdc_strapi:1337` |
+| `STRAPI_ENV_LABEL` | string | | | Text describing the environment, used to warn users of Strapi Dashboard when they are not working in production. Can not be localized. | `` | `development` |
+| `STRAPI_PRIVATE_URL` | | ✅ | | URL where Strapi is available on the internal network, for example to access the GraphQL API. You can use the Docker container name, e.g. http://pdc_strapi:1337. | `http://localhost:1337` | `http://localhost:1337` |
+| `STRAPI_PUBLIC_URL` | url | ✅ | | URL where Strapi is available to the public. You can use the Docker container name, e.g. http://pdc_strapi:1337. | `http://localhost:1337` | `http://localhost:1337` |
| `TRANSFER_TOKEN_SALT` | base64 | | ✅ | Salt for generating Transfer tokens. If no transfer token salt is defined, transfer features will be disabled. See: https://docs.strapi.io/user-docs/settings/transfer-tokens | `HtHorFUigcXPMtDF/kAHcQ==` | `` |
diff --git a/README.md b/README.md
index cf127db43..e3fed2201 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@ cd frameless-cms
Before running the app, make sure you have the following prerequisites installed on your machine:
-- [Yarn Classic](https://classic.yarnpkg.com/lang/en/) version 1.22.19
+- [PNPM](https://pnpm.io/) version 1.22.19
- [Node.js](https://nodejs.org/) version [20.18.1](https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V20.md#20.18.1)
Follow these steps to prepare the app:
@@ -27,13 +27,13 @@ Follow these steps to prepare the app:
2. Install Dependencies:
```shell
- yarn install
+ pnpm install
```
3. Build the Project:
```shell
- yarn build
+ pnpm build
```
These commands will ensure that all necessary dependencies are installed and the project is built successfully. Once completed, you'll be ready to run the app.
@@ -43,30 +43,27 @@ These commands will ensure that all necessary dependencies are installed and the
To run the application as a Docker container on your Mac, follow these steps:
1. **Install Docker Desktop:**
-
- Go to the Docker [website](https://docs.docker.com/desktop/install/mac-install/) and download Docker Desktop for Mac.
- Install Docker Desktop by following the installation instructions for macOS.
- Ensure you have `docker-compose` available. For example by installing [docker-compose with Homebrew](https://formulae.brew.sh/formula/docker-compose)
2. **Launch Docker Desktop:**
-
- Once Docker Desktop is installed, launch it from your Applications folder.
3. **Add Environments variables to the project**
If there are no existing environment variables, run:
```bash
- yarn init:env
+ pnpm run env
```
This command generates a .env file containing the necessary environment variables.
The generated values are suitable for the PDC project in Docker production environment.
-
- Running PDC in development mode
- Update the generated .env file or create a .pdc.dev.env file with the same variables, modified for development.
- For development, you need to adjust certain variables (for example, set NODE_ENV=development) to ensure the environment behaves correctly.
+ Update the generated .env file or create a `.pdc.dev.env` file with the same variables, modified for development.
+ For development, you need to adjust certain variables (for example, set `NODE_ENV=development`) to ensure the environment behaves correctly.
- Running the VTH project
- Run the same yarn init:env command, then create a .vth.dev.env file with the same variables, modified for VTH development.
+ Run the same `pnpm run env` command, then create a `.vth.dev.env` file with the same variables, modified for VTH development.
Environment variable definitions are based on the .envrc.json file in the project root.
You can find detailed documentation for each variable in the [Environment Variables](./ENVIRONMENT_VARIABLES.md) file.
@@ -74,7 +71,7 @@ To run the application as a Docker container on your Mac, follow these steps:
**Note:** When updating `.envrc.json`, run the following command to regenerate the documentation:
```bash
- yarn generate-env-docs
+ pnpm generate-env-docs
```
4. Run the Docker Image:
@@ -95,7 +92,6 @@ To run the application as a Docker container on your Mac, follow these steps:
```
Valid project names are:
-
- `pdc-dashboard`
- `vth-dashboard`
- `kennisbank-dashboard`
@@ -106,54 +102,41 @@ To run the application as a Docker container on your Mac, follow these steps:
## Start the server without Docker
-Before starting the server without Docker, create a `.env` file for both the frontend and the Strapi dashboard app.
+Before starting the server without Docker, create a `.env` file for both the frontend and the Strapi dashboard app: `pnpm run env`.
-**Frontend env:**
+Then run:
```shell
-FRONTEND_PUBLIC_URL=http://localhost:3000
-# these three environments variables below are required to be able to test the openFormsEmbed into the frontend. So you have to start the OpenForms server on your local machine
-PANDOSEARCH_API_URL= # You can use the following API URL to test the functionality of the SearchBar component: https://public.pandosearch.com/developer.pandosearch.com/. Valid keys that can be used in the searchBar field include: search, server, highlighting, and help.
-PREVIEW_SECRET_TOKEN= # the value should matched the same environment variable on the Strapi dashboard
-STRAPI_PRIVATE_URL=http://0.0.0.0:1337/
-STRAPI_PUBLIC_URL=http://0.0.0.0:1337/
-
+pnpm run development
```
-**Strapi Dashboard env:**
+Choose: `dev`, `both`, `pdc` to start the development frontend + backend for PDC.
-```shell
-NODE_ENV=development
-ADMIN_JWT_SECRET=
-API_TOKEN_SALT=
-APP_KEYS=
-FRONTEND_PUBLIC_URL=http://localhost:3000
-HOST=0.0.0.0
-JWT_SECRET=
-OPEN_FORMS_API_TOKEN=
-OPEN_FORMS_API_URL=http://localhost:8000/api/v2/
-PORT=1337
-# the value should matched the same environment variable on the Frontend
-PREVIEW_SECRET_TOKEN=
-STRAPI_PRIVATE_URL=http://0.0.0.0:1337
-STRAPI_PUBLIC_URL=http://0.0.0.0:1337
-```
+Visit the following URLs:
+
+- for the website
+- for the Strapi admin interface
+
+When starting Strapi for the first time:
+
+1. Go to and create an account.
+2. Go to and login.
+3. Go to and click "Import".
### Two Options to Run the Server
1. Using the Start Script:
-
- Navigate to the app's root level and run the following command:
```shell
- yarn development
+ pnpm development
```
- You will be prompted with options to select. For example:
```bash
- ❯ yarn development
- yarn run v1.22.19
+ ❯ pnpm development
+ pnpm run v1.22.19
$ node scripts/start.js
? Select an option: …
Build # build a specific app or both
@@ -164,19 +147,17 @@ STRAPI_PUBLIC_URL=http://0.0.0.0:1337
- Choose the "Dev" option to start a development server for the specified app.
2. Basic Way:
-
- Change to the app's directory (e.g., `cd apps/pdc-dashboard`) and run:
```shell
- yarn dev
+ pnpm dev
```
-3. Using Yarn Workspaces:
-
+3. Using Pnpm Workspaces:
- Run the following command from the project root:
```shell
- yarn workspace @frameless/pdc-dashboard dev
+ pnpm workspace @frameless/pdc-dashboard dev
```
Choose the option that best fits your workflow to start the server without Docker. Once the server is running, you can access the application from your browser.
@@ -188,18 +169,16 @@ Choose the option that best fits your workflow to start the server without Docke
If you encounter problems with building the project or starting the server, try the following steps:
1. **Remove Build Folders:**
-
- Execute the following commands from the app root level:
```bash
- yarn clean
- yarn build
+ pnpm clean
+ pnpm build
```
- This will remove the `/build` or `/dist` folders and rebuild the entire project.
2. **Remove Node Modules:**
-
- If the issue persists, remove the `node_modules` folders for all the apps using the command:
```bash
@@ -209,7 +188,7 @@ If you encounter problems with building the project or starting the server, try
- Afterward, reinstall the dependencies with:
```bash
- yarn install
+ pnpm install
```
These steps can help resolve common issues related to project build and server startup. If you continue to face problems, feel free to reach out for further assistance.
diff --git a/apps/kennisbank-dashboard/.gitignore b/apps/kennisbank-dashboard/.gitignore
deleted file mode 100644
index 25864658e..000000000
--- a/apps/kennisbank-dashboard/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/public/uploads/*
-!/public/uploads/.gitkeep
diff --git a/apps/kennisbank-dashboard/CHANGELOG.md b/apps/kennisbank-dashboard/CHANGELOG.md
deleted file mode 100644
index 17f6df976..000000000
--- a/apps/kennisbank-dashboard/CHANGELOG.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# @frameless/kennisbank-dashboard
-
-## 0.1.7
-
-### Patch Changes
-
-- Updated dependencies [8b2df3c]
- - @frameless/strapi-tiptap-editor@0.3.2
-
-## 0.1.6
-
-### Patch Changes
-
-- @frameless/strapi-tiptap-editor@0.3.1
-
-## 0.1.5
-
-### Patch Changes
-
-- Updated dependencies [d96fe22]
-- Updated dependencies [3b6b5b8]
- - @frameless/strapi-tiptap-editor@0.3.0
-
-## 0.1.4
-
-### Patch Changes
-
-- Updated dependencies [ed4d2a4]
- - @frameless/strapi-tiptap-editor@0.2.0
-
-## 0.1.3
-
-### Patch Changes
-
-- 981db82: Update Strapi-afhankelijkheden om het paginering probleem in het dashboard op te lossen ([GitHub Issue frameless/strapi#715](https://github.com/frameless/strapi/issues/715)).
-- Updated dependencies [f40ac6b]
- - @frameless/strapi-tiptap-editor@0.1.1
-
-## 0.1.2
-
-### Patch Changes
-
-- Updated dependencies [06c52b9]
- - @frameless/strapi-tiptap-editor@0.1.0
-
-## 0.1.1
-
-### Patch Changes
-
-- Updated dependencies [82fa577]
-- Updated dependencies [82fa577]
- - @frameless/strapi-tiptap-editor@0.0.0
diff --git a/apps/kennisbank-dashboard/README.md b/apps/kennisbank-dashboard/README.md
deleted file mode 100644
index ad964a948..000000000
--- a/apps/kennisbank-dashboard/README.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# 🚀 Getting started with Strapi
-
-Strapi comes with a full featured [Command Line Interface](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html) (CLI) which lets you scaffold and manage your project in seconds.
-
-## `develop`
-
-Start your Strapi application with autoReload enabled. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-develop)
-
-```shell
-npm run dev
-# or
-yarn dev
-```
-
-### `start`
-
-Start your Strapi application with autoReload disabled. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-start)
-
-```shell
-npm run start
-# or
-yarn start
-```
-
-### `build`
-
-Build your admin panel. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-build)
-
-```shell
-npm run build
-# or
-yarn build
-```
diff --git a/apps/kennisbank-dashboard/config/admin.ts b/apps/kennisbank-dashboard/config/admin.ts
deleted file mode 100644
index 894637602..000000000
--- a/apps/kennisbank-dashboard/config/admin.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-export default ({ env }) => ({
- watchIgnoredFiles: ['**/config/sync/**'],
- auth: {
- secret: env('ADMIN_JWT_SECRET'),
- },
- apiToken: {
- salt: env('API_TOKEN_SALT'),
- },
- transfer: {
- token: {
- salt: env('TRANSFER_TOKEN_SALT'),
- },
- },
-});
diff --git a/apps/kennisbank-dashboard/config/api.ts b/apps/kennisbank-dashboard/config/api.ts
deleted file mode 100644
index 37f7c14a4..000000000
--- a/apps/kennisbank-dashboard/config/api.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export default {
- rest: {
- defaultLimit: 25,
- maxLimit: 100,
- withCount: true,
- },
-};
diff --git a/apps/kennisbank-dashboard/config/database.ts b/apps/kennisbank-dashboard/config/database.ts
deleted file mode 100644
index f72bb5144..000000000
--- a/apps/kennisbank-dashboard/config/database.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-export default ({ env }) => {
- const client = env('DATABASE_CLIENT', 'sqlite');
-
- const connections = {
- postgres: {
- connection: {
- connectionString: env('DATABASE_URL'),
- host: env('DATABASE_HOST'),
- port: env.int('DATABASE_PORT'),
- database: env('DATABASE_NAME'),
- user: env('DATABASE_USERNAME'),
- password: env('DATABASE_PASSWORD'),
- ssl: env.bool('DATABASE_SSL', false) && {
- key: env('DATABASE_SSL_KEY', undefined),
- cert: env('DATABASE_SSL_CERT', undefined),
- ca: env('DATABASE_SSL_CA', undefined),
- capath: env('DATABASE_SSL_CAPATH', undefined),
- cipher: env('DATABASE_SSL_CIPHER', undefined),
- rejectUnauthorized: env.bool('DATABASE_SSL_REJECT_UNAUTHORIZED', true),
- },
- schema: env('DATABASE_SCHEMA', 'public'),
- },
- pool: { min: env.int('DATABASE_POOL_MIN', 0), max: env.int('DATABASE_POOL_MAX', 30) },
- },
- sqlite: {
- connection: {
- filename: env('DATABASE_FILENAME', '.tmp/data.db'),
- useNullAsDefault: true,
- debug: false,
- },
- useNullAsDefault: true,
- },
- };
-
- return {
- connection: {
- client,
- ...connections[client],
- acquireConnectionTimeout: env.int('DATABASE_CONNECTION_TIMEOUT', 60000),
- },
- };
-};
diff --git a/apps/kennisbank-dashboard/config/middlewares.ts b/apps/kennisbank-dashboard/config/middlewares.ts
deleted file mode 100644
index 3ab20d955..000000000
--- a/apps/kennisbank-dashboard/config/middlewares.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export default [
- 'strapi::errors',
- 'strapi::security',
- 'strapi::cors',
- 'strapi::poweredBy',
- 'strapi::logger',
- 'strapi::query',
- 'strapi::body',
- 'strapi::session',
- 'strapi::favicon',
- 'strapi::public',
-];
diff --git a/apps/kennisbank-dashboard/config/plugins.ts b/apps/kennisbank-dashboard/config/plugins.ts
deleted file mode 100644
index 40751a512..000000000
--- a/apps/kennisbank-dashboard/config/plugins.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-const { apolloPrometheusPlugin } = require('strapi-prometheus');
-
-export default () => ({
- 'strapi-tiptap-editor': {
- enabled: true,
- },
- 'strapi-prometheus': {
- enabled: true,
- graphql: {
- enabled: true,
- config: {
- apolloServer: {
- plugins: [apolloPrometheusPlugin], // add the plugin to get apollo metrics
- tracing: true, // this must be true to get some of the data needed to create the metrics
- },
- },
- },
- },
- upload: {
- config: {
- providerOptions: {
- localServer: {
- maxage: 300000,
- },
- },
- },
- },
- publisher: {
- enabled: true,
- },
-});
diff --git a/apps/kennisbank-dashboard/config/server.ts b/apps/kennisbank-dashboard/config/server.ts
deleted file mode 100644
index a54a2414c..000000000
--- a/apps/kennisbank-dashboard/config/server.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export default ({ env }) => ({
- host: env('HOST', '0.0.0.0'),
- port: env.int('PORT', 1337),
- app: {
- keys: env.array('APP_KEYS'),
- },
- webhooks: {
- populateRelations: env.bool('WEBHOOKS_POPULATE_RELATIONS', false),
- },
-});
diff --git a/apps/kennisbank-dashboard/database/migrations/.gitkeep b/apps/kennisbank-dashboard/database/migrations/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/apps/kennisbank-dashboard/favicon.ico b/apps/kennisbank-dashboard/favicon.ico
deleted file mode 100644
index 03eec51b1..000000000
Binary files a/apps/kennisbank-dashboard/favicon.ico and /dev/null differ
diff --git a/apps/kennisbank-dashboard/package.json b/apps/kennisbank-dashboard/package.json
deleted file mode 100644
index 4fd7c4934..000000000
--- a/apps/kennisbank-dashboard/package.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "name": "@frameless/kennisbank-dashboard",
- "private": true,
- "version": "0.1.7",
- "description": "A Strapi application",
- "keywords": [],
- "scripts": {
- "dev": "strapi develop",
- "develop:watch": "strapi develop --watch-admin",
- "start": "strapi start",
- "prebuild": "npm run clean",
- "build": "strapi build",
- "strapi": "strapi",
- "lint": "eslint --ext .js src",
- "lint:fix": "eslint --ext .js src --fix",
- "lint-build": "tsc --noEmit --project tsconfig.json",
- "clean": "rimraf build .cache dist"
- },
- "dependencies": {
- "@frameless/strapi-tiptap-editor": "0.3.2",
- "@strapi/plugin-graphql": "4.25.23",
- "@strapi/plugin-i18n": "4.25.23",
- "@strapi/plugin-users-permissions": "4.25.23",
- "@strapi/strapi": "4.25.23",
- "better-sqlite3": "12.2.0",
- "pg": "8.11.3",
- "slugify": "1.6.6",
- "strapi-plugin-config-sync": "1.2.6",
- "strapi-plugin-publisher": "1.5.7",
- "strapi-plugin-slugify": "2.3.8",
- "strapi-prometheus": "1.9.1",
- "react": "18.3.1",
- "react-dom": "18.3.1",
- "react-router-dom": "5.3.4",
- "styled-components": "5.3.11"
- },
- "author": {
- "name": ""
- },
- "strapi": {
- "uuid": "3d9f46d7-679c-4633-8821-761d8bbb5bea"
- },
- "engines": {
- "node": "20.x.x"
- },
- "license": "EUPL-1.2",
- "devDependencies": {
- "node-sass": "8.0.0",
- "sass-loader": "13.2.2",
- "scss": "0.2.4"
- },
- "repository": {
- "type": "git+ssh",
- "url": "git@github.com:frameless/strapi.git",
- "directory": "apps/kennisbank-dashboard"
- }
-}
diff --git a/apps/kennisbank-dashboard/public/uploads/.gitkeep b/apps/kennisbank-dashboard/public/uploads/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/apps/kennisbank-dashboard/src/admin/app.ts b/apps/kennisbank-dashboard/src/admin/app.ts
deleted file mode 100644
index 2d7d0dd90..000000000
--- a/apps/kennisbank-dashboard/src/admin/app.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-const config = {
- locales: ['nl'],
- notifications: {
- releases: false,
- },
- translations: {
- nl: {
- 'app.components.HomePage.welcome': 'Welkom 👋',
- 'content-manager.popUpWarning.warning.has-draft-relations.title': 'Bevestiging',
- 'content-manager.popUpWarning.warning.publish-question': 'Wil je nog steeds publiceren?',
- 'content-manager.popUpWarning.warning.unpublish-question': 'Weet je zeker dat je het niet wilt publiceren?',
- 'content-manager.popUpWarning.warning.unpublish':
- 'Als je deze inhoud niet publiceert, wordt deze automatisch een concept.',
- 'content-manager.popUpWarning.warning.updateAllSettings': 'Dit zal al je instellingen wijzigen.',
- },
- },
-};
-
-const bootstrap = () => {};
-
-export default {
- config,
- bootstrap,
-};
diff --git a/apps/kennisbank-dashboard/src/admin/tsconfig.json b/apps/kennisbank-dashboard/src/admin/tsconfig.json
deleted file mode 100644
index 843155d34..000000000
--- a/apps/kennisbank-dashboard/src/admin/tsconfig.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "extends": "@strapi/typescript-utils/tsconfigs/admin",
- "include": ["./"],
- "exclude": ["node_modules/", "build/", "dist/", "**/*.test.ts"]
-}
diff --git a/apps/kennisbank-dashboard/src/admin/webpack.config.js b/apps/kennisbank-dashboard/src/admin/webpack.config.js
deleted file mode 100644
index 5a5b486f1..000000000
--- a/apps/kennisbank-dashboard/src/admin/webpack.config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const { NormalModuleReplacementPlugin } = require('webpack');
-
-// eslint-disable-next-line no-undef
-module.exports = (config) => {
- config.plugins.push(new NormalModuleReplacementPlugin(/^tippy\.js$/, 'tippy.js/dist/tippy-bundle.umd.min.js'));
- // Allow scss modules
- config.resolve = {
- ...config.resolve,
- extensions: [...config.resolve.extensions, '.scss'],
- };
-
- // Configure a SASS loader
- config.module.rules.push({
- test: /\.s[ac]ss$/i,
- use: [
- 'style-loader',
- 'css-loader',
- 'sass-loader',
- {
- loader: 'sass-loader',
- },
- ],
- });
- return config;
-};
diff --git a/apps/kennisbank-dashboard/src/api/.gitkeep b/apps/kennisbank-dashboard/src/api/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/apps/kennisbank-dashboard/src/api/homepage/content-types/homepage/schema.json b/apps/kennisbank-dashboard/src/api/homepage/content-types/homepage/schema.json
deleted file mode 100644
index 31e00c631..000000000
--- a/apps/kennisbank-dashboard/src/api/homepage/content-types/homepage/schema.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "kind": "singleType",
- "collectionName": "homepages",
- "info": {
- "singularName": "homepage",
- "pluralName": "homepages",
- "displayName": "Homepage",
- "description": ""
- },
- "options": {
- "draftAndPublish": true
- },
- "pluginOptions": {},
- "attributes": {
- "title": {
- "type": "string",
- "required": true,
- "default": "Kennisbank"
- },
- "content": {
- "type": "richtext"
- }
- }
-}
diff --git a/apps/kennisbank-dashboard/src/api/homepage/controllers/homepage.ts b/apps/kennisbank-dashboard/src/api/homepage/controllers/homepage.ts
deleted file mode 100644
index 402a7388e..000000000
--- a/apps/kennisbank-dashboard/src/api/homepage/controllers/homepage.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * homepage controller
- */
-
-import { factories } from '@strapi/strapi';
-
-export default factories.createCoreController('api::homepage.homepage');
diff --git a/apps/kennisbank-dashboard/src/api/homepage/routes/homepage.ts b/apps/kennisbank-dashboard/src/api/homepage/routes/homepage.ts
deleted file mode 100644
index 14e14f2d6..000000000
--- a/apps/kennisbank-dashboard/src/api/homepage/routes/homepage.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * homepage router
- */
-
-import { factories } from '@strapi/strapi';
-
-export default factories.createCoreRouter('api::homepage.homepage');
diff --git a/apps/kennisbank-dashboard/src/api/homepage/services/homepage.ts b/apps/kennisbank-dashboard/src/api/homepage/services/homepage.ts
deleted file mode 100644
index 4369109c7..000000000
--- a/apps/kennisbank-dashboard/src/api/homepage/services/homepage.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * homepage service
- */
-
-import { factories } from '@strapi/strapi';
-
-export default factories.createCoreService('api::homepage.homepage');
diff --git a/apps/kennisbank-dashboard/src/extensions/.gitkeep b/apps/kennisbank-dashboard/src/extensions/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/apps/kennisbank-dashboard/src/index.ts b/apps/kennisbank-dashboard/src/index.ts
deleted file mode 100644
index 0fb9cd48e..000000000
--- a/apps/kennisbank-dashboard/src/index.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-export default {
- /**
- * An asynchronous register function that runs before
- * your application is initialized.
- *
- * This gives you an opportunity to extend code.
- */
-
- register(/*{ strapi }: { strapi: Strapi }*/) {},
-
- /**
- * An asynchronous bootstrap function that runs before
- * your application gets started.
- *
- * This gives you an opportunity to set up your data model,
- * run jobs, or perform some special logic.
- */
- async bootstrap(/*{ strapi }: { strapi: Strapi }*/) {},
-};
diff --git a/apps/kennisbank-dashboard/tsconfig.json b/apps/kennisbank-dashboard/tsconfig.json
deleted file mode 100644
index c0a45b6a9..000000000
--- a/apps/kennisbank-dashboard/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "@strapi/typescript-utils/tsconfigs/server",
- "compilerOptions": {
- "outDir": "dist",
- "rootDir": ".",
- "allowJs": true
- },
- "include": ["./", "src/**/*.json"],
- "exclude": ["node_modules/", "build/", "dist/", ".cache/", ".tmp/", "src/admin/", "**/*.test.ts", "src/plugins/**"]
-}
diff --git a/apps/kennisbank-frontend/.eslintrc.json b/apps/kennisbank-frontend/.eslintrc.json
deleted file mode 100644
index e7fc2048e..000000000
--- a/apps/kennisbank-frontend/.eslintrc.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "extends": "next/core-web-vitals",
- "settings": {
- "next": {
- "rootDir": "../kennisbank-frontend"
- }
- },
- "rules": {
- "@next/next/no-html-link-for-pages": "off"
- }
-}
diff --git a/apps/kennisbank-frontend/.gitignore b/apps/kennisbank-frontend/.gitignore
deleted file mode 100644
index c87c9b392..000000000
--- a/apps/kennisbank-frontend/.gitignore
+++ /dev/null
@@ -1,36 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# next.js
-/.next/
-/out/
-
-# production
-/build
-
-# misc
-.DS_Store
-*.pem
-
-# debug
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-.pnpm-debug.log*
-
-# local env files
-.env*.local
-
-# vercel
-.vercel
-
-# typescript
-*.tsbuildinfo
-next-env.d.ts
diff --git a/apps/kennisbank-frontend/CHANGELOG.md b/apps/kennisbank-frontend/CHANGELOG.md
deleted file mode 100644
index ce25e6612..000000000
--- a/apps/kennisbank-frontend/CHANGELOG.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# @frameless/kennisbank-frontend
-
-## 0.1.5
-
-### Patch Changes
-
-- Updated dependencies [95b7a51]
-- Updated dependencies [dcaab2a]
-- Updated dependencies [c16e0f5]
- - @frameless/ui@0.1.2
-
-## 0.1.4
-
-### Patch Changes
-
-- Updated dependencies [ca71dbf]
- - @frameless/ui@0.1.1
-
-## 0.1.3
-
-### Patch Changes
-
-- Updated dependencies [8c536da]
-- Updated dependencies [2c0382b]
-- Updated dependencies [2c0382b]
- - @frameless/ui@0.1.0
-
-## 0.1.2
-
-### Patch Changes
-
-- Updated dependencies [06c52b9]
- - @frameless/ui@0.0.1
-
-## 0.1.1
-
-### Patch Changes
-
-- Updated dependencies [82fa577]
-- Updated dependencies [82fa577]
- - @frameless/ui@0.0.0
diff --git a/apps/kennisbank-frontend/README.md b/apps/kennisbank-frontend/README.md
deleted file mode 100644
index fcce90d54..000000000
--- a/apps/kennisbank-frontend/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# Utrecht Kennisbank Frontend
diff --git a/apps/kennisbank-frontend/next-sitemap.config.js b/apps/kennisbank-frontend/next-sitemap.config.js
deleted file mode 100644
index 5d1b9b8d3..000000000
--- a/apps/kennisbank-frontend/next-sitemap.config.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/** @type {import('next-sitemap').IConfig} */
-module.exports = {
- siteUrl: process.env.FRONTEND_PUBLIC_URL,
- generateRobotsTxt: true,
- exclude: ['/sitemap.xml'],
- robotsTxtOptions: {
- additionalSitemaps: [`${process.env.FRONTEND_PUBLIC_URL}/sitemap.xml`],
- },
-};
diff --git a/apps/kennisbank-frontend/next.config.js b/apps/kennisbank-frontend/next.config.js
deleted file mode 100644
index 4530be87c..000000000
--- a/apps/kennisbank-frontend/next.config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const { URL } = require('url');
-const { hostname, protocol, port } = new URL(process.env.STRAPI_PUBLIC_URL || 'http://localhost:1337');
-/** @type {import('next').NextConfig} */
-const nextConfig = {
- images: {
- remotePatterns: [
- {
- protocol: protocol.replace(/:$/, ''),
- hostname: hostname,
- port: port,
- },
- ],
- },
- experimental: {
- serverActions: true,
- },
-};
-
-module.exports = nextConfig;
diff --git a/apps/kennisbank-frontend/package.json b/apps/kennisbank-frontend/package.json
deleted file mode 100644
index 2798cc74f..000000000
--- a/apps/kennisbank-frontend/package.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "name": "@frameless/kennisbank-frontend",
- "version": "0.1.5",
- "private": true,
- "author": "@frameless",
- "description": "Utrecht kennisbank frontend application",
- "license": "EUPL-1.2",
- "keywords": [],
- "scripts": {
- "dev": "next dev -p 3000",
- "prebuild": "npm run clean",
- "clean": "rimraf build .next",
- "build": "next build",
- "start": "next start -p 3000",
- "lint": "next lint",
- "lint-build": "tsc --noEmit --project tsconfig.json"
- },
- "dependencies": {
- "@tanstack/react-query": "4.29.25",
- "@frameless/ui": "0.1.2",
- "@utrecht/component-library-css": "4.2.0",
- "@utrecht/component-library-react": "5.0.0",
- "@utrecht/design-tokens": "1.1.0",
- "@utrecht/web-component-library-react": "1.3.0",
- "accept-language": "3.0.18",
- "classnames": "2.3.3",
- "i18next": "22.5.1",
- "i18next-browser-languagedetector": "7.0.2",
- "i18next-resources-to-backend": "1.1.4",
- "is-absolute-url": "4.0.1",
- "next": "13.5.6",
- "next-sitemap": "4.1.8",
- "react": "18.3.1",
- "react-dom": "18.3.1",
- "react-i18next": "12.3.1",
- "react-loading-skeleton": "3.3.1",
- "sharp": "0.32.6"
- },
- "devDependencies": {
- "eslint": "8.35.0",
- "eslint-config-next": "13.2.4",
- "sass": "1.63.6"
- },
- "repository": {
- "type": "git+ssh",
- "url": "git@github.com:frameless/strapi.git",
- "directory": "apps/kennisbank-frontend"
- }
-}
diff --git a/apps/kennisbank-frontend/public/next.svg b/apps/kennisbank-frontend/public/next.svg
deleted file mode 100644
index 5174b28c5..000000000
--- a/apps/kennisbank-frontend/public/next.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/kennisbank-frontend/public/thirteen.svg b/apps/kennisbank-frontend/public/thirteen.svg
deleted file mode 100644
index 8977c1bd1..000000000
--- a/apps/kennisbank-frontend/public/thirteen.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/kennisbank-frontend/public/vercel.svg b/apps/kennisbank-frontend/public/vercel.svg
deleted file mode 100644
index d2f842227..000000000
--- a/apps/kennisbank-frontend/public/vercel.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/kennisbank-frontend/src/app/[locale]/layout.tsx b/apps/kennisbank-frontend/src/app/[locale]/layout.tsx
deleted file mode 100644
index b6fc2b52b..000000000
--- a/apps/kennisbank-frontend/src/app/[locale]/layout.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import classnames from 'classnames';
-import { dir } from 'i18next';
-import type { Metadata } from 'next';
-import React from 'react';
-import { QueryClientProvider } from '@/client';
-import '@utrecht/component-library-css';
-import '@utrecht/design-tokens/dist/index.css';
-import { useTranslation } from '../i18n/index';
-import '@frameless/ui/dist/bundle.css';
-
-interface LayoutProps {
- children: React.ReactNode;
- params: {
- locale: string;
- };
-}
-
-type Params = {
- params: {
- locale: string;
- };
-};
-
-export async function generateMetadata({ params: { locale } }: Params): Promise {
- // eslint-disable-next-line react-hooks/rules-of-hooks
- const { t } = await useTranslation(locale, 'common');
- return {
- title: {
- template: `%s | ${t('website-setting.website-name')}`,
- default: `${t('website-setting.website-name')}`,
- },
- };
-}
-
-const RootLayout = async ({ children, params: { locale } }: LayoutProps) => {
- return (
-
-
-
- {children}
-
-
-
- );
-};
-export default RootLayout;
diff --git a/apps/kennisbank-frontend/src/app/[locale]/page.tsx b/apps/kennisbank-frontend/src/app/[locale]/page.tsx
deleted file mode 100644
index 24a35585c..000000000
--- a/apps/kennisbank-frontend/src/app/[locale]/page.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { Metadata } from 'next';
-import React from 'react';
-import { useTranslation } from '../i18n';
-
-export interface Fields {
- title: string;
- body: string;
-}
-
-type Params = {
- params: {
- locale: string;
- };
-};
-
-export async function generateMetadata({ params: { locale } }: Params): Promise {
- // eslint-disable-next-line react-hooks/rules-of-hooks
- const { t } = await useTranslation(locale, 'home-page');
- return {
- title: t('seo.title'),
- description: t('seo.description'),
- };
-}
-
-const Home = async ({ params: { locale } }: { params: any }) => {
- const { t } = await useTranslation(locale, 'home-page');
- return (
-
-
{t('h1')}
-
- );
-};
-
-export default Home;
diff --git a/apps/kennisbank-frontend/src/app/i18n/client.ts b/apps/kennisbank-frontend/src/app/i18n/client.ts
deleted file mode 100644
index 55a20f62b..000000000
--- a/apps/kennisbank-frontend/src/app/i18n/client.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-'use client';
-
-import i18next from 'i18next';
-import LanguageDetector from 'i18next-browser-languagedetector';
-import resourcesToBackend from 'i18next-resources-to-backend';
-import { useEffect } from 'react';
-import { initReactI18next, useTranslation as useTranslationOrg } from 'react-i18next';
-import { getOptions } from './settings';
-
-// on client side the normal singleton is ok
-i18next
- .use(initReactI18next)
- .use(LanguageDetector)
- .use(resourcesToBackend((language: string, namespace: string) => import(`./locales/${language}/${namespace}.json`)))
- .init({
- ...getOptions(),
- lng: undefined, // let detect the language on client side
- detection: {
- order: ['path', 'htmlTag', 'cookie', 'navigator'],
- },
- });
-
-const runsOnServerSide = typeof window === 'undefined';
-
-export function useTranslation(lng: string, ns: string | string[], options?: any) {
- const ret = useTranslationOrg(ns, options);
- const { i18n } = ret;
- if (runsOnServerSide && i18n.resolvedLanguage !== lng) {
- i18n.changeLanguage(lng);
- } else {
- // eslint-disable-next-line react-hooks/rules-of-hooks
- useEffect(() => {
- if (i18n.resolvedLanguage === lng) return;
- i18n.changeLanguage(lng);
- }, [lng, i18n]);
- }
- return ret;
-}
diff --git a/apps/kennisbank-frontend/src/app/i18n/index.ts b/apps/kennisbank-frontend/src/app/i18n/index.ts
deleted file mode 100644
index a202de7fc..000000000
--- a/apps/kennisbank-frontend/src/app/i18n/index.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-'use server';
-
-import { createInstance, InitOptions } from 'i18next';
-import resourcesToBackend from 'i18next-resources-to-backend';
-import { initReactI18next } from 'react-i18next/initReactI18next';
-import { getOptions } from './settings';
-
-const initI18next = async (locale: string, ns: string | string[]) => {
- // on the server-side, we create a new instance for each render because during compilation everything seems to be executed in parallel
- const i18nInstance = createInstance();
- await i18nInstance
- .use(initReactI18next)
- .use(resourcesToBackend((language: string, namespace: string) => import(`./locales/${language}/${namespace}.json`)))
- .init(getOptions(locale, ns as string) as InitOptions); // Type assertion to InitOptions
- return i18nInstance;
-};
-
-export async function useTranslation(locale: string, ns: string | string[], options: any = {}) {
- const i18nextInstance = await initI18next(locale, ns);
-
- return {
- t: i18nextInstance.getFixedT(locale, Array.isArray(ns) ? ns[0] : ns, options.keyPrefix),
- i18n: i18nextInstance,
- };
-}
diff --git a/apps/kennisbank-frontend/src/app/i18n/locales/nl/common.json b/apps/kennisbank-frontend/src/app/i18n/locales/nl/common.json
deleted file mode 100644
index 7dbd8b229..000000000
--- a/apps/kennisbank-frontend/src/app/i18n/locales/nl/common.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "website-setting": {
- "website-name": "Gemeente Utrecht"
- }
-}
diff --git a/apps/kennisbank-frontend/src/app/i18n/locales/nl/home-page.json b/apps/kennisbank-frontend/src/app/i18n/locales/nl/home-page.json
deleted file mode 100644
index 31b0dd7ff..000000000
--- a/apps/kennisbank-frontend/src/app/i18n/locales/nl/home-page.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "seo": {
- "title": "Toezicht en Handhaving | Gemeente Utrecht",
- "description": "Beschrijving"
- },
- "h1": "Hello kennisbank"
-}
diff --git a/apps/kennisbank-frontend/src/app/i18n/settings.ts b/apps/kennisbank-frontend/src/app/i18n/settings.ts
deleted file mode 100644
index 7a33b63a1..000000000
--- a/apps/kennisbank-frontend/src/app/i18n/settings.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-export const fallbackLng = 'nl';
-export const languages = ['nl'];
-export const defaultNS = 'common';
-
-export function getOptions(lng = fallbackLng, ns = defaultNS) {
- return {
- debug: !!process.env.I18N_DEBUG,
- supportedLngs: languages,
- preload: languages,
- fallbackLng,
- lng,
- fallbackNS: defaultNS,
- defaultNS,
- ns,
- };
-}
diff --git a/apps/kennisbank-frontend/src/client.tsx b/apps/kennisbank-frontend/src/client.tsx
deleted file mode 100644
index 8c6ae88f3..000000000
--- a/apps/kennisbank-frontend/src/client.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-'use client';
-import { QueryClientProvider as Provider, QueryClient } from '@tanstack/react-query';
-import React from 'react';
-
-const queryClient = new QueryClient();
-
-export const QueryClientProvider = ({ children }: any) => {
- return {children};
-};
diff --git a/apps/kennisbank-frontend/src/middleware.ts b/apps/kennisbank-frontend/src/middleware.ts
deleted file mode 100644
index 376142a02..000000000
--- a/apps/kennisbank-frontend/src/middleware.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import acceptLanguage from 'accept-language';
-import { NextResponse } from 'next/server';
-import { NextRequest } from 'next/server';
-import { fallbackLng, languages } from './app/i18n/settings';
-acceptLanguage.languages(languages);
-
-export const config = {
- matcher: ['/((?!api|_next/static|_next/image|assets|favicon.ico|sw.js).*)'],
-};
-
-const cookieName = 'i18next';
-
-export function middleware(req: NextRequest) {
- if (req.nextUrl.pathname.indexOf('icon') > -1 || req.nextUrl.pathname.indexOf('chrome') > -1)
- return NextResponse.next();
- let lng;
- if (req.cookies.has(cookieName)) lng = acceptLanguage.get(req.cookies.get(cookieName)?.value);
- if (!lng) lng = acceptLanguage.get(req.headers.get('Accept-Language'));
- if (!lng) lng = fallbackLng;
-
- // Redirect if lng in path is not supported
- if (
- !languages.some((loc) => req.nextUrl.pathname.startsWith(`/${loc}`)) &&
- !req.nextUrl.pathname.startsWith('/_next')
- ) {
- return NextResponse.redirect(new URL(`/${lng}${req.nextUrl.pathname}`, req.url));
- }
-
- if (req.headers.has('referer')) {
- const refererUrl = new URL(req.headers.get('referer') as any);
- const lngInReferer = languages.find((l) => refererUrl.pathname.startsWith(`/${l}`));
- const response = NextResponse.next();
- if (lngInReferer) response.cookies.set(cookieName, lngInReferer);
- return response;
- }
- const requestHeaders = new Headers(req.headers);
- requestHeaders.set('x-pathname', req.nextUrl.pathname);
- return NextResponse.next();
-}
diff --git a/apps/kennisbank-frontend/src/util/create-url.ts b/apps/kennisbank-frontend/src/util/create-url.ts
deleted file mode 100644
index 8b5b25b5b..000000000
--- a/apps/kennisbank-frontend/src/util/create-url.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { format, parse } from 'url';
-
-export const createURL = (baseUrl: string, params: any) => {
- const parsedUrl = parse(baseUrl, true);
- parsedUrl.query = params;
- const finalUrl = format(parsedUrl);
- return finalUrl;
-};
diff --git a/apps/kennisbank-frontend/src/util/createStrapiURL.ts b/apps/kennisbank-frontend/src/util/createStrapiURL.ts
deleted file mode 100644
index eff61bc8f..000000000
--- a/apps/kennisbank-frontend/src/util/createStrapiURL.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { URL } from 'url';
-export const createStrapiURL = () => {
- if (!process.env.STRAPI_PRIVATE_URL) {
- throw new Error('STRAPI_PRIVATE_URL is not defined');
- }
-
- const { origin } = new URL(process.env.STRAPI_PRIVATE_URL);
- const strapiURL = `${origin}/graphql`;
- return strapiURL;
-};
diff --git a/apps/kennisbank-frontend/src/util/fetchData.ts b/apps/kennisbank-frontend/src/util/fetchData.ts
deleted file mode 100644
index 240e7cf3e..000000000
--- a/apps/kennisbank-frontend/src/util/fetchData.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-interface FetchDataProps {
- url: string;
- query?: string;
- variables?: any;
- method?: string;
-}
-
-export const fetchData = async ({ url, query, variables, method = 'POST' }: FetchDataProps) => {
- try {
- const response = await fetch(url, {
- method,
- cache: 'no-store',
- headers: {
- 'Content-Type': 'application/json',
- },
- body:
- method !== 'GET'
- ? JSON.stringify({
- query,
- variables,
- })
- : undefined,
- });
- if (!response.ok) {
- const { logger } = new ErrorHandler();
- logger();
- switch (response.status) {
- case 400:
- throw new ErrorHandler(response.statusText, {
- statusCode: 400,
- });
- case 403:
- throw new ErrorHandler('Forbidden', {
- statusCode: 403,
- });
- case 404:
- throw new ErrorHandler('Not found', {
- statusCode: 404,
- });
- case 422:
- throw new ErrorHandler('Unprocessable entity', {
- statusCode: 422,
- });
- case 500:
- throw new ErrorHandler('Internal server error', {
- statusCode: 500,
- });
- case 503:
- logger();
- throw new ErrorHandler('Service unavailable', {
- statusCode: 503,
- });
- case 504:
- throw new ErrorHandler('Gateway timeout', {
- statusCode: 504,
- });
- case 505:
- throw new ErrorHandler('HTTP version not supported', {
- statusCode: 505,
- });
- default:
- throw new ErrorHandler(response.statusText, {
- statusCode: response.status,
- });
- }
- }
- const data = await response.json();
- return data;
- } catch (error: any) {
- throw new ErrorHandler(error?.message, {
- statusCode: error?.options?.statusCode,
- });
- }
-};
-
-type Options = {
- statusCode: number;
-};
-
-export class ErrorHandler extends Error {
- constructor(
- message?: string,
- public options?: Options,
- ) {
- super(message);
- this.name = 'ErrorHandler';
- this.options = options;
- }
- // this logger method should be used only on the server side to give some information when something goes wrong
- logger() {
- // eslint-disable-next-line no-console
- console.log({
- message: this?.message,
- statusCode: this?.options?.statusCode,
- });
- }
-}
diff --git a/apps/kennisbank-frontend/src/util/getImageBaseUrl.ts b/apps/kennisbank-frontend/src/util/getImageBaseUrl.ts
deleted file mode 100644
index b4c480c33..000000000
--- a/apps/kennisbank-frontend/src/util/getImageBaseUrl.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export const getImageBaseUrl = () => {
- if (!process.env.STRAPI_PUBLIC_URL) {
- throw new Error('`STRAPI_PUBLIC_URL` is required to construct the image URL in the Markdown component.');
- }
- const url = new URL(process.env.STRAPI_PUBLIC_URL);
- return url?.origin;
-};
diff --git a/apps/kennisbank-frontend/tsconfig.json b/apps/kennisbank-frontend/tsconfig.json
deleted file mode 100644
index 0c7555fa7..000000000
--- a/apps/kennisbank-frontend/tsconfig.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": true,
- "forceConsistentCasingInFileNames": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "node",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "preserve",
- "incremental": true,
- "plugins": [
- {
- "name": "next"
- }
- ],
- "paths": {
- "@/*": ["./src/*"]
- }
- },
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
-}
diff --git a/apps/overige-objecten-api/README.md b/apps/overige-objecten-api/README.md
index 0ff766857..d3d75a90a 100644
--- a/apps/overige-objecten-api/README.md
+++ b/apps/overige-objecten-api/README.md
@@ -56,21 +56,21 @@ Then, follow these steps:
1. Build the project:
```shell
- yarn build
+ pnpm build
```
2. Start the PDC-dashboard server:
```shell
- yarn workspace @frameless/pdc-dashboard dev
+ pnpm --filter @frameless/pdc-dashboard dev
```
3. Start the overige-objecten-api server:
```shell
- yarn workspace @frameless/overige-objecten-api dev
+ pnpm --filter @frameless/overige-objecten-api dev
```
diff --git a/apps/overige-objecten-api/eslint.config.mjs b/apps/overige-objecten-api/eslint.config.mjs
new file mode 100644
index 000000000..0d92fee21
--- /dev/null
+++ b/apps/overige-objecten-api/eslint.config.mjs
@@ -0,0 +1,13 @@
+import { config } from '@frameless/eslint-config/base';
+
+const customConfig = {
+ languageOptions: {
+ globals: {
+ URL: 'readonly',
+ process: 'readonly',
+ __dirname: 'readonly',
+ URLSearchParams: 'readonly',
+ },
+ },
+};
+export default [...config, customConfig];
diff --git a/apps/overige-objecten-api/esm-loader.mjs b/apps/overige-objecten-api/esm-loader.mjs
new file mode 100644
index 000000000..4999571ac
--- /dev/null
+++ b/apps/overige-objecten-api/esm-loader.mjs
@@ -0,0 +1,11 @@
+// Node.js ESM loader that rewrites `classnames/bind` to `classnames/bind.js` at runtime.
+// Required because @frameless/ui externalizes all deps in its Vite build, preserving the
+// bare specifier in dist/index.esm.js which Node.js strict ESM cannot resolve.
+// Equivalent to Next.js `transpilePackages` — fixes resolution without modifying the UI package.
+
+export const resolve = async (specifier, context, nextResolve) => {
+ if (specifier === 'classnames/bind') {
+ return nextResolve('classnames/bind.js', context);
+ }
+ return nextResolve(specifier, context);
+};
diff --git a/apps/overige-objecten-api/global.d.ts b/apps/overige-objecten-api/global.d.ts
index 0441f6ed0..1f6a84653 100644
--- a/apps/overige-objecten-api/global.d.ts
+++ b/apps/overige-objecten-api/global.d.ts
@@ -1,5 +1,4 @@
-import type { KennisartikelObject, VACObject } from '../types';
-import type { ErrorPageData } from '../types';
+import type { KennisartikelObject, VACObject, ErrorPageData } from '../types';
declare global {
interface Window {
__VAC_PREVIEW_DATA__: VACObject;
diff --git a/apps/overige-objecten-api/gql/gql.ts b/apps/overige-objecten-api/gql/gql.ts
new file mode 100644
index 000000000..c90ce50ca
--- /dev/null
+++ b/apps/overige-objecten-api/gql/gql.ts
@@ -0,0 +1,97 @@
+/* eslint-disable */
+import * as types from './graphql';
+import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
+
+/**
+ * Map of all GraphQL operations in the project.
+ *
+ * This map has several performance disadvantages:
+ * 1. It is not tree-shakeable, so it will include all operations in the project.
+ * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
+ * 3. It does not support dead code elimination, so it will add unused operations.
+ *
+ * Therefore it is highly recommended to use the babel or swc plugin for production.
+ */
+const documents = {
+ "\nquery getAllProducts(\n $locale: I18NLocaleCode\n $page: Int\n $pageSize: Int\n $start: Int\n $limit: Int\n) {\n products_connection(\n locale: $locale\n pagination: {\n start: $start\n limit: $limit\n page: $page\n pageSize: $pageSize\n }\n ) {\n pageInfo {\n total\n page\n pageSize\n pageCount\n }\n nodes {\n id: documentId\n documentId\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n __typename\n ... on ComponentComponentsContactInformationPublic {\n contact_information_public {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n id\n label\n href\n textContent\n logo\n appearance\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n categorie6: kennisartikelCategorie\n column {\n id\n title\n logoButton {\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n categorie9: kennisartikelCategorie\n item(pagination: { limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n }\n}\n": types.GetAllProductsDocument,
+ "\nquery getProductByUUIDOrDocumentId(\n $locale: I18NLocaleCode\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n products(\n locale: $locale\n filters: {\n or: [\n { uuid: { eq: $uuid } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n publishedAt\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsContactInformationPublic {\n component: __typename\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n component: __typename\n id\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n content {\n id\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n # Merged RichText fragment to provide both original and aliased fields\n ... on ComponentComponentsUtrechtRichText {\n component: __typename\n id\n content\n kennisartikelCategorie\n categorie5: kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n component: __typename\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n component: __typename\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n component: __typename\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n id\n label\n href\n textContent\n logo\n appearance\n __typename\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n component: __typename\n categorie6: kennisartikelCategorie\n column {\n id\n title\n logoButton {\n component: __typename\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n component: __typename\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n component: __typename\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n component: __typename\n categorie9: kennisartikelCategorie\n item(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n component: __typename\n }\n }\n }\n price {\n price(pagination: { start: 0, limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n": types.GetProductByUuidOrDocumentIdDocument,
+ "\nquery getProductForUpdate(\n $locale: I18NLocaleCode\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n products(\n locale: $locale\n filters: {\n or: [\n { uuid: { eq: $uuid } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n publishedAt\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsContactInformationPublic {\n component: __typename\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n component: __typename\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n # Merged RichText fragment to provide both original and aliased fields\n ... on ComponentComponentsUtrechtRichText {\n component: __typename\n content\n kennisartikelCategorie\n categorie5: kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n component: __typename\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n component: __typename\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n component: __typename\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n label\n href\n textContent\n logo\n appearance\n __typename\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n component: __typename\n categorie6: kennisartikelCategorie\n column {\n title\n logoButton {\n component: __typename\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n component: __typename\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n component: __typename\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n component: __typename\n categorie9: kennisartikelCategorie\n item(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n label\n }\n }\n }\n additional_information {\n content {\n uuid\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n component: __typename\n }\n }\n }\n price {\n price(pagination: { start: 0, limit: -1 }) {\n currency\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n": types.GetProductForUpdateDocument,
+ "\nquery getInternalFields($uuid: String) {\n internalFields(filters: { content: { uuid: { eq: $uuid } } }) {\n id: documentId\n title\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n}\n": types.GetInternalFieldsDocument,
+ "\nmutation createInternalField($data: InternalFieldInput!) {\n createInternalField(data: $data) {\n id: documentId\n title\n content {\n id\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n}\n": types.CreateInternalFieldDocument,
+ "\nmutation updateInternalField($data: InternalFieldInput!, $id: ID!) {\n updateInternalField(data: $data, documentId: $id) {\n content {\n id\n uuid\n contentBlock {\n content\n }\n }\n }\n}\n": types.UpdateInternalFieldDocument,
+ "\nmutation createKennisartikel($data: ProductInput!, $locale: I18NLocaleCode) {\n createProduct(data: $data, locale: $locale) {\n id: documentId\n content\n title\n slug\n uuid\n updatedAt\n createdAt\n locale\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n component: __typename\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n component: __typename\n internal_field {\n title\n id: documentId\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n": types.CreateKennisartikelDocument,
+ "\nmutation updateKennisartikel($data: ProductInput!, $locale: I18NLocaleCode, $id: ID!) {\n updateProduct(data: $data, locale: $locale, documentId: $id) {\n id: documentId\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n locale\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n component: __typename\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n component: __typename\n internal_field {\n title\n id: documentId\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n": types.UpdateKennisartikelDocument,
+ "\nquery getAllVacItems($page: Int, $pageSize: Int, $start: Int, $limit: Int) {\n vacs_connection(\n pagination: {\n start: $start\n limit: $limit\n page: $page\n pageSize: $pageSize\n }\n ) {\n pageInfo {\n total\n page\n pageSize\n pageCount\n }\n nodes {\n id: documentId\n createdAt\n updatedAt\n title\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n relatedVACs(pagination: { start: 0, limit: -1 }) {\n vac {\n uuid\n }\n }\n relatedProducts(pagination: { start: 0, limit: -1 }) {\n uuid\n title\n }\n\n vac {\n uuid\n vraag\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n afdelingen {\n afdelingId\n afdelingNaam\n }\n toelichting\n keywords\n }\n }\n }\n}\n\n": types.GetAllVacItemsDocument,
+ "\nquery getVacItemByUUIDOrDocumentId(\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n vacs(\n filters: {\n or: [\n { vac: { uuid: { eq: $uuid } } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n createdAt\n updatedAt\n publishedAt\n title\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n relatedVACs(pagination: { start: 0, limit: -1 }) {\n vac {\n uuid\n }\n }\n relatedProducts(pagination: { start: 0, limit: -1 }) {\n uuid\n title\n }\n vac {\n uuid\n vraag\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n afdelingen {\n afdelingId\n afdelingNaam\n }\n toelichting\n keywords\n }\n }\n}\n": types.GetVacItemByUuidOrDocumentIdDocument,
+ "\n mutation createVac($data: VacInput!) {\n createVac(data: $data) {\n id: documentId\n createdAt\n publishedAt\n title\n vac {\n id\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n uuid\n toelichting\n afdelingen {\n afdelingId\n afdelingNaam\n }\n keywords\n }\n }\n}\n": types.CreateVacDocument,
+ "\nmutation updateVac($data: VacInput!, $id: ID!) {\n updateVac(documentId: $id, data: $data) {\n id: documentId\n createdAt\n publishedAt\n title\n vac {\n id\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n uuid\n toelichting\n afdelingen {\n afdelingId\n afdelingNaam\n }\n keywords\n }\n }\n}\n": types.UpdateVacDocument,
+};
+
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ *
+ *
+ * @example
+ * ```ts
+ * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
+ * ```
+ *
+ * The query argument is unknown!
+ * Please regenerate the types.
+ */
+export function graphql(source: string): unknown;
+
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nquery getAllProducts(\n $locale: I18NLocaleCode\n $page: Int\n $pageSize: Int\n $start: Int\n $limit: Int\n) {\n products_connection(\n locale: $locale\n pagination: {\n start: $start\n limit: $limit\n page: $page\n pageSize: $pageSize\n }\n ) {\n pageInfo {\n total\n page\n pageSize\n pageCount\n }\n nodes {\n id: documentId\n documentId\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n __typename\n ... on ComponentComponentsContactInformationPublic {\n contact_information_public {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n id\n label\n href\n textContent\n logo\n appearance\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n categorie6: kennisartikelCategorie\n column {\n id\n title\n logoButton {\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n categorie9: kennisartikelCategorie\n item(pagination: { limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n }\n}\n"): (typeof documents)["\nquery getAllProducts(\n $locale: I18NLocaleCode\n $page: Int\n $pageSize: Int\n $start: Int\n $limit: Int\n) {\n products_connection(\n locale: $locale\n pagination: {\n start: $start\n limit: $limit\n page: $page\n pageSize: $pageSize\n }\n ) {\n pageInfo {\n total\n page\n pageSize\n pageCount\n }\n nodes {\n id: documentId\n documentId\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n __typename\n ... on ComponentComponentsContactInformationPublic {\n contact_information_public {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n }\n }\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n id\n label\n href\n textContent\n logo\n appearance\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n categorie6: kennisartikelCategorie\n column {\n id\n title\n logoButton {\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n categorie9: kennisartikelCategorie\n item(pagination: { limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nquery getProductByUUIDOrDocumentId(\n $locale: I18NLocaleCode\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n products(\n locale: $locale\n filters: {\n or: [\n { uuid: { eq: $uuid } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n publishedAt\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsContactInformationPublic {\n component: __typename\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n component: __typename\n id\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n content {\n id\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n # Merged RichText fragment to provide both original and aliased fields\n ... on ComponentComponentsUtrechtRichText {\n component: __typename\n id\n content\n kennisartikelCategorie\n categorie5: kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n component: __typename\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n component: __typename\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n component: __typename\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n id\n label\n href\n textContent\n logo\n appearance\n __typename\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n component: __typename\n categorie6: kennisartikelCategorie\n column {\n id\n title\n logoButton {\n component: __typename\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n component: __typename\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n component: __typename\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n component: __typename\n categorie9: kennisartikelCategorie\n item(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n component: __typename\n }\n }\n }\n price {\n price(pagination: { start: 0, limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n"): (typeof documents)["\nquery getProductByUUIDOrDocumentId(\n $locale: I18NLocaleCode\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n products(\n locale: $locale\n filters: {\n or: [\n { uuid: { eq: $uuid } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n publishedAt\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsContactInformationPublic {\n component: __typename\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n component: __typename\n id\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n content {\n id\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n # Merged RichText fragment to provide both original and aliased fields\n ... on ComponentComponentsUtrechtRichText {\n component: __typename\n id\n content\n kennisartikelCategorie\n categorie5: kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n component: __typename\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n component: __typename\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n component: __typename\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n id\n label\n href\n textContent\n logo\n appearance\n __typename\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n component: __typename\n categorie6: kennisartikelCategorie\n column {\n id\n title\n logoButton {\n component: __typename\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n component: __typename\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n component: __typename\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n component: __typename\n categorie9: kennisartikelCategorie\n item(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n id\n label\n }\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n component: __typename\n }\n }\n }\n price {\n price(pagination: { start: 0, limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nquery getProductForUpdate(\n $locale: I18NLocaleCode\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n products(\n locale: $locale\n filters: {\n or: [\n { uuid: { eq: $uuid } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n publishedAt\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsContactInformationPublic {\n component: __typename\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n component: __typename\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n # Merged RichText fragment to provide both original and aliased fields\n ... on ComponentComponentsUtrechtRichText {\n component: __typename\n content\n kennisartikelCategorie\n categorie5: kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n component: __typename\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n component: __typename\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n component: __typename\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n label\n href\n textContent\n logo\n appearance\n __typename\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n component: __typename\n categorie6: kennisartikelCategorie\n column {\n title\n logoButton {\n component: __typename\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n component: __typename\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n component: __typename\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n component: __typename\n categorie9: kennisartikelCategorie\n item(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n label\n }\n }\n }\n additional_information {\n content {\n uuid\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n component: __typename\n }\n }\n }\n price {\n price(pagination: { start: 0, limit: -1 }) {\n currency\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n"): (typeof documents)["\nquery getProductForUpdate(\n $locale: I18NLocaleCode\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n products(\n locale: $locale\n filters: {\n or: [\n { uuid: { eq: $uuid } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n publishedAt\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsContactInformationPublic {\n component: __typename\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n }\n ... on ComponentComponentsInternalBlockContent {\n component: __typename\n internal_field {\n title\n id: documentId\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n content\n }\n }\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n keywords\n }\n }\n }\n # Merged RichText fragment to provide both original and aliased fields\n ... on ComponentComponentsUtrechtRichText {\n component: __typename\n content\n kennisartikelCategorie\n categorie5: kennisartikelCategorie\n }\n ... on ComponentComponentsUtrechtImage {\n component: __typename\n categorie2: kennisartikelCategorie\n imageData {\n name\n alternativeText\n caption\n width\n height\n formats\n url\n }\n }\n ... on ComponentComponentsUtrechtLogoButton {\n component: __typename\n categorie3: kennisartikelCategorie\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n ... on ComponentComponentsUtrechtSpotlight {\n component: __typename\n categorie4: kennisartikelCategorie\n content\n type\n logoButton {\n label\n href\n textContent\n logo\n appearance\n __typename\n }\n }\n ... on ComponentComponentsUtrechtMultiColumnsButton {\n component: __typename\n categorie6: kennisartikelCategorie\n column {\n title\n logoButton {\n component: __typename\n appearance\n href\n label\n logo\n openFormsEmbed\n textContent\n }\n }\n }\n ... on ComponentComponentsUtrechtLink {\n component: __typename\n categorie7: kennisartikelCategorie\n href\n textContent\n icon\n language\n }\n ... on ComponentComponentsFaq {\n component: __typename\n categorie8: kennisartikelCategorie\n pdc_faq {\n title\n faq(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n label\n }\n }\n }\n ... on ComponentComponentsUtrechtAccordion {\n component: __typename\n categorie9: kennisartikelCategorie\n item(pagination: { start: 0, limit: -1 }) {\n body\n headingLevel\n label\n }\n }\n }\n additional_information {\n content {\n uuid\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n component: __typename\n }\n }\n }\n price {\n price(pagination: { start: 0, limit: -1 }) {\n currency\n label\n uuid\n value\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nquery getInternalFields($uuid: String) {\n internalFields(filters: { content: { uuid: { eq: $uuid } } }) {\n id: documentId\n title\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n}\n"): (typeof documents)["\nquery getInternalFields($uuid: String) {\n internalFields(filters: { content: { uuid: { eq: $uuid } } }) {\n id: documentId\n title\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nmutation createInternalField($data: InternalFieldInput!) {\n createInternalField(data: $data) {\n id: documentId\n title\n content {\n id\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n}\n"): (typeof documents)["\nmutation createInternalField($data: InternalFieldInput!) {\n createInternalField(data: $data) {\n id: documentId\n title\n content {\n id\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nmutation updateInternalField($data: InternalFieldInput!, $id: ID!) {\n updateInternalField(data: $data, documentId: $id) {\n content {\n id\n uuid\n contentBlock {\n content\n }\n }\n }\n}\n"): (typeof documents)["\nmutation updateInternalField($data: InternalFieldInput!, $id: ID!) {\n updateInternalField(data: $data, documentId: $id) {\n content {\n id\n uuid\n contentBlock {\n content\n }\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nmutation createKennisartikel($data: ProductInput!, $locale: I18NLocaleCode) {\n createProduct(data: $data, locale: $locale) {\n id: documentId\n content\n title\n slug\n uuid\n updatedAt\n createdAt\n locale\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n component: __typename\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n component: __typename\n internal_field {\n title\n id: documentId\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n"): (typeof documents)["\nmutation createKennisartikel($data: ProductInput!, $locale: I18NLocaleCode) {\n createProduct(data: $data, locale: $locale) {\n id: documentId\n content\n title\n slug\n uuid\n updatedAt\n createdAt\n locale\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n component: __typename\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n component: __typename\n internal_field {\n title\n id: documentId\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nmutation updateKennisartikel($data: ProductInput!, $locale: I18NLocaleCode, $id: ID!) {\n updateProduct(data: $data, locale: $locale, documentId: $id) {\n id: documentId\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n locale\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n component: __typename\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n component: __typename\n internal_field {\n title\n id: documentId\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n"): (typeof documents)["\nmutation updateKennisartikel($data: ProductInput!, $locale: I18NLocaleCode, $id: ID!) {\n updateProduct(data: $data, locale: $locale, documentId: $id) {\n id: documentId\n content\n title\n slug\n uuid\n locale\n updatedAt\n createdAt\n locale\n metaTags {\n keymatch\n title\n description\n }\n sections {\n ... on ComponentComponentsUtrechtRichText {\n id\n content\n kennisartikelCategorie\n component: __typename\n }\n ... on ComponentComponentsInternalBlockContent {\n id\n component: __typename\n internal_field {\n title\n id: documentId\n content {\n uuid\n contentBlock {\n content\n kennisartikelCategorie\n }\n }\n }\n }\n }\n price {\n price(pagination: { limit: -1 }) {\n currency\n id\n label\n uuid\n value\n }\n }\n additional_information {\n content {\n id\n uuid\n contentBlock(pagination: { limit: -1 }) {\n id\n content\n categorie10: kennisartikelCategorie\n }\n }\n }\n kennisartikelMetadata {\n uuid\n doelgroep\n productAanwezig\n productValtOnder\n afdelingen {\n afdelingId\n afdelingNaam\n }\n verantwoordelijkeOrganisatie {\n owmsIdentifier\n owmsPrefLabel\n owmsEndDate\n }\n upnUri\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nquery getAllVacItems($page: Int, $pageSize: Int, $start: Int, $limit: Int) {\n vacs_connection(\n pagination: {\n start: $start\n limit: $limit\n page: $page\n pageSize: $pageSize\n }\n ) {\n pageInfo {\n total\n page\n pageSize\n pageCount\n }\n nodes {\n id: documentId\n createdAt\n updatedAt\n title\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n relatedVACs(pagination: { start: 0, limit: -1 }) {\n vac {\n uuid\n }\n }\n relatedProducts(pagination: { start: 0, limit: -1 }) {\n uuid\n title\n }\n\n vac {\n uuid\n vraag\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n afdelingen {\n afdelingId\n afdelingNaam\n }\n toelichting\n keywords\n }\n }\n }\n}\n\n"): (typeof documents)["\nquery getAllVacItems($page: Int, $pageSize: Int, $start: Int, $limit: Int) {\n vacs_connection(\n pagination: {\n start: $start\n limit: $limit\n page: $page\n pageSize: $pageSize\n }\n ) {\n pageInfo {\n total\n page\n pageSize\n pageCount\n }\n nodes {\n id: documentId\n createdAt\n updatedAt\n title\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n relatedVACs(pagination: { start: 0, limit: -1 }) {\n vac {\n uuid\n }\n }\n relatedProducts(pagination: { start: 0, limit: -1 }) {\n uuid\n title\n }\n\n vac {\n uuid\n vraag\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n afdelingen {\n afdelingId\n afdelingNaam\n }\n toelichting\n keywords\n }\n }\n }\n}\n\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nquery getVacItemByUUIDOrDocumentId(\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n vacs(\n filters: {\n or: [\n { vac: { uuid: { eq: $uuid } } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n createdAt\n updatedAt\n publishedAt\n title\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n relatedVACs(pagination: { start: 0, limit: -1 }) {\n vac {\n uuid\n }\n }\n relatedProducts(pagination: { start: 0, limit: -1 }) {\n uuid\n title\n }\n vac {\n uuid\n vraag\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n afdelingen {\n afdelingId\n afdelingNaam\n }\n toelichting\n keywords\n }\n }\n}\n"): (typeof documents)["\nquery getVacItemByUUIDOrDocumentId(\n $uuid: String\n $documentId: ID\n $status: PublicationStatus\n) {\n vacs(\n filters: {\n or: [\n { vac: { uuid: { eq: $uuid } } }\n { documentId: { eq: $documentId } }\n ]\n }\n status: $status\n ) {\n id: documentId\n createdAt\n updatedAt\n publishedAt\n title\n contact_information_internal {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n contact_information_public {\n contentBlock(pagination: { start: 0, limit: -1 }) {\n id\n content\n }\n }\n relatedVACs(pagination: { start: 0, limit: -1 }) {\n vac {\n uuid\n }\n }\n relatedProducts(pagination: { start: 0, limit: -1 }) {\n uuid\n title\n }\n vac {\n uuid\n vraag\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n afdelingen {\n afdelingId\n afdelingNaam\n }\n toelichting\n keywords\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\n mutation createVac($data: VacInput!) {\n createVac(data: $data) {\n id: documentId\n createdAt\n publishedAt\n title\n vac {\n id\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n uuid\n toelichting\n afdelingen {\n afdelingId\n afdelingNaam\n }\n keywords\n }\n }\n}\n"): (typeof documents)["\n mutation createVac($data: VacInput!) {\n createVac(data: $data) {\n id: documentId\n createdAt\n publishedAt\n title\n vac {\n id\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n uuid\n toelichting\n afdelingen {\n afdelingId\n afdelingNaam\n }\n keywords\n }\n }\n}\n"];
+/**
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function graphql(source: "\nmutation updateVac($data: VacInput!, $id: ID!) {\n updateVac(documentId: $id, data: $data) {\n id: documentId\n createdAt\n publishedAt\n title\n vac {\n id\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n uuid\n toelichting\n afdelingen {\n afdelingId\n afdelingNaam\n }\n keywords\n }\n }\n}\n"): (typeof documents)["\nmutation updateVac($data: VacInput!, $id: ID!) {\n updateVac(documentId: $id, data: $data) {\n id: documentId\n createdAt\n publishedAt\n title\n vac {\n id\n antwoord(pagination: { start: 0, limit: -1 }) {\n content\n kennisartikelCategorie\n }\n status\n doelgroep\n uuid\n toelichting\n afdelingen {\n afdelingId\n afdelingNaam\n }\n keywords\n }\n }\n}\n"];
+
+export function graphql(source: string) {
+ return (documents as any)[source] ?? {};
+}
+
+export type DocumentType> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never;
\ No newline at end of file
diff --git a/apps/overige-objecten-api/gql/graphql.ts b/apps/overige-objecten-api/gql/graphql.ts
new file mode 100644
index 000000000..1d6481d0f
--- /dev/null
+++ b/apps/overige-objecten-api/gql/graphql.ts
@@ -0,0 +1,4055 @@
+/* eslint-disable */
+import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
+export type Maybe = T | null;
+export type InputMaybe = Maybe;
+export type Exact = { [K in keyof T]: T[K] };
+export type MakeOptional = Omit & { [SubKey in K]?: Maybe };
+export type MakeMaybe = Omit & { [SubKey in K]: Maybe };
+export type MakeEmpty = { [_ in K]?: never };
+export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
+/** All built-in and custom scalars, mapped to their actual values */
+export type Scalars = {
+ ID: { input: string; output: string; }
+ String: { input: string; output: string; }
+ Boolean: { input: boolean; output: boolean; }
+ Int: { input: number; output: number; }
+ Float: { input: number; output: number; }
+ /** A date string, such as 2007-12-03, compliant with the `full-date` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. */
+ Date: { input: any; output: any; }
+ /** A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. */
+ DateTime: { input: any; output: any; }
+ /** A string used to identify an i18n locale */
+ I18NLocaleCode: { input: any; output: any; }
+ /** The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */
+ JSON: { input: any; output: any; }
+ PdcHomePageComponentsDynamicZoneInput: { input: any; output: any; }
+ PdcTemplateSectionsDynamicZoneInput: { input: any; output: any; }
+ ProductSectionsDynamicZoneInput: { input: any; output: any; }
+};
+
+export type AdditionalInformation = {
+ content?: Maybe;
+ createdAt?: Maybe;
+ documentId: Scalars['ID']['output'];
+ product?: Maybe;
+ publishedAt?: Maybe;
+ title: Scalars['String']['output'];
+ updatedAt?: Maybe;
+};
+
+export type AdditionalInformationEntityResponseCollection = {
+ nodes: Array;
+ pageInfo: Pagination;
+};
+
+export type AdditionalInformationFiltersInput = {
+ and?: InputMaybe>>;
+ content?: InputMaybe;
+ createdAt?: InputMaybe;
+ documentId?: InputMaybe;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+ product?: InputMaybe;
+ publishedAt?: InputMaybe;
+ title?: InputMaybe;
+ updatedAt?: InputMaybe;
+};
+
+export type AdditionalInformationInput = {
+ content?: InputMaybe;
+ product?: InputMaybe;
+ publishedAt?: InputMaybe;
+ title?: InputMaybe;
+};
+
+export type BooleanFilterInput = {
+ and?: InputMaybe>>;
+ between?: InputMaybe>>;
+ contains?: InputMaybe;
+ containsi?: InputMaybe;
+ endsWith?: InputMaybe;
+ eq?: InputMaybe;
+ eqi?: InputMaybe;
+ gt?: InputMaybe;
+ gte?: InputMaybe;
+ in?: InputMaybe>>;
+ lt?: InputMaybe;
+ lte?: InputMaybe;
+ ne?: InputMaybe;
+ nei?: InputMaybe;
+ not?: InputMaybe;
+ notContains?: InputMaybe;
+ notContainsi?: InputMaybe;
+ notIn?: InputMaybe>>;
+ notNull?: InputMaybe;
+ null?: InputMaybe;
+ or?: InputMaybe>>;
+ startsWith?: InputMaybe;
+};
+
+export type ComponentComponentsAdditionalInformation = {
+ additional_information?: Maybe;
+ id: Scalars['ID']['output'];
+};
+
+export type ComponentComponentsAdditionalInformationField = {
+ contentBlock?: Maybe>>;
+ id: Scalars['ID']['output'];
+ uuid?: Maybe;
+};
+
+
+export type ComponentComponentsAdditionalInformationFieldContentBlockArgs = {
+ filters?: InputMaybe;
+ pagination?: InputMaybe;
+ sort?: InputMaybe>>;
+};
+
+export type ComponentComponentsAdditionalInformationFieldFiltersInput = {
+ and?: InputMaybe>>;
+ contentBlock?: InputMaybe;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+ uuid?: InputMaybe;
+};
+
+export type ComponentComponentsAdditionalInformationFieldInput = {
+ contentBlock?: InputMaybe>>;
+ id?: InputMaybe;
+ uuid?: InputMaybe;
+};
+
+export type ComponentComponentsAfdelingen = {
+ afdelingId: Scalars['String']['output'];
+ afdelingNaam: Scalars['String']['output'];
+ id: Scalars['ID']['output'];
+};
+
+export type ComponentComponentsAfdelingenFiltersInput = {
+ afdelingId?: InputMaybe;
+ afdelingNaam?: InputMaybe;
+ and?: InputMaybe>>;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+};
+
+export type ComponentComponentsAfdelingenInput = {
+ afdelingId?: InputMaybe;
+ afdelingNaam?: InputMaybe;
+ id?: InputMaybe;
+};
+
+export type ComponentComponentsAntwoord = {
+ content?: Maybe;
+ id: Scalars['ID']['output'];
+ kennisartikelCategorie?: Maybe;
+ label?: Maybe;
+};
+
+export type ComponentComponentsAntwoordFiltersInput = {
+ and?: InputMaybe>>;
+ content?: InputMaybe;
+ kennisartikelCategorie?: InputMaybe;
+ label?: InputMaybe;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+};
+
+export type ComponentComponentsAntwoordInput = {
+ content?: InputMaybe;
+ id?: InputMaybe;
+ kennisartikelCategorie?: InputMaybe;
+ label?: InputMaybe;
+};
+
+export type ComponentComponentsAudience = {
+ id: Scalars['ID']['output'];
+ type: Enum_Componentcomponentsaudience_Type;
+};
+
+export type ComponentComponentsAudienceFiltersInput = {
+ and?: InputMaybe>>;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+ type?: InputMaybe;
+};
+
+export type ComponentComponentsAudienceInput = {
+ id?: InputMaybe;
+ type?: InputMaybe;
+};
+
+export type ComponentComponentsCatalogiMeta = {
+ abstract: Scalars['String']['output'];
+ audience: Array>;
+ authority: ComponentComponentsSpatial;
+ id: Scalars['ID']['output'];
+ onlineRequest: ComponentComponentsOnlineRequest;
+ spatial: ComponentComponentsSpatial;
+};
+
+
+export type ComponentComponentsCatalogiMetaAudienceArgs = {
+ filters?: InputMaybe;
+ pagination?: InputMaybe;
+ sort?: InputMaybe>>;
+};
+
+export type ComponentComponentsCatalogiMetaFiltersInput = {
+ abstract?: InputMaybe;
+ and?: InputMaybe>>;
+ audience?: InputMaybe;
+ authority?: InputMaybe;
+ not?: InputMaybe;
+ onlineRequest?: InputMaybe;
+ or?: InputMaybe>>;
+ spatial?: InputMaybe;
+};
+
+export type ComponentComponentsCatalogiMetaInput = {
+ abstract?: InputMaybe;
+ audience?: InputMaybe>>;
+ authority?: InputMaybe;
+ id?: InputMaybe;
+ onlineRequest?: InputMaybe;
+ spatial?: InputMaybe;
+};
+
+export type ComponentComponentsCimPdcProductAspectBeschrijving = {
+ id: Scalars['ID']['output'];
+ onderwerp?: Maybe;
+ uitleg: Scalars['String']['output'];
+};
+
+export type ComponentComponentsCimPdcProductAspectBeschrijvingFiltersInput = {
+ and?: InputMaybe>>;
+ not?: InputMaybe;
+ onderwerp?: InputMaybe;
+ or?: InputMaybe>>;
+ uitleg?: InputMaybe;
+};
+
+export type ComponentComponentsCimPdcProductAspectBeschrijvingInput = {
+ id?: InputMaybe;
+ onderwerp?: InputMaybe;
+ uitleg?: InputMaybe;
+};
+
+export type ComponentComponentsCimPdcProductBeschrijving = {
+ cimPdcProductAspectBeschrijving?: Maybe>>;
+ id: Scalars['ID']['output'];
+ omschrijving?: Maybe;
+ productNaam?: Maybe;
+ taal: Scalars['String']['output'];
+ trefwoord?: Maybe;
+};
+
+
+export type ComponentComponentsCimPdcProductBeschrijvingCimPdcProductAspectBeschrijvingArgs = {
+ filters?: InputMaybe;
+ pagination?: InputMaybe;
+ sort?: InputMaybe>>;
+};
+
+export type ComponentComponentsCimPdcProductBeschrijvingFiltersInput = {
+ and?: InputMaybe>>;
+ cimPdcProductAspectBeschrijving?: InputMaybe;
+ not?: InputMaybe;
+ omschrijving?: InputMaybe;
+ or?: InputMaybe>>;
+ productNaam?: InputMaybe;
+ taal?: InputMaybe;
+ trefwoord?: InputMaybe;
+};
+
+export type ComponentComponentsCimPdcProductBeschrijvingInput = {
+ cimPdcProductAspectBeschrijving?: InputMaybe>>;
+ id?: InputMaybe;
+ omschrijving?: InputMaybe;
+ productNaam?: InputMaybe;
+ taal?: InputMaybe;
+ trefwoord?: InputMaybe;
+};
+
+export type ComponentComponentsCimPdcProductMetadata = {
+ afnemer?: Maybe;
+ beoogdResultaat?: Maybe;
+ bestelwijze?: Maybe;
+ cimPdcProductBeschrijving?: Maybe>>;
+ doelgroep?: Maybe;
+ eigenaar?: Maybe;
+ grondslag?: Maybe;
+ id: Scalars['ID']['output'];
+ productCode?: Maybe;
+ servicetermijn?: Maybe;
+ soortBevoegdGezag?: Maybe;
+ soortTaak?: Maybe;
+ uitvoeringsorganisatie?: Maybe;
+ uplProductNaam?: Maybe;
+ wettelijkeTermijn?: Maybe;
+};
+
+
+export type ComponentComponentsCimPdcProductMetadataCimPdcProductBeschrijvingArgs = {
+ filters?: InputMaybe;
+ pagination?: InputMaybe;
+ sort?: InputMaybe>>;
+};
+
+export type ComponentComponentsCimPdcProductMetadataFiltersInput = {
+ afnemer?: InputMaybe;
+ and?: InputMaybe>>;
+ beoogdResultaat?: InputMaybe;
+ bestelwijze?: InputMaybe;
+ cimPdcProductBeschrijving?: InputMaybe;
+ doelgroep?: InputMaybe;
+ eigenaar?: InputMaybe;
+ grondslag?: InputMaybe;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+ productCode?: InputMaybe;
+ servicetermijn?: InputMaybe;
+ soortBevoegdGezag?: InputMaybe;
+ soortTaak?: InputMaybe;
+ uitvoeringsorganisatie?: InputMaybe;
+ uplProductNaam?: InputMaybe;
+ wettelijkeTermijn?: InputMaybe;
+};
+
+export type ComponentComponentsCimPdcProductMetadataInput = {
+ afnemer?: InputMaybe;
+ beoogdResultaat?: InputMaybe;
+ bestelwijze?: InputMaybe;
+ cimPdcProductBeschrijving?: InputMaybe>>;
+ doelgroep?: InputMaybe;
+ eigenaar?: InputMaybe;
+ grondslag?: InputMaybe;
+ id?: InputMaybe;
+ productCode?: InputMaybe;
+ servicetermijn?: InputMaybe;
+ soortBevoegdGezag?: InputMaybe;
+ soortTaak?: InputMaybe;
+ uitvoeringsorganisatie?: InputMaybe;
+ uplProductNaam?: InputMaybe;
+ wettelijkeTermijn?: InputMaybe;
+};
+
+export type ComponentComponentsContact = {
+ id: Scalars['ID']['output'];
+};
+
+export type ComponentComponentsContactInformationPublic = {
+ contact_information_public?: Maybe;
+ id: Scalars['ID']['output'];
+};
+
+export type ComponentComponentsContactInformationRichText = {
+ content: Scalars['String']['output'];
+ id: Scalars['ID']['output'];
+ label?: Maybe;
+};
+
+export type ComponentComponentsContactInformationRichTextFiltersInput = {
+ and?: InputMaybe>>;
+ content?: InputMaybe;
+ label?: InputMaybe;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+};
+
+export type ComponentComponentsContactInformationRichTextInput = {
+ content?: InputMaybe;
+ id?: InputMaybe;
+ label?: InputMaybe;
+};
+
+export type ComponentComponentsEForm = {
+ id: Scalars['ID']['output'];
+};
+
+export type ComponentComponentsFaq = {
+ id: Scalars['ID']['output'];
+ kennisartikelCategorie?: Maybe;
+ pdc_faq?: Maybe;
+};
+
+export type ComponentComponentsFloLegalForm = {
+ floLegalFormSelector?: Maybe;
+ id: Scalars['ID']['output'];
+};
+
+export type ComponentComponentsInternalBlockContent = {
+ id: Scalars['ID']['output'];
+ internal_field?: Maybe;
+};
+
+export type ComponentComponentsInternalContentBlock = {
+ id: Scalars['ID']['output'];
+};
+
+export type ComponentComponentsInternalContentBlockComponent = {
+ content?: Maybe;
+ id: Scalars['ID']['output'];
+ kennisartikelCategorie?: Maybe;
+};
+
+export type ComponentComponentsInternalField = {
+ contentBlock?: Maybe>>;
+ id: Scalars['ID']['output'];
+ keywords?: Maybe;
+ uuid?: Maybe;
+};
+
+
+export type ComponentComponentsInternalFieldContentBlockArgs = {
+ filters?: InputMaybe;
+ pagination?: InputMaybe;
+ sort?: InputMaybe>>;
+};
+
+export type ComponentComponentsInternalFieldFiltersInput = {
+ and?: InputMaybe>>;
+ contentBlock?: InputMaybe;
+ keywords?: InputMaybe;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+ uuid?: InputMaybe;
+};
+
+export type ComponentComponentsInternalFieldInput = {
+ contentBlock?: InputMaybe>>;
+ id?: InputMaybe;
+ keywords?: InputMaybe;
+ uuid?: InputMaybe;
+};
+
+export type ComponentComponentsKennisartikel = {
+ afdelingen?: Maybe>>;
+ doelgroep: Enum_Componentcomponentskennisartikel_Doelgroep;
+ id: Scalars['ID']['output'];
+ productAanwezig: Scalars['Boolean']['output'];
+ productValtOnder?: Maybe;
+ upnUri: Scalars['String']['output'];
+ uuid?: Maybe;
+ verantwoordelijkeOrganisatie?: Maybe;
+};
+
+
+export type ComponentComponentsKennisartikelAfdelingenArgs = {
+ filters?: InputMaybe;
+ pagination?: InputMaybe;
+ sort?: InputMaybe>>;
+};
+
+export type ComponentComponentsKennisartikelFiltersInput = {
+ afdelingen?: InputMaybe;
+ and?: InputMaybe>>;
+ doelgroep?: InputMaybe;
+ not?: InputMaybe;
+ or?: InputMaybe>>;
+ productAanwezig?: InputMaybe;
+ productValtOnder?: InputMaybe;
+ upnUri?: InputMaybe;
+ uuid?: InputMaybe;
+ verantwoordelijkeOrganisatie?: InputMaybe;
+};
+
+export type ComponentComponentsKennisartikelInput = {
+ afdelingen?: InputMaybe>>;
+ doelgroep?: InputMaybe;
+ id?: InputMaybe;
+ productAanwezig?: InputMaybe;
+ productValtOnder?: InputMaybe;
+ upnUri?: InputMaybe;
+ uuid?: InputMaybe;
+ verantwoordelijkeOrganisatie?: InputMaybe;
+};
+
+export type ComponentComponentsMetadata = {
+ eForm?: Maybe;
+ id: Scalars['ID']['output'];
+};
+
+export type ComponentComponentsOnlineRequest = {
+ id: Scalars['ID']['output'];
+ type: Enum_Componentcomponentsonlinerequest_Type;
+};
+
+export type ComponentComponentsOnlineRequestFiltersInput = {
+ and?: InputMaybe