v3.0.4
3.0.4 — 2026-03-22
New packages
-
@alt-javascript/boot-jsdbc— CDI auto-configuration for SQL persistence via
@alt-javascript/jsdbc. RegistersdataSource,jsdbcTemplate,
namedParameterJsdbcTemplate, andschemaInitializerbeans fromboot.datasource.*config.
ProvidesjsdbcTemplateStarter(),jsdbcStarter(),jsdbcAutoConfiguration(),
DataSourceBuilder(secondary datasources),ConfiguredDataSource, andSchemaInitializer. -
@alt-javascript/flyway— Standalone Flyway-inspired migration engine (no Boot/CDI
dependency). Implements the Flyway OSS feature set (Apache 2.0 attribution): versioned
migrations (V{version}__{description}.sql), CRC32 checksum verification, schema history
tracking (flyway_schema_history),migrate(),info(),validate(),baseline(),
repair(), andclean(). -
@alt-javascript/boot-flyway— CDI starter for@alt-javascript/flyway. Registers a
managedFlywaybean that runsmigrate()during context startup. Reads configuration from
boot.flyway.*. Exposesready()for dependants to await completion (CDI does not await
asyncinit()). Supports custom history table name, baseline-on-migrate, out-of-order
migrations, and secondary datasource wiring viadatasourceBeanoption. -
@alt-javascript/boot-jsnosqlc— CDI auto-configuration for NoSQL persistence via
@alt-javascript/jsnosqlc. RegistersnosqlClientDataSourceandnosqlClientbeans from
boot.nosql.*config. No template layer —Collectionis the high-level API. Provides
jsnosqlcStarter(),jsnosqlcAutoConfiguration(),jsnosqlcBoot(),NoSqlClientBuilder
(secondary clients),ConfiguredClientDataSource, andManagedNosqlClient.
New examples
-
example-5-1-advanced— AOP, application events,BeanPostProcessor, constructor
injection, conditional beans,setApplicationContext, and dev-profile configuration. -
example-5-2-persistence-jsdbc— SQL persistence withjsdbcTemplateStarter();
NoteRepositorybacked byJsdbcTemplate; schema and seed data loaded from
config/schema.sqlandconfig/data.sqlbySchemaInitializer. -
example-5-3-persistence-flyway— Flyway-managed schema evolution: three migration
files (V1table,V2schema change,V3seed data);NoteRepositorycarries no DDL;
Application.run()awaitsmanagedFlyway.ready(). -
example-5-4-persistence-flyway-multidb— Two independent SQL databases in one
ApplicationContext: primary notes DB with its ownJsdbcTemplateand Flyway runner,
secondary tags DB with its own stack and independentmanagedFlywayTagsrunner.
Application awaitsPromise.all([mf.ready(), mft.ready()]). -
example-5-5-persistence-nosql— NoSQL persistence withjsnosqlcBoot();NoteRepository
usesCollectiondirectly (insert,get,update,delete,find,for await...of);
Filter.where().contains()for tag-based queries. -
example-5-6-persistence-nosql-multidb— Two independent NoSQL clients in one context:
nosqlClient(user profiles) andsessionClient(session tokens). Store isolation verified.
New: @alt-javascript/jsdbc-template (CDI-free)
JsdbcTemplateandNamedParameterJsdbcTemplateextracted from CDI dependency.
CDI auto-configuration moved toboot-jsdbc, leavingjsdbc-templatedependency-free.
JsdbcTemplatecan now be used standalone without a CDI context.
Bug fixes
-
ConfiguredDataSource.getConnection()concurrent-init race (boot-jsdbc). When two CDI
beans (e.g.SchemaInitializerandManagedFlyway) both calledgetConnection()during
context startup before either resolved,SingleConnectionDataSourcecreated two separate
in-memory databases, silently discarding the first. Fixed with a promise-mutex
(_connectionPromise) — only one connection is ever created regardless of concurrent callers. -
SchemaInitializerSQL comment stripping (boot-jsdbc). Statements whose first line was
a--comment were silently dropped: the filter!s.startsWith('--')was applied to the
whole chunk after splitting on;, so-- comment\nCREATE TABLE ...was discarded entirely.
Fixed by stripping comment lines per-chunk before filtering empty statements. -
SchemaInitializerasync race (boot-jsdbc).init()is async but CDI does not await
it, so dependent beans could query the database before schema was applied. Fixed by storing
_initPromiseininit()and exposingready()— same pattern asManagedFlyway. -
Duck-type config check in
Boot.detectConfig(). Replacedinstanceof ValueResolvingConfig
guard with ahas()/get()interface check, soProfileAwareConfig,EphemeralConfig, and
any future config types pass through without being unnecessarily wrapped. -
Boot.boot()copy-paste bug:loggerCategoryCacheArg. Assignment read
context.loggerFactoryinstead ofcontext.loggerCategoryCache, so the logger category cache
was never passed through to the boot context. -
Boot.boot()assignment bug:$loggerCategoryCache.$configwas incorrectly assigned
window.loggerCategoryCacheinstead of$loggerCategoryCache. -
@alt-javascript/boot-vue—Boot.boot()not called beforeApplicationContext. The
Vue integration was creatingApplicationContextwithout first callingBoot.boot({ config }),
so the global root was never populated and component wiring failed in CDN/no-build usage.
New features
-
Startup banner inlined into
ApplicationContext. The banner is now a string constant
insideApplicationContext.js— no filesystem access, no async I/O. Works in browser and
Node without modification. Controlled byboot.banner-mode:console(default, matches Spring Boot behaviour) — prints tostdoutlog— routes through the configured@alt-javascript/loggeratinfoleveloff— suppressed entirely
-
Banner version resolved at runtime. The version line (
@alt-javascript/boot :: x.y.z) is
read frompackage.jsonviacreateRequire(import.meta.url). In browser environments it
shows as(browser). -
Banner suppressed in test mode.
Boot.test()injectsbanner-mode: offso test output
stays clean without changes to individual test fixtures.
Config key reference
boot.datasource.*— SQL datasource (primary); secondary viaDataSourceBuilder.create().prefix()boot.flyway.*— Flyway migrations (primary); secondary viaflywayStarter({ prefix })boot.nosql.*— NoSQL client (primary); secondary viaNoSqlClientBuilder.create().prefix()