From e18a74b936e43aeb7f74df433d88f294f9bcc877 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 26 Aug 2026 14:16:41 -0700 Subject: The app arrives in movements: real ESM chunks split the bundle (entry 333KB, shared chunks alongside, 61KB of gifts/NWC/hats deferred past first paint into slots that keep their hook seniority), the lazy scripts wear IIFE coats so their names can't collide with the page's — which is what silently broke the remote-signer button — nip98 moves out of the login module so minimal builds stop hauling backup relays, and the smoke test learns the front door's new steps while the regtest stack rises from its IBD nap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi --- src/features/index.js | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) (limited to 'src/features/index.js') diff --git a/src/features/index.js b/src/features/index.js index 5ecb7c0..a32bced 100644 --- a/src/features/index.js +++ b/src/features/index.js @@ -3,24 +3,33 @@ // build.js replaces this module's contents based on HAL_FEATURES, so a // disabled feature's code — and its network endpoints — never enters the // bundle. See featureIndexSource() in build.js. - -import { giftsFeature } from './gifts.js'; -import { nostrLoginFeature } from './nostrlogin.js'; +// +// This checked-in copy must stay byte-equivalent (comments aside) to +// featureIndexSource(all features) — tools/feature-registry-check.js enforces +// it. Deferred features (gifts, nwc, hats) hold their array position with an +// empty placeholder — hook precedence is position — and are filled in place +// by loadDeferredFeatures right after boot, as separate chunks in the split +// build. NB order is meaningful where hooks stack: gifts' receive takeover +// and balance line come before ark's; zaps sits after ark so an npub prefers +// an instant Ark zap; nwc sits after ark because it drives ark's headless +// pay/balance seam; names sits between ark and zaps so a pasted user@domain +// resolves over DNS (BIP-353) before zaps treats it as a Lightning address. import { arkFeature } from './ark.js'; +import { nostrLoginFeature } from './nostrlogin.js'; import { namesFeature } from './names.js'; import { zapsFeature } from './zaps.js'; import { syncFeature } from './sync.js'; -import { nwcFeature } from './nwc.js'; -import { hatsFeature } from './hats.js'; import { messagesFeature } from './messages.js'; -// NB order is meaningful where hooks stack: gifts' receive takeover and -// balance line come before ark's, matching the pre-plugin layout. zaps sits -// after ark so an npub prefers an instant Ark zap and only falls through to a -// Lightning zap when Ark can't serve it. nwc sits after ark because it -// drives ark's headless pay/balance seam. -// names sits between ark and zaps: a pasted user@domain resolves over DNS -// (BIP-353) before the zaps feature treats it as a plain Lightning address. export function buildFeatures(ctx) { - return [giftsFeature(ctx), arkFeature(ctx), nostrLoginFeature(ctx), namesFeature(ctx), zapsFeature(ctx), nwcFeature(ctx), hatsFeature(ctx), syncFeature(ctx), messagesFeature(ctx)]; + return [{}, arkFeature(ctx), nostrLoginFeature(ctx), namesFeature(ctx), zapsFeature(ctx), {}, {}, syncFeature(ctx), messagesFeature(ctx)]; +} +export async function loadDeferredFeatures(ctx, features) { + const late = []; + await Promise.all([ + import('./gifts.js').then((m) => { late.push(features[0] = m.giftsFeature(ctx)); }), + import('./nwc.js').then((m) => { late.push(features[5] = m.nwcFeature(ctx)); }), + import('./hats.js').then((m) => { late.push(features[6] = m.hatsFeature(ctx)); }) + ]); + return late; } -- cgit v1.2.3