Repository navigation
Releases
v0.20.2
Full Changelog: v0.20.1...v0.20.2
v0.20.1
Patch release. Fixes a CompressionStream backpressure deadlock that hung encrypted/compressed replication journal segments (encodeEncryptedJournalSegment, exportJournalArchive) in browsers; fixes the Replication Simulator promoted badge and binary header dump; corrects the simulator E2E suite. See packages/firebird-wasm/CHANGELOG.md.
v0.20.0
Replication release: journal-based logical replication (slots, HLC + CRDTs, filters, HTTP/WS/BroadcastChannel transports), promoteReplica, time travel (asOfLsn/rewindToLsn), AES-256-GCM + Gzip segments, multi-node mesh/hub coordinator, dead-letter queue (FB_REPL_DLQ$), PII masking (transformRow), PITR archives, replication tab, Replication Simulator v2 + Playwright E2E. See packages/firebird-wasm/CHANGELOG.md and docs/replication.md.
v0.16.0
Added
- JavaScript User-Defined Functions & Procedures (
db.registerFunction()&db.registerProcedure()).- Added
db.registerFunction(name, options, fn)anddb.registerProcedure(name, options, fn)on bothFirebirdBrowserandFirebirdLite, plus a static C++"JS"IExternalEngineUDR plugin (JsExternalEngineinfb_wasm_api.cpp) and a transparent PSQL catalog stub + JS expression bridge (UdrManager) supporting scalar functions inSELECT,WHERE, andCOMPUTED BYcolumns as well as selectable table-valued procedures (SELECT * FROM proc(...)) andEXECUTE PROCEDURE.
- Added
- Client-side vector similarity & hybrid RAG search (
firebird-wasm/vector).- Added the
firebird-wasm/vectorsubpath export withencodeVector,decodeVector,formatVectorText,vectorColumnType,cosineDistance,cosineSimilarity,l2Distance,squaredL2Distance,dotProduct,innerProductDistance,vectorNorm,normalizeVector,registerVectorFunctions(db), and hybrid SQL + KNNvectorSearch(db, options).
- Added the
- Direct page-level OPFS VFS (
OPFSVFS&SyncAccessHandlePIO).- Added
OPFSVFS(firebird-wasm/browser) mounting an Emscripten filesystem node backed directly byFileSystemSyncAccessHandle.read(buf, { at })and.write(buf, { at })for zero-MEMFS-copy page-level I/O (readPage,writePage,importDatabase,exportDatabase).
- Added
- WebCrypto AES-256-GCM page encryption at rest (
encryptionKey&encryptionPassword).- Added transparent page-level AES-256-GCM encryption at rest (
encryptPage,decryptPage,deriveEncryptionKey,generateEncryptionKey,exportEncryptionKey,importEncryptionKey) acrossIndexedDBVFS,OPFSVFS, andFirebirdBrowserOptions(encryptionKey,encryptionPassword,encryptionSalt) with per-page IVs and AAD binding page numbers to prevent page-swapping attacks.
- Added transparent page-level AES-256-GCM encryption at rest (
- Point-in-time Copy-on-Write snapshots & database branching (
db.snapshot(),db.restoreSnapshot(),db.branch()).- Added content-addressable FNV-1a Copy-on-Write page snapshots (
SnapshotStore,db.snapshot(),db.restoreSnapshot(),db.listSnapshots(),db.deleteSnapshot(), anddb.branch()) onFirebirdBrowserandFirebirdLitefor instant O(changed pages) rollback and isolated database branches.
- Added content-addressable FNV-1a Copy-on-Write page snapshots (
- Cross-tab reactive live queries (
BroadcastChannelinvalidation).- Extended
createLiveQuery(firebird-wasm/browser,firebird-wasm/react,firebird-wasm/vue,firebird-wasm/svelte,firebird-wasm/solid) with automatic cross-tabBroadcastChanneltable invalidation (crossTab,channelName,notifyTablesChanged) so writes in one browser tab immediately refresh subscribed queries in sibling tabs.
- Extended
- Multi-table transactional Electric shape sync (
syncShapes).- Added
syncShapes(db, options)(firebird-wasm/electric) coordinating multiple Electric shapes with topological foreign-key ordering (resolveShapeTableOrder) and shared atomic batch transactions across parent and child tables.
- Added
- Pushed-down
WHEREjoin filtering & batched delta queries infirebird-wasm/electric-server.createShapeServernow pusheswherepredicates into a singleELECTRIC_CHANGES LEFT JOIN <table>SQL query during incremental delta syncs, batches primary-key lookups (IN (...)), and exposesserver.applyWrite()andreplica=fullold-value diffs.
- Query profiler &
MON$telemetry (db.onQuery(),db.monitorStats(), and<firebird-repl>Profiler tab).- Added
QueryProfiler,db.onQuery(listener),db.monitorStats(),db.resetMonitorStats()(combiningMON$IO_STATS,MON$MEMORY_USAGE,MON$TRANSACTIONS,MON$STATEMENTS, and prepare-cache hit rates), and an interactive Profiler tab in<firebird-repl>.
- Added
- Svelte 5 & SolidJS reactive adapters (
firebird-wasm/svelte&firebird-wasm/solid).- Added
firebird-wasm/svelte(createFirebirdStore,createLiveQueryStore,createQueryStore) andfirebird-wasm/solid(createFirebirdResource,createLiveQuerySignal).
- Added
Changed
- Migrated the unit and WASM console integration test suite from Jest (
ts-jest) to Vitest.
v0.14.0 — Zero-copy FBR\x01 binary result transfer across transports & Firebird 5.0 LTS / 6.0 WASM build matrix
This release wires zero-copy FBR\x01 binary result buffer transfer across DirectTransport, WorkerTransport, SharedEngineTransport, and serveEngine, and adds Firebird 5.0 LTS (v5.0-release, ODS 13.1) & Firebird 6.0 (master, ODS 14.0) WASM build support.
Added
- Zero-copy
FBR\x01binary result buffer transfer acrossWorkerTransportandSharedEngineTransport.DirectTransport,WorkerTransport,SharedEngineTransport, andserveEnginenow executequeryandcursor_fetchover the packed"FBR\x01"binary wire format (_fb_query_binaryand_fb_cursor_fetch_binary), copying a single contiguousArrayBufferslice fromHEAPU8, transferring its ownership zero-copy acrossWorker.postMessage/MessagePort.postMessagevia thetransferlist, and decoding on the consumer side withdecodeBinaryResultSet+peekBinaryResultShapeId+ lazyshape_columnshydration.- Added
patchBinaryResultSetColumns(buffer, columns)infirebird-wasm/browser(binary-result.ts) to inline column descriptors into a shape-ID-addressed"FBR\x01"buffer when needed.
- Firebird 5.0 LTS (
v5.0-release, ODS 13.1) & Firebird 6.0 (master, ODS 14.0) WASM build support.wasm/build.shnow accepts--firebird-ref <ref>(andFB_GIT_REF, with shorthands5/5.0/v5.0→v5.0-releaseand6/6.0/v6.0→master), detects Firebird's major version, selects version-specific patches underwasm/patches/v5.0/when targeting Firebird 5.0, and automatically invalidates native bootstrap and Emscripten build caches when the FirebirdHEADcommit changes.wasm/CMakeLists.txtadapts source lists across Firebird 5.0 and 6.0 (conditionalSchema.epp/Update.cpp,StatementMetadata.cpp,Savepoint.cpp,CharSetContainer.cpp,Monitoring.cpp, andLocalStatus.hshim for 5.0).- Added
_fb_wasm_purge_cached_statementsinfb_wasm_api.cppso idle unpinned cached statements are released before DDL / database drop operations. - Added a
build-wasm-v5job to.github/workflows/build-wasm.ymlthat builds and tests the Firebird 5.0 LTS WASM engine (firebird-wasm-v5.0artifact) alongside Firebird 6.0.
v0.13.0 — Binary Result Protocol, Segmented BLOB Streaming, Schema Introspection & Migrations, Sweep & Durable Write Queue
Added in v0.13.0
- Prepared statement cursor streaming (
stmt.queryStream(params?, options?)):PreparedStatement(db.prepare(sql)andtx.prepare(sql)) on bothFirebirdBrowserandFirebirdLitenow exposesstmt.queryStream(params?, options?)returning anAsyncIterableIterator<T>that streams rows in configurable batches (batchSize,rowMode) without re-preparing the SQL statement. - Schema introspection & transactional migrations (
db.introspect()andmigrate()): Addeddb.introspect(),db.migrate(migrations, options?),migrate(db, migrations, options?), andgetAppliedMigrations(db, options?)acrossFirebirdBrowserandFirebirdLite, querying Firebird system catalogs into typedDatabaseSchemametadata (tables,views,sequences) and running ordered transactional SQL/callback migrations tracked inFB_MIGRATIONS$. - Database maintenance & garbage-collection sweep (
db.sweep()and<firebird-repl>Sweepbutton): Exposesisc_dpb_sweep = isc_dpb_recordsvia_fb_sweepin the WASM C bridge anddb.sweep()on bothFirebirdBrowserandFirebirdLite(plus aSweepbutton in<firebird-repl>), returning aSweepResultwith before/afterDatabaseInfosnapshots,oitAdvancedBy, andreclaimedPages. - Durable offline write queue for Electric sync (
createWriteQueuepersistence & pre-image rollback):createWriteQueueinfirebird-wasm/electricnow persists pending mutations along with capturedBEFORE_JSONrow pre-images in a localFB_WRITE_QUEUE$table inside Firebird, surviving page reloads, automatically restoring local rows onWriteRejectedordiscard(id)/clear(), and providingpause(),resume(),onFlush, and automaticonlineevent flushing. - Segmented BLOB streaming (
db.openBlobStream()anddb.createBlobStream()): ExposesIBlob::getSegmentandIBlob::putSegmentthrough_fb_blob_create,_fb_blob_put_segment,_fb_blob_open_id,_fb_blob_open_query,_fb_blob_get_segment, and_fb_blob_closein the WASM C bridge and WebReadableStream<Uint8Array>/BlobWritableStreamAPIs (db.openBlobStream(),tx.openBlobStream(),db.createBlobStream(),tx.createBlobStream()) on bothFirebirdBrowserandFirebirdLite, with directBlobHandlebinding in parameterizedINSERT/UPDATEstatements. - Packed binary result buffer across the WASM C bridge (
_fb_query_binary&_fb_cursor_fetch_binary): Added the"FBR\x01"binary result wire format (encodeBinaryResultSet()anddecodeBinaryResultSet()infirebird-wasm/browser, plus_fb_query_binaryand_fb_cursor_fetch_binaryinfb_wasm_api.cpp), packing inline column descriptors or compact cachedshapeIdheaders, per-row null bitmasks, and taggedBOOL,INT32,FLOAT64,UTF8, andBYTEScells in WASM linear memory.
v0.12.0 — Zero-Config Live Queries, Explain Plans, Database Diagnostics, Prepared Handles, Streaming Dump/Restore & ICU Locale Packs
This release completes Milestone 7 (M7 — Developer Experience, Performance & Ecosystem), adding zero-config reactive queries, query execution plans (db.explain()), Node describeQuery() input parameter metadata parity, database diagnostics (db.databaseInfo()), explicit prepared statement handles (db.prepare()), streaming/gzip database dump & restore (dumpDataStream() / loadDataStream()), and optional lazy-loaded ICU locale tailoring packs (db.loadIcuLocaleData() / buildIcuLocalePack()).
Added
- Zero-config reactive queries (
db.live(sql, onChange)anduseLiveQuery(sql)without manualevents).
db.live()anduseLiveQuery()(infirebird-wasm/reactand
firebird-wasm/vue) now makeeventsoptional. When omitted,
extractReferencedTables()extracts the user tables referenced by the query
(skipping CTEs, selectable procedures, and system tables) and auto-installs an
idempotentAFTER INSERT OR UPDATE OR DELETE POSITION 32767trigger
(FB_LIVE$<hash>) once per table per session. - Query execution plans (
db.explain(sql, options?)and<firebird-repl>Explainbutton).
ExposesIStatement::getPlan(status, detailed)through_fb_explainin the
WASM C bridge anddb.explain(sql, { detailed?: boolean })(plustx.explain
andsqltagged-template overloads) on bothFirebirdBrowserand
FirebirdLite, returning either the compactPLAN (...)string or Firebird's
structured explained plan tree without executing the statement. Added an
Explainbutton to<firebird-repl>. - Node
describeQuery()input parameter metadata (params) parity.
FirebirdLite.describeQuery(sql)andFirebirdTransaction.describeQuery(sql)
now readstatementHandle.getInputMetadataAsyncand populate fullFieldInfo[]
metadata onparams, matchingFirebirdBrowser.describeQuery(sql). - Database diagnostics & OIT/OAT transaction health (
db.databaseInfo()and<firebird-repl>Infobutton).
ExposesIAttachment::getInfovia_fb_database_infoin the WASM C bridge and
db.databaseInfo()on bothFirebirdBrowserandFirebirdLite(plus an
Infobutton in<firebird-repl>), reportingpageSize,allocatedPages,
databaseSizeBytes,odsVersion,odsMinorVersion,oldestTransaction
(OIT),oldestActive(OAT),oldestSnapshot(OST),nextTransaction,
transactionGap,currentMemory,maxMemory,pageBuffers,reads,
writes,fetches, andmarks. - Explicit prepared statement handles (
db.prepare(sql)andtx.prepare(sql)).
Complements the internal 64-entry SQL statement cache with an explicit
PreparedStatementhandle (stmt.sql,stmt.fields,stmt.params,
stmt.statementType,stmt.hasResultSet,stmt.closed,stmt.query(params?, options?),
stmt.exec(params?),stmt.execBatch(rows),stmt.close()) on
FirebirdBrowser,FirebirdBrowserTransaction,FirebirdLite, and
FirebirdTransaction, backed by_fb_prepare/_fb_stmt_closein the WASM
C bridge and nativeStatementhandles on Node. - Streaming & gzip-compressed database dump and restore (
dumpDataStream()andloadDataStream()).
db.dumpDataStream({ chunkSize?, compression?: 'none' | 'gzip' }),
db.loadDataStream(source, options?), andoptions.loadDataStreamon both
FirebirdBrowserandFirebirdLiteexport and import database images in
64 KiB page-aligned chunks (with automaticDecompressionStream('gzip')
detection on0x1f 0x8bheaders) without allocating a single contiguous
Uint8Arrayof the entire database file in memory. - Optional lazy-loaded ICU locale tailoring packs (
db.loadIcuLocaleData()andbuildIcuLocalePack()).
Addedwasm/tools/build-icu-data.sh --locales,_fb_load_icu_data
(fb_wasm_register_icu_dataregistering a secondudata_setCommonData()slot
infb_wasm_icu_data.cpp),db.loadIcuLocaleData(data),
FirebirdBrowserOptions.icuLocaleData, andbuildIcuLocalePack(locales?)so
locale-specific collations (CREATE COLLATION ... FOR UTF8 FROM UNICODE 'LOCALE=de_DE',es_ES,fr_FR,ja_JP) can be lazy-loaded on demand
(raw.dator gzipped.dat.gz) without increasing the default WASM binary
size.
v0.11.0 — Embedded ICU 68 Collation Data (UNICODE, UNICODE_CI, UNICODE_CI_AI)
This release embeds ICU 68 collation data (icudt68l.dat) into the WASM engine so Firebird's UNICODE, UNICODE_CI (case-insensitive), and UNICODE_CI_AI (case- and accent-insensitive) collations work out of the box on both firebird-embedded-st and firebird-embedded.
Added
- Embedded ICU 68 collation data (
UNICODE,UNICODE_CI,UNICODE_CI_AI).
The WASM engine now ships a stripped ICU 68 common data package (icudt68l.dat, ~343 KB uncompressed / ~130 KB gzipped) containing the DUCET root collation table (coll/ucadata.icu,coll/root.res), Unicode normalization tables (nfc.nrm,nfkc.nrm), and character property resources, embedded at/icu/icudt68l.datvia--embed-fileand registered withudata_setCommonData()insidefb_init():COLLATE UNICODE,COLLATE UNICODE_CI(case-insensitive), andCOLLATE UNICODE_CI_AI(case- and accent-insensitive) now work out of the box inCREATE TABLE,ORDER BY,WHERE(=,LIKE,CONTAINING,STARTING WITH),GROUP BY,DISTINCT, and expression indexes (CREATE INDEX) on bothfirebird-embedded-standfirebird-embedded.- Fixed the static-ICU function pointer signature mismatch on
ucol_getContractionsAndExpansions(voidin ICU 68 vsint32_texpected by Firebird'sUnicodeUtil::ICU::ucolGetContractionsAndExpansionsunder WASM's strict indirect-call type checking) via thewasmUcolGetContractionsAndExpansionswrapper in patch0002.
v0.10.1 — Rebuilt WASM binaries, ORM multi-row INSERT via execBatch, and native IBatch
This patch release rebuilds and ships the 0.10.x WASM binaries (firebird-embedded.{js,wasm} and firebird-embedded-st.{js,wasm}) in the published npm tarball, routes multi-row INSERTs in firebird-wasm/kysely and firebird-wasm/drizzle through execBatch, wires native IBatch + addBlobAsync into FirebirdLite.execBatch, and includes wasm/build.sh and CI runner fixes.
Fixed
- Rebuilt WASM binaries in the published npm tarball. The
0.10.0npm package was packed before the local WASM rebuild ran and shipped the0.9.0dist/wasm/firebird-embedded.{js,wasm}anddist/wasm/firebird-embedded-st.{js,wasm}binaries (missing_fb_cursor_open/_fb_cursor_fetch/_fb_cursor_closeforqueryStream(),DECFLOATdecoding, and C bridge formatting fast paths).0.10.1ships the rebuilt0.10.xWASM artifacts in both the npm package and the GitHub release. - Multi-row
INSERTs in Kysely and Drizzle now execute viaexecBatch. Multi-rowINSERTstatements withoutRETURNINGinfirebird-wasm/kyselyandfirebird-wasm/drizzlenow route throughdb.execBatch('INSERT INTO … VALUES (?, …)', rows)instead ofINSERT INTO … SELECT ? FROM RDB$DATABASE UNION ALL …, avoiding Firebird SQL error-804(Data type unknown) on untyped?parameter markers inSELECTprojection lists. - Native
IBatchinFirebirdLite.execBatch(node-firebird-drivers#178). WhenstatementHandle.createBatchAsyncis available on the native client (merged upstream inasfernandes/node-firebird-drivers#178),FirebirdLite.execBatchandFirebirdTransaction.execBatchexecute batches through Firebird 4.0+'sIBatchAPI (includingaddBlobAsyncwithTAG_BLOB_POLICY = BLOB_ID_ENGINEsoBLOBparameters take no per-row round trips), falling back automatically toEXECUTE BLOCKon older drivers or Firebird 3.0 servers. - WASM build script (
wasm/build.sh) and CI fixes. Passes-C1togit apply --reverse --checkwhen verifying already-applied patches, passes-DCMAKE_C_FLAGS="-std=gnu11 -Wno-implicit-int"during the native host bootstrap configure for GCC 15 compatibility, and pins Playwright CI jobs toubuntu-24.04.
v0.10.0 — Kysely & Drizzle dialects, queryStream(), Node types parity, native IBatch, and OPFS/C bridge fast paths
This release adds Kysely (firebird-wasm/kysely) and Drizzle (firebird-wasm/drizzle) ORM dialects, the cursor/streaming query API (queryStream()), full Node backend types and FieldInfo parity, replica=full and applyWrite on the Electric shape server (firebird-wasm/electric-server), native IBatch + addBlobAsync support on Node (asfernandes/node-firebird-drivers#178), zero-copy OPFS reads and writes on the default single-threaded build (firebird-embedded-st), C bridge fast paths (DECFLOAT, SQL_FLOAT std::to_chars, offset-based SQL_TIME_TZ / SQL_TIMESTAMP_TZ, in-place appendScaledDecimal), and incremental WASM rebuild support in wasm/build.sh and CI.
Added
- Kysely and Drizzle ORM dialects (
firebird-wasm/kyselyandfirebird-wasm/drizzle). Both run againstFirebirdBrowserandFirebirdLite:firebird-wasm/kyselyexportsFirebirdDialect,FirebirdDriver,FirebirdQueryCompiler,FirebirdAdapter,FirebirdIntrospector, andcreateKysely(db, config?). Compiles?positional parameters, FirebirdOFFSET ? ROWS FETCH NEXT ? ROWS ONLYpagination (andROWS ?onUPDATE/DELETE), multi-rowINSERT(routed throughexecBatch),UPDATE OR INSERT INTO … MATCHING (…)upserts ononConflict,INSERT/UPDATE/DELETE … RETURNING, Firebird DDL (GENERATED BY DEFAULT AS IDENTITYbeforePRIMARY KEY,CREATE GLOBAL TEMPORARY TABLE,ALTER TABLE … ADD / DROP / ALTER COLUMN … TO …), transactions with Firebird isolation levels and savepoints, cursor streaming overqueryStream(), system-table introspection (RDB$RELATIONS/RDB$RELATION_FIELDS), and bijective lowercase/uppercase identifier folding (identifierCase: 'lower' | 'preserve').firebird-wasm/drizzleexportsdrizzle(db, config?),FirebirdDrizzleDialect,FirebirdDrizzleSession,FirebirdDrizzlePreparedQuery,FirebirdDrizzleTransaction,FirebirdDrizzleDatabase,firebirdTable, column builders, and query operators. Supports relational queries (db.query.*.findMany()), multi-row inserts (routed throughexecBatch), omitted identity/default columns,onConflictDoUpdateviaUPDATE OR INSERT … MATCHING,RETURNING,db.$count(), transactions, and nested savepoints.
- Cursor / streaming query API (
queryStream()).queryStream(sql, params?, options?)onFirebirdBrowser,FirebirdBrowserTransaction,FirebirdLite, andFirebirdTransaction(includingsqltagged-template overloads) returns anAsyncIterable<QueryResult<T>>yielding batches ofbatchSizerows (default500) over an open cursor (_fb_cursor_open,_fb_cursor_fetch,_fb_cursor_closein the WASM C bridge;ResultSet.fetch({ fetchSize })on Node). Breaking out offor awaitearly closes the cursor and finishes its autocommit transaction immediately without fetching the rest of the table. - Node backend
typesandFieldInfoparity.FirebirdLiteandFirebirdTransactionnow accepttypes: { bigint, dates, binary, parsers, serializers }at database construction and per-query (QueryOptions.types), populate fullFieldInfometadata (type,typeName,subType,scale,length,nullable) from the native statement metadata, and normalize wire values (BIGINT,INT128, scaledNUMERIC/DECIMAL,DATE,TIME,TIMESTAMP,TIME WITH TIME ZONE,TIMESTAMP WITH TIME ZONE,DECFLOAT, text/binaryBLOBs, andOCTETS) to matchFirebirdBrowser. - Shape server
replica=full,applyWrite,DECFLOAT, and batched change fetches.firebird-wasm/electric-servernow supports?replica=full: the update and delete triggers record prior column values inOLD_VALUESonELECTRIC_CHANGES, andreplica=fullresponses includeold_valueon updates (changed columns) and deletes (all non-key columns).server.applyWrite(write)executes aPendingWritefromcreateWriteQueuedirectly against the Firebird source table in one transaction and returns{ txid }for immediate write-queue confirmation.changesAfterbatches row fetches for changed keys withIN (?, …)in chunks of 200 instead of issuing oneSELECTper changed key.DECFLOAT(16)andDECFLOAT(34)(SQL_DEC16 = 260,SQL_DEC34 = 262) are decoded in the C bridge, mapped infirebird-wasm/electric-server, and accepted byfirebird-wasm/electric.
- Native
IBatchinFirebirdLite.execBatch(node-firebird-drivers#178). WhenstatementHandle.createBatchAsyncis available on the native client (merged upstream inasfernandes/node-firebird-drivers#178),FirebirdLite.execBatchandFirebirdTransaction.execBatchexecute batches through Firebird 4.0+'sIBatchAPI (includingaddBlobAsyncwithTAG_BLOB_POLICY = BLOB_ID_ENGINEsoBLOBparameters take no per-row round trips), falling back automatically toEXECUTE BLOCKon older drivers or Firebird 3.0 servers.
Changed
- Zero-copy OPFS reads and writes on the default single-threaded build. When
HEAPU8.bufferis a plainArrayBuffer(firebird-embedded-st),mountOpfspasses the WASM heap subarray directly toFileSystemSyncAccessHandle.readand.writewithout allocating or copying through an intermediate scratch buffer. - Faster C bridge value formatting.
SQL_FLOATusesstd::to_chars, offset-basedSQL_TIME_TZandSQL_TIMESTAMP_TZ(0..2878) are decoded in C withoutIUtil, andappendScaledDecimalwrites directly into the JSON buffer without temporary string shifts. - Incremental WASM rebuilds, GCC 15 host bootstrap, and CI verification.
wasm/build.shpreserves the timestamps of unchangedautoconfig.h,parse.h/parse.cpp, andepp-generatedoutputs across native bootstrap rebuilds, passes-DCMAKE_C_FLAGS="-std=gnu11 -Wno-implicit-int"so Firebird'sConfigure.cmakechecks succeed under GCC 15 (-std=gnu23), checks already-applied patches with-C1, andbuild-wasm.ymlruns an incremental rebuild check after wipingbuild-native-configand.wasm-patches-appliedand touchingfb_wasm_api.cpp.