1 hours ago
core-js

3.48.0 - 2026.01.21

  • Changes v3.47.0...v3.48.0 (126 commits)
  • Map upsert proposal:
    • Built-ins:
      • Map.prototype.getOrInsert
      • Map.prototype.getOrInsertComputed
      • WeakMap.prototype.getOrInsert
      • WeakMap.prototype.getOrInsertComputed
    • Moved to stable ES, January 2026 TC39 meeting
    • Added es. namespace modules, /es/ and /stable/ namespaces entries
  • Use CreateDataProperty / CreateDataPropertyOrThrow in some missed cases, #1497
  • Minor fix / optimization in the RegExp constructor (NCG and dotAll) polyfill
  • Added some more workarounds for a Safari < 13 bug with silent ignore of non-writable array .length
  • Added detection of a Webkit bug: Iterator.prototype.flatMap throws on iterator without return method
  • Added detection of a V8 ~ Chromium < 144 bug: Uint8Array.prototype.setFromHex throws an error on length-tracking views over ResizableArrayBuffer
  • Compat data improvements:
2 hours ago
router

v1.154.2

Version 1.154.2 - 1/21/26, 5:09 PM

Changes

Fix

  • router-core: skipOnParamError on index route should still allow mathing other node types beyond it on error (#6436) (8dd35b1) by @Sheraff

Packages

  • @tanstack/router-core@1.154.2
  • @tanstack/solid-router@1.154.2
  • @tanstack/react-router@1.154.2
  • @tanstack/vue-router@1.154.2
  • @tanstack/solid-router-ssr-query@1.154.2
  • @tanstack/react-router-ssr-query@1.154.2
  • @tanstack/vue-router-ssr-query@1.154.2
  • @tanstack/router-ssr-query-core@1.154.2
  • @tanstack/zod-adapter@1.154.2
  • @tanstack/valibot-adapter@1.154.2
  • @tanstack/arktype-adapter@1.154.2
  • @tanstack/router-devtools@1.154.2
  • @tanstack/solid-router-devtools@1.154.2
  • @tanstack/react-router-devtools@1.154.2
  • @tanstack/vue-router-devtools@1.154.2
  • @tanstack/router-devtools-core@1.154.2
  • @tanstack/router-generator@1.154.2
  • @tanstack/router-cli@1.154.2
  • @tanstack/router-plugin@1.154.2
  • @tanstack/router-vite-plugin@1.154.2
  • @tanstack/solid-start@1.154.2
  • @tanstack/solid-start-client@1.154.2
  • @tanstack/solid-start-server@1.154.2
  • @tanstack/vue-start@1.154.2
  • @tanstack/vue-start-client@1.154.2
  • @tanstack/vue-start-server@1.154.2
  • @tanstack/start-client-core@1.154.2
  • @tanstack/start-server-core@1.154.2
  • @tanstack/start-storage-context@1.154.2
  • @tanstack/react-start@1.154.2
  • @tanstack/react-start-client@1.154.2
  • @tanstack/react-start-server@1.154.2
  • @tanstack/start-plugin-core@1.154.2
  • @tanstack/start-static-server-functions@1.154.2
3 hours ago
next.js

v16.2.0-canary.0

Core Changes

  • Reuse bfcache data during Full prefetches: #88606
  • Embed static sibling info in route tree: #88692
  • Fix revalidatePath with params and trailing slash when deployed: #88623

Misc Changes

  • Update deterministic-build assertion: #88820
  • Turbopack: shrink amortized: #88619
  • Fix deployment test due to data-dpl-id attribute: #88846
  • [ci] Fix Rspack/Turbopack test manifest generation: #88845
  • Turbopack: show compressed size for print_cache_item_size: #88850
  • [test] Fix deploy test of cache-components.server-action.test.ts: #88854

Credits

Huge thanks to @acdlite, @unstubbable, @mischnic, and @sokra for helping!

5 hours ago
drawio
5 hours ago
anime

v4.3.1

Bug Fixes

  • Layout
    • Fix an issue where inline tags, like or weren't detected when surrounded by comments
5 hours ago
astro

astro@5.16.12

Patch Changes

  • #15175 47ae148 Thanks @florian-lefebvre! - Allows experimental Font providers to specify family options

    Previously, an Astro FontProvider could only accept options at the provider level when called. That could result in weird data structures for family-specific options.

    Astro FontProviders can now declare family-specific options, by specifying a generic:

    // font-provider.ts
    import type { FontProvider } from "astro";
    import { retrieveFonts, type Fonts } from "./utils.js",
    
    interface Config {
      token: string;
    }
    
    +interface FamilyOptions {
    +    minimal?: boolean;
    +}
    
    -export function registryFontProvider(config: Config): FontProvider {
    +export function registryFontProvider(config: Config): FontProvider<FamilyOptions> {
      let data: Fonts = {}
    
      return {
        name: "registry",
        config,
        init: async () => {
          data = await retrieveFonts(token);
        },
        listFonts: () => {
          return Object.keys(data);
        },
    -    resolveFont: ({ familyName, ...rest }) => {
    +    // options is typed as FamilyOptions
    +    resolveFont: ({ familyName, options, ...rest }) => {
          const fonts = data[familyName];
          if (fonts) {
            return { fonts };
          }
          return undefined;
        },
      };
    }

    Once the font provider is registered in the Astro config, types are automatically inferred:

    // astro.config.ts
    import { defineConfig } from "astro/config";
    import { registryFontProvider } from "./font-provider";
    
    export default defineConfig({
        experimental: {
            fonts: [{
                provider: registryFontProvider({
                  token: "..."
                }),
                name: "Custom",
                cssVariable: "--font-custom",
    +            options: {
    +                minimal: true
    +            }
            }]
        }
    });
  • #15175 47ae148 Thanks @florian-lefebvre! - BREAKING CHANGE to the experimental Fonts API only

    Updates how options are passed to the Google and Google Icons font providers when using the experimental Fonts API

    Previously, the Google and Google Icons font providers accepted options that were specific to given font families.

    These options must now be set using the options property instead. For example using the Google provider:

    import { defineConfig, fontProviders } from "astro/config";
    
    export default defineConfig({
        experimental: {
            fonts: [{
                name: 'Inter',
                cssVariable: '--astro-font-inter',
                weights: ['300 900'],
    -            provider: fontProviders.google({
    -                experimental: {
    -                    variableAxis: {
    -                        Inter: { opsz: ['14..32'] }
    -                    }
    -                }
    -            }),
    +            provider: fontProviders.google(),
    +            options: {
    +                experimental: {
    +                    variableAxis: { opsz: ['14..32'] }
    +                }
    +            }
            }]
        }
    })
  • #15200 c0595b3 Thanks @florian-lefebvre! - BREAKING CHANGE to the experimental Fonts API only

    Removes getFontData() exported from astro:assets with fontData when using the experimental Fonts API

    Accessing font data can be useful for advanced use cases, such as generating meta tags or Open Graph images. Before, we exposed a getFontData() helper function to retrieve the font data for a given cssVariable. That was however limiting for programmatic usages that need to access all font data.

    The getFontData() helper function is removed and replaced by a new fontData object:

    -import { getFontData } from "astro:assets";
    -const data = getFontData("--font-roboto")
    
    +import { fontData } from "astro:assets";
    +const data = fontData["--font-roboto"]

    We may reintroduce getFontData() later on for a more friendly DX, based on your feedback.

  • #15254 8d84b30 Thanks @lamalex! - Fixes CSS assetsPrefix with remote URLs incorrectly prepending a forward slash

    When using build.assetsPrefix with a remote URL (e.g., https://cdn.example.com) for CSS assets, the generated <link> elements were incorrectly getting a / prepended to the full URL, resulting in invalid URLs like /https://cdn.example.com/assets/style.css.

    This fix checks if the stylesheet link is a remote URL before prepending the forward slash.

  • #15178 731f52d Thanks @kedarvartak! - Fixes an issue where stopping the dev server with q+enter incorrectly created a dist folder and copied font files when using the experimental Fonts API

  • #15230 3da6272 Thanks @rahuld109! - Fixes greedy regex in error message markdown rendering that caused link syntax examples to capture extra characters

  • #15253 2a6315a Thanks @matthewp! - Fixes hydration for React components nested inside HTML elements in MDX files

  • #15227 9a609f4 Thanks @matthewp! - Fixes styles not being included for conditionally rendered Svelte 5 components in production builds

  • #14607 ee52160 Thanks @simensfo! - Reintroduces css deduplication for hydrated client components. Ensures assets already added to a client chunk are not flagged as orphaned

7 hours ago
react-markdown-editor-lite

v1.4.2

  • fix: react error #311
7 hours ago
tldraw

v4.3.0

This release introduces several significant changes: a new pattern for defining custom shape/binding typings, pluggable storage for TLSocketRoom with a new SQLite option, reactive editor.inputs, and optimized draw shape encoding. It also adds various other API improvements, performance optimizations, and bug fixes, including better support for React 19.


New pattern for defining custom shape/binding types (breaking change) (#7091)

We've improved the developer experience of working with custom shape and binding types. There's now less boilerplate and fewer gotchas when using tldraw APIs in a type-safe manner.

This is a minor breaking change at the type level—your code will still run, but you'll get TypeScript errors until you migrate.

Migration guide

When declaring types for custom shapes, you can now use TypeScript's module augmentation feature to provide more specific types for the custom shape.

Before:

import { TLBaseShape } from 'tldraw'

// Shapes were defined by using the helper TLBaseShape type
type MyShape = TLBaseShape<'my-shape', { w: number; h: number; text: string }>

After:

import { TLShape } from 'tldraw'

const MY_SHAPE = 'my-shape'

// We now use TypeScript's module augmentation feature to allow
// extending the builtin TLShape type.
declare module 'tldraw' {
	export interface TLGlobalShapePropsMap {
		[MY_SHAPE]: { w: number; h: number; text: string }
	}
}

type MyShape = TLShape<typeof MY_SHAPE>

The benefit of this new system is that Editor APIs such as createShape now know about your custom shapes automatically:

// Just works - TypeScript validates props and provides autocomplete
editor.createShape({ type: 'my-shape', props: { w: 100, h: 100, text: 'Hello' } })

// Will cause a TypeScript error for `text`
editor.createShape({ type: 'my-shape', props: { w: 100, h: 100, text: 123 } })

The same pattern applies to custom bindings. See the Custom Shapes Guide and the Pin Bindings example for details.

(contributed by @Andarist)


Pluggable storage for TLSocketRoom + SQLite support (#7320, #7123)

We've refactored the TLSocketRoom API to support a pluggable storage layer. We're providing two implementations:

  • SQLiteSyncStorage – Automatically persists room state to SQLite. Recommended for production.
  • InMemorySyncStorage – Keeps state in memory with manual persistence via callbacks (previous built-in behavior).

We recommend switching to SQLiteSyncStorage if your environment supports SQLite (Cloudflare Durable Objects, Node.js, Bun, Deno). It provides automatic persistence, lower memory usage, and faster startup times.

Why SQLite?
  • Automatic persistence: Data survives process restarts without manual snapshot handling
  • Lower memory usage: No need to keep entire documents in memory
  • Faster startup: No need to load the document into memory before accepting socket connections
  • Simpler code: No more onChange callbacks and manual persistence logic
Platform support
Platform Wrapper SQLite Library
Cloudflare Durable Objects DurableObjectSqliteSyncWrapper Built-in ctx.storage
Node.js/Deno NodeSqliteWrapper better-sqlite3 or node:sqlite

See the Cloudflare template and the Node server example respectively. Bun support should be straightforward to add.

Migration guide

Existing code continues to work, however we have deprecated the following TLSocketRoom options:

  • initialSnapshot
  • onDataChange

These are replaced by the new storage option. We've also deprecated the TLSocketRoom.updateStore method, which has been supplanted by storage.transaction.

Before:

const existingSnapshot = loadExistingSnapshot()

const room = new TLSocketRoom({
	initialSnapshot: existingSnapshot,
	onDataChange: () => {
		persistSnapshot(room.getCurrentSnapshot())
	},
})

If you want to keep the same behavior with in-memory document storage and manual persistence:

import { InMemorySyncStorage, TLSocketRoom } from '@tldraw/sync-core'

const room = new TLSocketRoom({
	storage: new InMemorySyncStorage({
		snapshot: existingSnapshot,
		onChange() {
			saveToDatabase(storage.getSnapshot())
		},
	}),
})

However, we recommend switching to SQLite. Users of our Cloudflare template should follow the migration guide on the sync docs page.

If you're using TLSocketRoom on Node, creating the room should end up looking something like this:

import Database from 'better-sqlite3'
import { SQLiteSyncStorage, NodeSqliteWrapper, TLSocketRoom, RoomSnapshot } from '@tldraw/sync-core'

async function createRoom(roomId: string) {
	const db = new Database(`path/to/${roomId}.db`)
	const sql = new NodeSqliteWrapper(db)
	let snapshot: RoomSnapshot | undefined = undefined
	if (!SQLiteSyncStorage.hasBeenInitialized(sql)) {
		// This db hasn't been used before, so if it's a pre-existing
		// document, load the legacy room snapshot
		snapshot = await loadExistingSnapshot()
	}

	const storage = new SQLiteSyncStorage({ sql, snapshot })
	return new TLSocketRoom({
		storage,
		onSessionRemoved(room, args) {
			if (args.numSessionsRemaining === 0) {
				room.close()
				db.close()
			}
		},
	})
}

Optimized draw shape encoding (#7364, #7710)

Draw and highlight shape point data is now stored using a compact delta-encoded binary format instead of JSON arrays. This reduces storage size by approximately 80% while preserving stroke fidelity.

Breaking change details

If you were reading or writing draw shape data programatically you might need to update your code to use the new format.

  • TLDrawShapeSegment.points renamed to .path and changed from VecModel[] to string (base64-encoded)
  • Added scaleX and scaleY properties to draw and highlight shapes
  • New exports: b64Vecs encoding utilities, e.g. getPointsFromDrawSegment helper. Use this if you need to manually read/write point data.

Existing documents are automatically migrated.


Reactive inputs (#7312)

Refactored editor.inputs to use reactive atoms via the new InputsManager class. All input state is now accessed via getter methods (e.g., editor.inputs.getCurrentPagePoint(), editor.inputs.getShiftKey()). Direct property access is deprecated but still supported for backwards compatibility.

API changes

  • 💥 DefaultTopPanel export removed from tldraw. The top panel component for displaying the offline indicator is now handled internally by PeopleMenu. (#7568)
  • 💥 TextDirection export removed from tldraw. Use TipTap's native TextDirection extension instead. The richTextValidator now includes an optional attrs property - a migration may be necessary for older clients/custom shapes. (#7304)
  • Add tlenvReactive atom to @tldraw/editor for reactive environment state tracking, including coarse pointer detection that updates when users switch between mouse and touch input. (#7296)
  • Add hideAllTooltips() helper function for programmatically dismissing tooltips. (#7288)
  • Add zoomToFitPadding option to TldrawOptions to customize the default padding used by zoom-to-fit operations. (#7602)
  • Add snapThreshold option to TldrawOptions for configuring the snap distance, defaulting to 8 screen pixels. (#7543)
  • Add resizeChildren configuration option to FrameShapeUtil to allow frame children to be resized proportionally when the frame is resized. (#7526)
  • Add Editor.canEditShape() and Editor.canCropShape() methods to centralize shape permission checks. Add ShapeUtil.canEditWhileLocked() for shapes that remain editable when locked. (#7361)
  • Add editor.getDebouncedZoomLevel() and editor.getEfficientZoomLevel() methods for improved zoom performance on dense canvases. Add debouncedZoom and debouncedZoomThreshold options. (#7235)
  • Add configurable showTextOutline option to TextShapeUtil, ArrowShapeUtil, and GeoShapeUtil via .configure() pattern. (#7314)
  • Export freehand stroke utilities: getStroke, getStrokeOutlinePoints, and setStrokePointRadii. (#7400) (contributed by @VimHax)
  • Add Box.isValid() method to check for finite coordinates. (#7532)
  • Add spacebarPanning option to control whether spacebar activates pan mode. (#7312)
  • Introduce pluggable TLSyncStorage API for TLSocketRoom. The initialSnapshot and onDataChange options are now deprecated in favor of the new storage option. (#7123)
  • Export DefaultLabelColorStyle which is necessary for rich text in custom shapes. (#7114)

Improvements

  • Improve coarse pointer detection by replacing CSS media queries with a reactive data-coarse attribute that updates when users switch between mouse and touch input. (#7404)
  • Add CSS containment to main toolbar and text measurement element for improved rendering performance. (#7406) (#7407)
  • Improve cross-realm support by scoping canvas event listeners to the editor container's ownerDocument. (#7113)
  • Simplify ImmutableMap implementation for better code clarity. (#7431)
  • Improve code readability in number validator by using Number.isFinite() instead of arithmetic trick. (#7374)
  • Upgrade to React 19 with all necessary type and configuration changes for compatibility. (#7317)
  • Improve signal graph traversal performance by eliminating per-recursion closure allocations. (#7430)
  • Optimize object utility functions. (#7432)
  • Use in-place sorting in parentsToChildren derivation. (#7433)
  • Optimize notVisibleShapes derivation with inlined bounds checks. (#7429)
  • Cache label size measurements with WeakCache for improved geo shape performance. (#7412)
  • Optimize validators with fast paths and production inlining. (#7373)

Bug fixes

  • Fix migrations for draw and highlight shapes to be idempotent, preventing errors when migrations run multiple times. (#7389)
  • Fix dot detection in draw and highlight shapes after the point compression change. (#7365)
  • Fix clicking a shape's text label while editing to re-focus the input and select all text. (#7342)
  • Fix pasting at cursor to correctly account for frames and parent containers. (#7277)
  • Fix editing mode to exit when dragging causes the text input to blur. (#7291)
  • Fix CommonJS build issues with TipTap imports in rich text module. (#7282)
  • Fix iOS automatically zooming in on input fields by ensuring 16px minimum font size. (#7118)
  • Fix distanceToLineSegment returning squared distance instead of actual distance, causing hit testing (eraser, scribble select) to be too strict. (#7610) (contributed by @arpit-goblins)
  • Fix zoomToSelection to toggle between 100% zoom and zoom-to-fit behavior. (#7536)
  • Fix export of SVG markers by handling fragment-only URLs correctly. (#7506) (contributed by @PidgeyBE)
  • Restore wheel and pinch canvas event emission. (#6834) (contributed by @swdev33)
  • Fix context menu submenu flickering when hovered. (#6837) (contributed by @swdev33)
  • Fix rotated shape positions not being restored after flipping twice. (#7359)
  • Fix keyboard shortcuts and clipboard events not working when hideUi is true. (#7367)
  • Fix elbow arrows routing incorrectly when using dynamic sizing at high zoom levels. (#7424)
  • Allow fullscreen for embed shapes. (#7417)
  • Move mobile rotate handle to bottom for image and video shapes to accommodate the contextual toolbar. (#6727)
  • Fix dropdown menu items incorrectly displaying an icon on the right side. (#7533)
  • Fix zoom menu showing debounced zoom level for canvases with many shapes. (#7626)
  • Fix extra line appearing after bullet and ordered lists in text shapes. (#7643) (contributed by @sahiee-dev)
  • Fix "Back to content" button not appearing when selected shapes are off-screen. (#7649)
  • Fix dotted freehand lines becoming invisible at minimum zoom on Chrome. (#7650)
  • Fix menu bar stretching to full width on mobile viewports instead of fitting content. (#7568)
8 hours ago
router

v1.154.1

Version 1.154.1 - 1/21/26, 11:28 AM

Changes

Fix

  • router-core: correct splat param extraction after a skipped optional param (#6434) (9c934b7) by @Sheraff

Docs

  • url rewrites (621a79c) by Tanner Linsley
  • remove outdated (aced5f6) by Manuel Schiller

Packages

  • @tanstack/router-core@1.154.1
  • @tanstack/solid-router@1.154.1
  • @tanstack/react-router@1.154.1
  • @tanstack/vue-router@1.154.1
  • @tanstack/solid-router-ssr-query@1.154.1
  • @tanstack/react-router-ssr-query@1.154.1
  • @tanstack/vue-router-ssr-query@1.154.1
  • @tanstack/router-ssr-query-core@1.154.1
  • @tanstack/zod-adapter@1.154.1
  • @tanstack/valibot-adapter@1.154.1
  • @tanstack/arktype-adapter@1.154.1
  • @tanstack/router-devtools@1.154.1
  • @tanstack/solid-router-devtools@1.154.1
  • @tanstack/react-router-devtools@1.154.1
  • @tanstack/vue-router-devtools@1.154.1
  • @tanstack/router-devtools-core@1.154.1
  • @tanstack/router-generator@1.154.1
  • @tanstack/router-cli@1.154.1
  • @tanstack/router-plugin@1.154.1
  • @tanstack/router-vite-plugin@1.154.1
  • @tanstack/solid-start@1.154.1
  • @tanstack/solid-start-client@1.154.1
  • @tanstack/solid-start-server@1.154.1
  • @tanstack/vue-start@1.154.1
  • @tanstack/vue-start-client@1.154.1
  • @tanstack/vue-start-server@1.154.1
  • @tanstack/start-client-core@1.154.1
  • @tanstack/start-server-core@1.154.1
  • @tanstack/start-storage-context@1.154.1
  • @tanstack/react-start@1.154.1
  • @tanstack/react-start-client@1.154.1
  • @tanstack/react-start-server@1.154.1
  • @tanstack/start-plugin-core@1.154.1
  • @tanstack/start-static-server-functions@1.154.1
8 hours ago
joint

Release v4.2.3

CHANGELOG

@joint/core

  • dia.Paper - fix to wake up idle async paper with initializeUnmounted: true when a new cell is added to graph (879b8ca6)
  • dia.Paper - fix to prevent an error when a view is synchronously dumped during an asynchronous visibility check (42d55cb6)
  • dia.Element - fix getPortBBox() to return a valid bbox when port has no size defined (96867e75)

@joint/layout-directed-graph

  • layout.DirectedGraph - fix to accept a padding object for clusterPadding option of layout() (d7114104)