11/**
22 * @kissjs /core - entry-generators.ts tests (Deno)
33 *
4- * v0.5.0: Simplified client entry — no hydration strategies, no Lit imports .
4+ * v0.5.0: IntersectionObserver lazy loading .
55 */
66import { assertEquals , assertExists , assertFalse } from 'jsr:@std/assert@^1.0.0' ;
77import { generateClientEntry } from '../src/entry-generators.ts' ;
@@ -18,85 +18,49 @@ const PACKAGE_ISLAND = {
1818 isPackage : true as const ,
1919} ;
2020
21- // ─── Empty Islands ──────────────────────────────────────────
22-
23- Deno . test ( 'generateClientEntry returns no-op for empty islands' , ( ) => {
21+ Deno . test ( 'empty islands → zero client JS' , ( ) => {
2422 const code = generateClientEntry ( [ ] ) ;
2523 assertExists ( code . includes ( 'zero client JS needed' ) ) ;
2624} ) ;
2725
28- // ─── Local Island Registration ─────────────────────────────
29-
30- Deno . test ( 'generateClientEntry registers local island via dynamic import' , ( ) => {
26+ Deno . test ( 'local island in lazy map' , ( ) => {
3127 const code = generateClientEntry ( [ LOCAL_ISLAND ] ) ;
3228 assertExists ( code . includes ( "import('./islands/my-counter.ts')" ) ) ;
33- assertFalse (
34- code . includes ( "import Island_0 from './islands/my-counter.ts'" ) ,
35- 'Local islands must use dynamic import()' ,
36- ) ;
3729} ) ;
3830
39- // ─── Package Island Dynamic Import ─────────────────────────
40-
41- Deno . test ( 'generateClientEntry uses dynamic import for package islands' , ( ) => {
31+ Deno . test ( 'package island in lazy map' , ( ) => {
4232 const code = generateClientEntry ( [ PACKAGE_ISLAND ] ) ;
4333 assertExists ( code . includes ( "import('@kissjs/ui/kiss-theme-toggle')" ) ) ;
44- // Should be dynamic import(), not static import
45- assertExists ( code . match ( / i m p o r t \s * \( / ) ) ;
46- assertFalse (
47- code . includes ( `import '${ PACKAGE_ISLAND . modulePath } '` ) ,
48- 'Package islands must use dynamic import()' ,
49- ) ;
5034} ) ;
5135
52- // ─── Mixed Islands ─────────────────────────────────────────
53-
54- Deno . test ( 'generateClientEntry handles mixed local and package islands' , ( ) => {
36+ Deno . test ( 'mixed islands' , ( ) => {
5537 const code = generateClientEntry ( [ LOCAL_ISLAND , PACKAGE_ISLAND ] ) ;
56-
5738 assertExists ( code . includes ( "import('./islands/my-counter.ts')" ) ) ;
5839 assertExists ( code . includes ( "import('@kissjs/ui/kiss-theme-toggle')" ) ) ;
59-
60- assertFalse (
61- code . includes ( "import Island_0 from './islands/my-counter.ts'" ) ,
62- 'Local islands must use dynamic import()' ,
63- ) ;
6440} ) ;
6541
66- // ─── No Lit Hydration ──────────────────────────────────────
67-
68- Deno . test ( 'generateClientEntry has no Lit hydration imports' , ( ) => {
42+ Deno . test ( 'no Lit hydration' , ( ) => {
6943 const code = generateClientEntry ( [ LOCAL_ISLAND ] ) ;
70- // v0.5.0: No Lit hydration — CE spec handles element upgrade
7144 assertEquals ( code . includes ( 'lit-element-hydrate-support' ) , false ) ;
72- assertEquals ( code . includes ( 'litElementHydrateSupport' ) , false ) ;
7345 assertEquals ( code . includes ( 'LitElement' ) , false ) ;
74- assertEquals ( code . includes ( 'defer-hydration' ) , false ) ;
75- assertEquals ( code . includes ( '__kissFindDeferred' ) , false ) ;
76- assertEquals ( code . includes ( '__kissHydrateAll' ) , false ) ;
7746} ) ;
7847
79- // ─── whenDefined List ──────────────────────────────────────
80-
81- Deno . test ( 'generateClientEntry creates whenDefined list for all islands' , ( ) => {
82- const code = generateClientEntry ( [
83- LOCAL_ISLAND ,
84- { ...PACKAGE_ISLAND } ,
85- { tagName : 'code-block' , modulePath : './islands/code-block.ts' , isPackage : false } ,
86- ] ) ;
87-
88- assertExists ( code . includes ( "customElements.whenDefined('my-counter')" ) ) ;
89- assertExists ( code . includes ( "customElements.whenDefined('kiss-theme-toggle')" ) ) ;
90- assertExists ( code . includes ( "'code-block'" ) ) ;
48+ Deno . test ( 'IntersectionObserver + lazy map' , ( ) => {
49+ const code = generateClientEntry ( [ LOCAL_ISLAND , PACKAGE_ISLAND ] ) ;
50+ assertExists ( code . includes ( 'IntersectionObserver' ) ) ;
51+ assertExists ( code . includes ( "'my-counter': () => import('./islands/my-counter.ts')" ) ) ;
52+ assertExists ( code . includes ( "'kiss-theme-toggle': () => import('@kissjs/ui/kiss-theme-toggle')" ) ) ;
9153} ) ;
9254
93- // ─── kiss:ready Event ──────────────────────────────────────
94-
95- Deno . test ( 'generateClientEntry dispatches kiss:ready event' , ( ) => {
55+ Deno . test ( 'kiss:ready event' , ( ) => {
9656 const code = generateClientEntry ( [ LOCAL_ISLAND ] ) ;
97-
98- // v0.5.0: dispatches kiss:ready instead of hydration ceremony
9957 assertExists ( code . includes ( 'kiss:ready' ) ) ;
100- assertExists ( code . includes ( 'customElements.whenDefined' ) ) ;
101- assertExists ( code . includes ( 'Promise.all' ) ) ;
58+ assertExists ( code . includes ( 'IntersectionObserver' ) ) ;
59+
60+ // Validate JS syntax — generated code must be clean JavaScript
61+ try {
62+ new Function ( code ) ;
63+ } catch ( e ) {
64+ assertEquals ( true , false , `Generated JS has syntax error: ${ String ( e ) } ` ) ;
65+ }
10266} ) ;
0 commit comments