Conversation
🦋 Changeset detectedLatest commit: 373c09f The changes in this PR will be included in the next version bump. This PR includes changesets to release 57 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Request: Audit changesets on the antd-v6 PR and clean up iterative fix/patch entries. Motivation: 45 changesets accumulated over iterative development — many "fix" entries were fixing features introduced on the same branch, not user-visible bugs. Decisions: - Absorb fix changesets into parent feature changesets rather than keeping separate entries - Split grab-bag changeset (menu-links-dark-mode-fixes) into focused single-concern entries - Add ErrorBar mention to server-dev code-docs Changes: - Deleted 8 changesets absorbed into parent features (e2e-test-fixes, numberinput-fix, fix-dayjs-utc-postcss-calendar, fix-block-tailwind-and-antd-deps, fix-loaders-dark-mode-tokens, gallery-docs, shortcut-badge-in-blocks, menu-links-dark-mode-fixes) - Updated 9 changesets with absorbed content and cleaned prefixes - Created build-error-messages.md and menu-operator-links.md from split grab-bag - server-dev.md: Added ErrorBar section under Client Components Tags: changesets, changeset-cleanup, antd-v6, changelog, docs, server-dev, errorbar
Request: Add the v5 release article to the lowdefy website's articles section. Motivation: The v5 release article was written in lowdefy-design and needs to be published on the website. Changes: - lowdefy-5-whats-new.md: Full v5 release article covering Tailwind, dark mode, shortcuts, antd v6, slots, new blocks, plugin updates, DX improvements - index.js: Register article in the articles content registry - layout.jsx: SEO and OpenGraph metadata for the article route - page.jsx: Article page component with Header/Footer - opengraph-image.jsx: Social media preview image generator Tags: website, article, v5-release, docs, blog
…format.
Request: Fix _js error showing as LowdefyInternalError with no config path
Motivation: When _js is used with wrong format (e.g. _js: { expr: '...' } instead of
_js: '...'), the error was a plain Error wrapped in LowdefyInternalError — giving the
user no indication of where the bad config is.
Changes:
- jsMapParser.js: Throw ConfigError instead of plain Error, include configKey from ~k
marker and the received value in the message. ConfigError.isLowdefyError = true so
buildPageJit's catch handler preserves it instead of wrapping in LowdefyInternalError.
Tags: _js, config-error, jsMapParser, error-tracing, build
Request: Add a height property to define the dragger area height in pixels Motivation: Allow users to control the dragger area size. Changes: - S3UploadDragger.js: Pass properties.height to antd Dragger's built-in height prop - meta.js: Add height property metadata - schema.js: Add height property schema Tags: s3-upload, dragger, height, plugin-aws
Request: Add _math.mod operator Motivation: JavaScript's Math object lacks a modulo method, but remainder is a common operation in configs. Changes: - math.js: Add mod to meta, wrap Math with Object.create(Math) to add custom mod function - math.test.js: Add mod tests (array and object forms), update inline snapshots - _math.yaml: Add mod method entry to user-facing docs - js.md: Add mod to supported methods list in code-docs - feat-math-mod-operator.md: Changeset for patch bump Tags: operators-js, math, mod, modulo, remainder
Request: Fix PhoneNumberInput phone_number formatting.
Motivation: Raw string concatenation produced malformed phone numbers — leading
zeros weren't stripped ("+270821234567"), non-digit characters passed through,
and empty input stored just the dial code ("+27") instead of empty string.
Changes:
- formatPhoneNumber.js: New helper strips non-digits and leading zeros from input
- PhoneNumberInput.js: Use formatPhoneNumber for both onChange handlers, remove phone_number from null init
- PhoneNumberInput.e2e.spec.js: Add 3 formatting tests (leading zeros, non-digits, empty init)
- PhoneNumberInput.e2e.yaml: Add format_test and empty_test blocks with display spans
- fix-phone-number-formatting.md: Changeset for patch bump
Tags: phone-number, formatting, blocks-antd, phone-input, dial-code, strip-zeros
Request: Fix logger crash "Converting circular structure to JSON" when AxiosHttp requests fail Motivation: extractErrorProps included plain objects by reference without deep-cleaning, so Axios error responses containing Node.js request/response cycles crashed JSON.stringify. Decisions: - Fix in extractErrorProps, not the serializer: extractErrorProps broke its contract to return serialisable output - Separate objectDepth/causeDepth counters: object nesting (5 levels) and cause chains (3 levels) are independent limits - Shared seen Set between cleanValue and _extractErrorProps: tracks circular refs across error cause chains and nested objects in one pass Changes: - extractErrorProps.js: Add cleanValue helper, wire into plain-object/array/non-Error-cause branches, split _extractErrorProps depth param into objectDepth+causeDepth - extractErrorProps.test.js: Add 6 tests for circular refs in plain objects, deep nesting truncation, array cleaning, non-Error cause cleaning, errors inside plain objects - serializer.test.js: Add integration test exercising full serialize path with Axios-shaped circular error - fix-serialize-circular-errors.md: Changeset for @lowdefy/helpers patch - code-docs/utils/helpers.md: Document cleanValue deep-cleaning behaviour - code-docs/architecture/error-tracing.md: Note deep-cleaning in error serialization section Tags: extractErrorProps, cleanValue, circular-reference, serializer, axios, error-serialization, helpers
Request: Fix failing build package tests. Motivation: writeGlobalsCss now emits a layer-order.css build artifact but the 54 snapshot files were not regenerated. Changes: - 54 snapshot.json files: Added layer-order.css entry to match new build output Tags: build, snapshots, layer-order, css, test-fix
…r handling. Motivation: Need to validate or confirm files before upload begins, and upload failures were silently swallowed with no diagnostic information. Changes: - meta.js (S3UploadButton, S3UploadDragger): Add onBeforeUpload event definition - useFileList.js: Trigger onBeforeUpload before upload, cancel if action throws; serialize file metadata to plain object to survive serializer.copy() - getS3Upload.js: Rewrite XHR upload as Promise-based with proper error propagation; throw ServiceError on CORS/network failures - feat-s3-upload-before-upload.md: Changeset for minor bump Tags: plugin-aws, s3-upload, onBeforeUpload, file-validation, error-handling, xhr, cors
Request: Investigate the bad icon import error and make it pretty. Motivation: When a user writes a bad icon name (e.g. AiOutlineToolOutlined), the Lowdefy build generates a massive single-line import that Next.js dumps as a wall of unreadable text. The actual useful info is buried. Decisions: - Warning not error: invalid icons emit ConfigWarning so build continues - Proportional Levenshtein threshold: maxDistance scales with icon name length to catch suffix typos like "ToolOutlined" → "Tool" - Graceful fallback: if a react-icons package can't be loaded, skip validation Changes: - validateIconImports.js: New — validates icon names against actual react-icons package exports, filters invalid ones, emits ConfigWarning with "did you mean?" suggestion - buildIconImports.js: Call validateIconImports after collecting icons - extractIconData.js: Add warning with suggestion in JIT path for invalid icons - validateIconImports.test.js: 7 tests covering valid/invalid icons, suggestions, package load failure, caching Tags: build, icons, validation, react-icons, config-warning, did-you-mean Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…plugins. Request: Should we apply changes to the plugin dependency definitions in the lowdefy repo? Motivation: All block plugins declared react and react-dom as direct dependencies (pinned 18.2.0). In consuming workspaces, if any other package pulls a different React version, pnpm installs two copies — two React instances means two context trees and ConfigProvider theme (dark mode, compact, tokens) becomes invisible to plugin components. Decisions: - Use >=18 for react/react-dom, >=5 for antd (blocks-antd uses v5+ API), >=6 for antd in plugin-aws - block-dev left unchanged: it's a test utility that correctly provides React for the test environment - @lowdefy/client and @lowdefy/layout left unchanged: core packages that correctly own React Changes: - blocks-basic/package.json: react, react-dom → peerDependencies - blocks-antd/package.json: react, react-dom, antd → peerDependencies - blocks-echarts/package.json: react, react-dom → peerDependencies - blocks-loaders/package.json: react, react-dom → peerDependencies - blocks-markdown/package.json: react, react-dom → peerDependencies - blocks-aggrid/package.json: react, react-dom → peerDependencies - blocks-google-maps/package.json: react, react-dom → peerDependencies - blocks-qr/package.json: react, react-dom → peerDependencies - plugin-aws/package.json: react, react-dom, antd → peerDependencies - block-utils/package.json: react, react-dom → peerDependencies - pnpm-lock.yaml: Regenerated Tags: plugins, peer-dependencies, react, antd, dual-instance, dark-mode, theme Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…d add border styles. Changes: - Header/meta.js, PageHeaderMenu/meta.js, PageSiderMenu/meta.js: Change profile dropdown trigger default from 'click' to 'hover' - headerActions.js: Update runtime fallback to match new 'hover' default - PageSiderMenu.js: Add borderBottom to header and borderInlineEnd to sider for visual separation Tags: blocks-antd, profile-dropdown, hover, border, page-sider-menu, header-actions
…thor. Request: Add article from external markdown file to the website with a new author profile Motivation: Publishing a new opinion piece on config-driven development in the AI era Changes: - case-for-config-driven-development.md: New article with frontmatter - authors.js: Added stephanie author profile - index.js: Registered article import and parse entry - page.jsx: Article page route component - layout.jsx: Article layout with SEO metadata Tags: website, article, author, config-driven, ai, stephanie, content
Add config-driven development article to website
…ations. Request: Add missing icons to block meta so they are bundled in production builds. Motivation: The build uses meta.icons to determine which react-icons to bundle. Icons used in code or as schema defaults but not declared in meta get tree-shaken out, causing missing icons in production. Changes: - Header/meta.js: Add AiOutlineLaptop (system dark mode toggle icon from headerActions.js) - PageHeaderMenu/meta.js: Add AiOutlineLaptop - PageSiderMenu/meta.js: Add AiOutlineLaptop - Selector/meta.js: Add AiOutlineCloseCircle, AiOutlineDown (schema defaults for clearIcon, suffixIcon) - MultipleSelector/meta.js: Add AiOutlineCheck, AiOutlineCloseCircle, AiOutlineDown (schema defaults for selectedIcon, clearIcon, suffixIcon) - Icon/meta.js: Add AiOutlineCloseCircle (schema default for name property) Tags: icons, meta, tree-shaking, dark-mode, selector, production-build, blocks-antd, blocks-basic
# Conflicts: # code-docs/architecture/build-pipeline.md # code-docs/packages/build.md # packages/build/package.json # packages/build/src/build/jit/shallowBuild.js # packages/build/src/tests/success/34-crud-app-complete/snapshot.json # packages/build/src/tests/success/39-global-state-app/snapshot.json # packages/build/src/tests/success/47-operators-comprehensive/snapshot.json # packages/build/src/tests/success/55-complete-enterprise-app/snapshot.json # packages/client/package.json # packages/docs/package.json # packages/engine/package.json # packages/layout/package.json # packages/plugins/blocks/blocks-aggrid/package.json # packages/plugins/blocks/blocks-algolia/CHANGELOG.md # packages/plugins/blocks/blocks-algolia/package.json # packages/plugins/blocks/blocks-antd/package.json # packages/plugins/blocks/blocks-basic/package.json # packages/plugins/blocks/blocks-color-selectors/CHANGELOG.md # packages/plugins/blocks/blocks-color-selectors/package.json # packages/plugins/blocks/blocks-echarts/package.json # packages/plugins/blocks/blocks-google-maps/package.json # packages/plugins/blocks/blocks-loaders/package.json # packages/plugins/blocks/blocks-qr/package.json # packages/plugins/connections/connection-axios-http/package.json # packages/plugins/connections/connection-elasticsearch/package.json # packages/plugins/connections/connection-google-sheets/package.json # packages/plugins/connections/connection-knex/package.json # packages/plugins/connections/connection-redis/package.json # packages/plugins/connections/connection-sendgrid/package.json # packages/plugins/connections/connection-stripe/package.json # packages/plugins/operators/operators-dayjs/package.json # packages/plugins/operators/operators-js/src/operators/shared/date.js # packages/plugins/operators/operators-moment/CHANGELOG.md # packages/plugins/plugins/plugin-aws/package.json # packages/servers/server-dev/package.json # packages/servers/server-e2e/package.json # packages/servers/server/package.json # packages/utils/block-dev/package.json # packages/utils/block-utils/package.json # packages/utils/nunjucks/package.json # packages/website/src/content/articles/index.js # pnpm-lock.yaml
Request: Resolve merge conflict between antd-v6 and main. Motivation: After merging main into antd-v6, package.json files needed @lowdefy/* internal dependency versions updated from 4.7.2 to 4.7.3 to match main's latest release. Changes: - 41 package.json files: Updated version and @lowdefy/* dependency versions from 4.7.2 to 4.7.3 Tags: version-bump, merge, package-json, 4.7.3
Request: Fix CI snapshot test failures. Motivation: Snapshots were generated against stale dist/ files that lacked the dynamic: true flag on _date.valueOf (operators-js) and new icons in block metas (blocks-antd, blocks-basic). CI compiles fresh dist from src before testing, so CI's build output differed from the stale-dist snapshots. Decisions: - Rebuilt operators-js, blocks-antd, blocks-basic dist before regenerating: ensures snapshots match what CI produces Changes: - 33-multifile-nested-refs/snapshot.json: Key reordering from collectSkeletonSourceFiles - 34-crud-app-complete/snapshot.json: ~k shifts (+2) from _date server operator, new icon entries - 39-global-state-app/snapshot.json: Same ~k shifts and _date additions - 47-operators-comprehensive/snapshot.json: Same ~k shifts and _date additions - 55-complete-enterprise-app/snapshot.json: Same ~k shifts and _date additions Tags: snapshots, dist, ci, _date, dynamic, operators-js, blocks-antd, build
Request: "we can remove the claude code review in this repo" Changes: - claude-code-review.yml: Removed PR review workflow Tags: ci, workflow, claude-code-review
Request: Harden ID validation across the build pipeline.
Motivation: Scattered `.includes('.')` checks only caught periods. A shared
validateId utility enforces a strict allowlist (A-Z, a-z, 0-9, "-", "_", "/")
and is applied consistently to endpoints, steps, requests, connections, and pages.
Changes:
- validateId.js: New shared utility with regex-based ID validation
- validateId.test.js: Tests for valid IDs, periods, traversal, spaces, specials
- validateStep.js: Replace inline period check with validateId
- validateEndpoint.js: Replace inline period check with validateId
- buildRequests.js: Replace inline period check with validateId
- buildConnections.js: Add validateId call for connection IDs
- buildPage.js: Add validateId call for page IDs
- buildApi.test.js: Update test name and expected error message
- buildRequests.test.js: Update test name and expected error message
- F4-request-id-with-period/expected.json: Update expected error strings
Tags: validate-id, build, security, id-validation, config-error
Request: Prevent directory traversal in config file reads. Motivation: readConfigFile accepted arbitrary paths that could escape the build directory via ".." or special characters. A regex allowlist and ".." check now reject invalid paths before they reach the filesystem. Changes: - createReadConfigFile.js: Add validPathPattern regex and ".." guard - createReadConfigFile.test.js: Add tests for traversal, spaces, and injection Tags: path-traversal, security, api, readConfigFile, input-validation
Page IDs like ":reject" and ":throw" in the docs app use colons. The validateId regex and readConfigFile path regex now permit ":". Tags: validate-id, docs-build, colon, regex
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Comprehensive upgrade of Lowdefy to Ant Design v6, Tailwind CSS v4, and Next.js 16 with a complete rewrite of the styling pipeline, layout system, and build infrastructure. Adds keyboard shortcuts, a Search command palette, a Calendar block, and a
lowdefy upgradeCLI codemod system.What Changed
1. Ant Design v6 Upgrade
All 82 blocks migrated from antd v4 to v6. Key API changes:
visibleopendefaultVisible/onVisibleChangedefaultOpen/onOpenChangebordered: falsevariant: 'borderless'gapPositiongapPlacementdotPositiondotPlacementexpandIconPositionexpandIconPlacementtabPosition: left/righttabPlacement: start/endproperties.headerStylestyle: { /header }properties.bodyStylestyle: { /body }properties.maskStylestyle: { /mask }type: primarycolor: 'primary', variant: 'solid'danger: truecolor: 'danger'Breadcrumb.Itemchildrenitemsarray propMenu.Item/Menu.SubMenuitemsarray propRemoved:
Commentblock (removed from antd in v5+).New blocks (15):
Flex,QRCode,Masonry,MasonryList,FloatButton,Tour,Watermark,ConfigProvider,SegmentedSelector,ColorSelector,Splitter,Search,DropdownMenu,DropdownButton,Calendar.Key files for review
packages/plugins/blocks/blocks-antd/src/blocks/Button/Button.js— color/variant APIpackages/plugins/blocks/blocks-antd/src/blocks/Menu/Menu.js— items API migration (272-line refactor)packages/plugins/blocks/blocks-antd/src/blocks/Modal/Modal.js— visible→open, styles APIpackages/plugins/blocks/blocks-antd/src/blocks/Drawer/Drawer.js— styles APIpackages/plugins/blocks/blocks-antd/src/blocks/Calendar/Calendar.js— new Calendar blockpackages/plugins/blocks/blocks-antd/src/blocks/Label/Label.js— Form.Item CSS modulepackages/plugins/blocks/blocks-antd/src/blocks/Flex/Flex.js— new block2. Styling Pipeline Rewrite
Removed:
@emotion/cssand@emotion/styled— no more runtime CSS-in-JSmakeCssClass()— replaced by directclassName/styleprop passingnext-with-less,less,less-loader)meta.stylesmechanism andbuildStyleImports/writeStyleImportsAdded:
classproperty on all blocks (string or{ block, element }object)styleproperty for inline styles with/-prefixed sub-slot targeting (e.g.,style: { /header },style: { /body })cn()utility in@lowdefy/block-utilsfor className merging@layerordering:@layer theme, base, antd, components, utilitiesKey files for review
packages/utils/block-utils/src/cn.js— className merge utilitypackages/build/src/build/buildPages/buildBlock/buildBlock.js— class/styles normalizationpackages/engine/src/Block.js— style/className prop passingpackages/client/src/block/Container.js— updated rendering3. Layout System Rewrite
Replaced antd's
Row/Colwith a pure CSS 24-column grid using CSS custom properties.Architecture:
grid.css— 24-column responsive grid with gap-adjusted flex-basis formula:span/24 * (100% + gap) - gapBlockLayout— wraps individual blocks with responsive column sizing (plain<div>)Area— container for groups of blocks (creates flex rows with gap/alignment)Property renames (with deprecation warnings):
guttergapcontentGutter/contentGapgapcontentAlignaligncontentJustifyjustifycontentDirectiondirectioncontentWrapwrapcontentOverflowoverflowlayout.align(self)layout.selfAlignxxlbreakpoint2xlNew layout features:
gap: { xs: 4, sm: 8, md: 16, lg: 24 }grow,shrink,sizepropertiesselfAlign: top | middle | bottomfor individual block vertical alignmentspan: 0correctly hides blocks (was previously treated as full-width)Key files for review
packages/layout/src/grid.css— 24-column CSS gridpackages/layout/src/deriveLayout.js— CSS variable calculationpackages/layout/src/deriveLayout.test.js— comprehensive testspackages/layout/src/Area.js— Area componentpackages/layout/src/BlockLayout.js— BlockLayout component4. Tailwind CSS v4 Integration
globals.csswith@layerdeclarations and@import "tailwindcss"--ant-*CSS variables to Tailwind design tokenslowdefy.yaml(theme.tailwind) flow to both antd and TailwindKey files for review
packages/build/src/build/writeGlobalsCss.js— globals.css generationpackages/servers/server-dev/manager/processes/nextBuild.mjs— JIT hot reload5. Theme Token System
themeconfig inlowdefy.yamlwiththeme.antd(design tokens) andtheme.tailwind(custom tokens)ConfigProviderauto-configured with theme tokens at app rootproperties.themeoverrides for scoped theming_themeoperator to resolve token values in YAML expressionsConfigProvidercontainer block for scoped theme overridesKey files for review
packages/build/src/build/buildTheme.js— theme buildpackages/plugins/operators/operators-js/src/operators/client/theme.js— _theme operator6. Moment.js → Day.js Migration
Complete removal of moment.js from 4 packages:
operators-momentoperators-dayjs, operator_moment→_dayjsnunjucksdateFilteruses dayjs instead of momentconnection-google-sheetsmoment.utc()→dayjs.utc()blocks-antd(date blocks)Behavioral changes:
humanizeDurationthresholdsparameter no longer supportedKey files for review
packages/plugins/operators/operators-dayjs/src/operators/shared/dayjs.js— dayjs operatorpackages/plugins/operators/operators-dayjs/src/locales.js— bundled localespackages/utils/nunjucks/src/dateFilter.js— nunjucks migration7. Areas → Slots Rename
Internal rename of
areastoslotsin engine, client, and build. User-facingareaskey is supported as a deprecated alias with backwards compatibility.Key files for review
packages/build/src/build/buildPages/buildBlock/moveAreasToSlots.js— migration logicpackages/engine/src/Slots.js— renamed from Areas.js8. Build Pipeline Improvements
buildRefs,buildPageJit)evaluateOperators: In-place operator evaluation replacingevaluateStaticOperatorstypes.js: Sourcetypes.jsfiles replace auto-generatedtypes.jsonin all plugin packages. Block packages derive types frommetas.jsviaextractBlockTypes. Theextract-plugin-typesscript has been removed.schema.jsrenamed tometa.js,.metastatic properties removed from components,schemas.jsbarrel renamed tometas.js. Build writesblockMetas.jsonartifact with category, valueType, and initValue for each block type.~shallowmarkers: Skip_build.*eval in shallow buildsKey files for review
packages/build/src/build/buildRefs/buildRefs.js— walker integrationpackages/build/src/build/jit/buildPageJit.js— JIT page builderpackages/operators/src/evaluateOperators.js— in-place walker9. Server & Tooling Upgrades
@swc/cliwith config file support10. Keyboard Shortcuts
Event-level keyboard shortcut support with visual badges.
events.onClick.shortcut: 'mod+k'— platform-aware (mod= Cmd on Mac, Ctrl on Windows), supports sequences (g i) and arrays for multiple bindingsmod+N)⌘ Kon Mac,Ctrl Kon Windows), available to all blocks viacomponents.ShortcutBadgeshortcutKey files for review
packages/engine/src/ShortcutManager.js— global keydown listenerpackages/client/src/block/ShortcutBadge.js— badge componentpackages/build/src/build/buildPages/buildBlock/buildShortcuts.js— validation11. Search Command Palette
New
Searchblock — a MiniSearch-powered Cmd+K command palette (~6KB) that replaces@lowdefy/blocks-algolia.indexUrlfor zero-config search on static sitesdocumentsarray withfieldsandstoreFieldsfor client-side indexingonSelectpasses the result item plusqueryandresultCountfor click-through tracking;onSearchpasses the term and count on each query changestyle/classwith/keys (trigger, modal, input, results, groups, highlights)Docs app integration: New search index transformer builds a MiniSearch index at build time from page content, written to
public/search-index.json. Replaces Algolia DocSearch — removes external CDN dependency.Removed:
@lowdefy/blocks-algoliapackage.Key files for review
packages/plugins/blocks/blocks-antd/src/blocks/Search/Search.js— main componentpackages/plugins/blocks/blocks-antd/src/blocks/Search/SearchModal.js— modal UIpackages/plugins/blocks/blocks-antd/src/blocks/Search/useSearch.js— MiniSearch hook12.
lowdefy upgradeCLI CommandNew codemod system for automated version migrations.
lowdefy upgradewith--to,--plan,--dry-run,--scripts-only,--resumeoptions@lowdefy/codemodspackage: Published on npm, contains all migration scripts with a version-to-codemod registry.lowdefy/upgrade-state.jsonfor--resumeon interrupted upgradesKey files for review
packages/cli/src/commands/upgrade/— CLI commandpackages/plugins/codemods/— codemod scripts and registry13. Dark Mode System
theme.darkMode: 'system' | 'light' | 'dark'darkModeToggle: true)SetDarkModeaction cycles through light/dark/system preferences_media: darkModePreferenceoperator returns user's preferenceApp.useApp()hooks14. Production Build Fixes
Tailwind CSS in production (
@lowdefy/server):postcss.config.jswas missing from the server package'sfilesarray — Next.js skipped the Tailwind PostCSS plugin entirely in production builds. Fixed by including it in the published package.dayjs dependency resolution (
@lowdefy/server,server-dev,server-e2e):dayjswas not a direct dependency of the server packages. In production installs (without monorepo hoisting), Turbopack couldn't resolve dayjs or resolved antd's bundled copy — causingdayjs.extend(utc)to fail. Addeddayjsas a direct dependency of all three server packages.dayjs UTC plugin compatibility (
@lowdefy/blocks-antd):@rc-component/pickerwithout the UTC plugin. Date selector onChange and disabledDate callbacks now wrap antd's dayjs instances with the extended dayjs before calling.utc(). Affects DateSelector, DateTimeSelector, DateRangeSelector, WeekSelector, MonthSelector, and the shared disabledDate utility.Breaking Changes
For Lowdefy App Developers
_moment→_dayjs— Rename operator in YAML configsCommentblock removed — UseCard+Avatar+Paragraphcompositionstyleremoved —style: { sm: { padding: 32 } }no longer works; use Tailwind classes (class: 'p-8 sm:p-4') or custom CSSareas→slots— Deprecated alias works but will be removed in next majorcontentGutter→gap,contentJustify→justify, etc. (deprecation warnings emitted)xxl→2xlbreakpoint renamespan: 0behavior — Now correctly hides blocks (was previously treated as full-width)visible→open,bordered→variant,tabPosition→tabPlacement, etc.type/danger→color/variantAPIpublic/styles.less— Must be converted to CSS or moved totheme.antd.tokenconfigColorPicker→ColorSelector— Renamed and moved to@lowdefy/blocks-antd. The@lowdefy/blocks-color-selectorspackage has been removed.Segmented→SegmentedSelector— Renamed to follow the selector naming convention; now supports complex option values and HTML labels@lowdefy/blocks-algoliaremoved — Use theSearchblock in@lowdefy/blocks-antdinsteadMigration: All breaking changes above can be automated via
lowdefy upgrade --to 5.0. See section 12.For Plugin Developers
makeCssClassremoved — UseclassNameandstyleprops directlymeta.stylesremoved — Import CSS directly in component filestypes.jsis now source — Sourcetypes.jsfiles replace auto-generatedtypes.json. Block packages derive types frommetas.jsviaextractBlockTypes. Theextract-plugin-typesscript has been removed.schema.js→meta.js— Block metadata moved to dedicatedmeta.jsfiles..metastatic properties removed from components.schemas.jsbarrel renamed tometas.js.@emotion/cssremoved — No runtime CSS-in-JSNew Features
classpropertystylewith/slot keysstyle: { /header },style: { /body }, etc.)theme.antd+theme.tailwindinlowdefy.yaml_themeoperatorConfigProviderblocktheme.darkMode: 'system', toggle button,SetDarkModeactiongap: { xs: 4, md: 16, lg: 24 }grow,shrink,sizeon any blockevents.onClick.shortcut: 'mod+k'— platform-aware shortcuts on any eventlowdefy upgradeCLI🤖 Generated with Claude Code