coralite 0.40.2 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../lib/renderer.js"],"names":[],"mappings":"AA0CA;;;;;;;;;;;;;GAaG;AAEH;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AACH,+IAVG;IAAuC,GAAG,EAAlC,gBAAgB;IACY,aAAa,EAAzC,aAAa;IACQ,MAAM;IACJ,QAAQ;IACD,WAAW,EAAzC,eAAe;IACM,KAAK;IACR,OAAO,EAAzB,GAAG;IACoB,oBAAoB;CACnD,OAyjDF;sCA7kDS,mBAAmB;mCAKK,qBAAqB;qCAL7C,mBAAmB"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../lib/renderer.js"],"names":[],"mappings":"AA0CA;;;;;;;;;;;;;GAaG;AAEH;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AACH,+IAVG;IAAuC,GAAG,EAAlC,gBAAgB;IACY,aAAa,EAAzC,aAAa;IACQ,MAAM;IACJ,QAAQ;IACD,WAAW,EAAzC,eAAe;IACM,KAAK;IACR,OAAO,EAAzB,GAAG;IACoB,oBAAoB;CACnD,OAmkDF;sCAvlDS,mBAAmB;mCAKK,qBAAqB;qCAL7C,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../lib/utils/client/runtime.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;GAUG;AACH,gHAPG;IAAwB,IAAI,EAApB,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,aAAa;IACV,eAAe,GAAlC,MAAM,EAAE;IACS,aAAa,GAA9B,MAAM;CACd,GAAU,MAAM,CAoHlB"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../lib/utils/client/runtime.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;GAUG;AACH,gHAPG;IAAwB,IAAI,EAApB,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,aAAa;IACV,eAAe,GAAlC,MAAM,EAAE;IACS,aAAa,GAA9B,MAAM;CACd,GAAU,MAAM,CA4IlB"}
@@ -52,8 +52,9 @@ export function injectStyles(root: any, head: any, styles: any): void;
52
52
  * @param {CoraliteComponentRoot} root - The root of the AST.
53
53
  * @param {CoraliteElement | null} head - The head element.
54
54
  * @param {boolean} hasScripts - Whether the page has scripts to wait for.
55
+ * @param {'production' | 'development' | 'testing'} [mode] - Current build mode.
55
56
  */
56
- export function injectReadinessScript(root: CoraliteComponentRoot, head: CoraliteElement | null, hasScripts: boolean): void;
57
+ export function injectReadinessScript(root: CoraliteComponentRoot, head: CoraliteElement | null, hasScripts: boolean, mode?: "production" | "development" | "testing"): void;
57
58
  /**
58
59
  * Injects an import map into the document head (or root if head is missing).
59
60
  *
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../lib/utils/server/render.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH;;GAEG;AAEH;;;;;GAKG;AACH,sCAHW,qBAAqB,GACnB;IAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,eAAe,GAAG,qBAAqB,CAAA;CAAE,CA6B3F;AAED;;;;;;GAMG;AACH,2CAJW,qBAAqB,QACrB,eAAe,GAAG,IAAI,UACtB,MAAM,EAAE,QAwClB;AAED;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,+CALW,qBAAqB,QACrB,eAAe,GAAG,IAAI,cACtB,MAAM,EAAE,QACR,MAAM,QAyChB;AAED;;GAEG;AACH,sEA6BC;AAED;;;;;;GAMG;AACH,4CAJW,qBAAqB,QACrB,eAAe,GAAG,IAAI,cACtB,OAAO,QA4BjB;AAED;;;;;;GAMG;AACH,sCAJW,qBAAqB,QACrB,eAAe,GAAG,IAAI,wBA6BhC;AAED;;;;;GAKG;AACH,yCAHW,eAAe,EAAE,kBACjB,OAAO,QA6BjB;AAED;;;;;;GAMG;AACH,kDAJW,kBAAkB,SAClB,MAAM,GAAG,MAAM,EAAE,GACf,sBAAsB,EAAE,CA+BpC;2CAhUS,yBAAyB;qCAAzB,yBAAyB;oCAIA,qBAAqB;4CAJ9C,yBAAyB"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../lib/utils/server/render.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH;;GAEG;AAEH;;;;;GAKG;AACH,sCAHW,qBAAqB,GACnB;IAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,eAAe,GAAG,qBAAqB,CAAA;CAAE,CA6B3F;AAED;;;;;;GAMG;AACH,2CAJW,qBAAqB,QACrB,eAAe,GAAG,IAAI,UACtB,MAAM,EAAE,QAwClB;AAED;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,+CALW,qBAAqB,QACrB,eAAe,GAAG,IAAI,cACtB,MAAM,EAAE,QACR,MAAM,QAyChB;AAED;;GAEG;AACH,sEA6BC;AAED;;;;;;;GAOG;AACH,4CALW,qBAAqB,QACrB,eAAe,GAAG,IAAI,cACtB,OAAO,SACP,YAAY,GAAG,aAAa,GAAG,SAAS,QAgClD;AAED;;;;;;GAMG;AACH,sCAJW,qBAAqB,QACrB,eAAe,GAAG,IAAI,wBA6BhC;AAED;;;;;GAKG;AACH,yCAHW,eAAe,EAAE,kBACjB,OAAO,QA6BjB;AAED;;;;;;GAMG;AACH,kDAJW,kBAAkB,SAClB,MAAM,GAAG,MAAM,EAAE,GACf,sBAAsB,EAAE,CA+BpC;2CArUS,yBAAyB;qCAAzB,yBAAyB;oCAIA,qBAAqB;4CAJ9C,yBAAyB"}
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../plugins/testing.js"],"names":[],"mappings":"AA4BA,wEA8CE"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../plugins/testing.js"],"names":[],"mappings":"AAwEA,wEA8DE"}
@@ -176,9 +176,13 @@ export type CoraliteConfig = {
176
176
  */
177
177
  externalStyles?: string[];
178
178
  /**
179
- * - Build mode: "development" or "production"
179
+ * - Build mode: "production", "development", or "testing"
180
180
  */
181
- mode?: string;
181
+ mode?: "production" | "development" | "testing";
182
+ /**
183
+ * - Configuration for testing mode.
184
+ */
185
+ testing?: CoraliteTestingConfig;
182
186
  /**
183
187
  * - The root directory of the project.
184
188
  */
@@ -331,7 +335,21 @@ export type CoraliteSession = {
331
335
  /**
332
336
  * - Current build mode.
333
337
  */
334
- mode?: "production" | "development";
338
+ mode?: "production" | "development" | "testing";
339
+ };
340
+ export type CoraliteTestingConfig = {
341
+ /**
342
+ * - Mock definitions for components.
343
+ */
344
+ mocks?: {
345
+ [x: string]: CoraliteTestingMock;
346
+ };
347
+ };
348
+ export type CoraliteTestingMock = {
349
+ /**
350
+ * - Mock implementation of the component's server() block.
351
+ */
352
+ server?: Function;
335
353
  };
336
354
  /**
337
355
  * Configuration options for creating a component element.
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../types/core.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../types/core.js"],"names":[],"mappings":"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"}
@@ -122,6 +122,10 @@ export type CoralitePluginBeforeComponentRenderContext = {
122
122
  * - The current page context
123
123
  */
124
124
  page: CoralitePage;
125
+ /**
126
+ * - The component template AST
127
+ */
128
+ template?: CoraliteAnyNode;
125
129
  /**
126
130
  * - The parent AST tag itself
127
131
  */
@@ -591,9 +595,9 @@ import type { CoraliteRef } from './component.js';
591
595
  import type { CoraliteTextNodeToken } from './component.js';
592
596
  import type { CoraliteAttributeToken } from './component.js';
593
597
  import type { CoralitePage } from './core.js';
598
+ import type { CoraliteAnyNode } from './dom.js';
594
599
  import type { CoraliteSession } from './core.js';
595
600
  import type { CoraliteInstance } from './core.js';
596
- import type { CoraliteAnyNode } from './dom.js';
597
601
  import type { CoraliteModuleDefinitions } from './module.js';
598
602
  import type { CoraliteModule } from './module.js';
599
603
  import type { CoraliteComponentRoot } from './dom.js';
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../types/plugin.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../types/plugin.js"],"names":[],"mappings":"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"}
package/llms.txt CHANGED
@@ -80,9 +80,67 @@ A component definition consists of four primary blocks:
80
80
 
81
81
  #### 1. `attributes` (Sync)
82
82
 
83
- * **Purpose**: Coerces HTML attributes into JavaScript primitives.
84
- * **Rule**: Strictly limited to primitives (`String`, `Number`, `Boolean`). `Object` and `Array` types are strictly blocked to avoid JSON-in-HTML parsing errors.
85
- * **Reactivity**: Changes to HTML attributes (via `setAttribute`) automatically trigger updates to the unified `state`.
83
+ * **Purpose**: Declares and coerces HTML attributes into typed JavaScript primitives on the component's reactive `state`.
84
+ * **Rules & Constraints**:
85
+ - **Allowed Types**: Strictly limited to `String`, `Number`, and `Boolean`.
86
+ - **Blocked Types**: `Object` and `Array` constructors are strictly blocked. Attempting to use them throws a `CoraliteError` to prevent unsafe or complex JSON-in-HTML parsing. Use `server()` or global contexts for complex data.
87
+ - **Declaration Syntax**:
88
+ - *Shorthand*: `attributeName: TypeConstructor` (e.g., `isChecked: Boolean`).
89
+ - *Verbose (with default)*: `attributeName: { type: TypeConstructor, default: DefaultValue }`.
90
+ - **Attribute Naming**: Attributes are declared in camelCase (e.g., `isChecked`). The framework automatically maps them to/from their kebab-case HTML equivalents (e.g., `is-checked`).
91
+
92
+ * **Attribute Coercion Engine**:
93
+ Below are the exact coercion logic patterns utilized at compile-time (server-side) and run-time (client-side) to normalize raw HTML string attributes into JS values:
94
+
95
+ - **`Boolean` Coercion Pattern**:
96
+ - **How it Works**:
97
+ - **Client-Side Coercion**:
98
+ ```javascript
99
+ if (value === '') return true;
100
+ return value !== 'false' && value !== null;
101
+ ```
102
+ - **Server-Side Coercion**:
103
+ ```javascript
104
+ state[key] = value !== 'false' && value !== null && value !== '';
105
+ ```
106
+ - **Limitations & Hydration Mismatch Warning**:
107
+ - *The Empty Attribute SSR Mismatch*: An empty HTML attribute (e.g. `<my-component is-checked></my-component>` or just `<my-component is-checked>`) is parsed as `""` (empty string) in HTML. On the client, this empty string evaluates to `true` (standard browser behavior for attributes like `disabled` or `checked`). However, on the server, it evaluates to `false` (due to the `value !== ''` check).
108
+ - *Solution*: To ensure consistent behavior between Server-Side Rendering (SSR) and Client-Side Hydration, developers should explicitly pass the string value `"true"` (e.g., `<my-component is-checked="true">`) instead of using shorthand empty attributes, or rely on a declared `default` value in the attribute schema.
109
+
110
+ - **`Number` Coercion Pattern**:
111
+ - **Logic**: Evaluates `Number(value)`.
112
+ - **Result**: Valid numeric strings become numbers. Non-numeric strings resolve to `NaN`.
113
+
114
+ - **`String` Coercion Pattern**:
115
+ - **Logic**: Evaluates `String(value)`.
116
+ - **Result**: Converts any non-null input value to a string.
117
+
118
+ - **Coercion Matrix for LLMs**:
119
+ Refer to this matrix to determine the final coerced type and value:
120
+ | Input HTML Attribute Value | Declared `Boolean` | Declared `Number` | Declared `String` |
121
+ | :--- | :--- | :--- | :--- |
122
+ | **`"true"`** | `true` | `NaN` | `"true"` |
123
+ | **`"false"`** | `false` | `NaN` | `"false"` |
124
+ | **`"42"`** | `true` | `42` | `"42"` |
125
+ | **`"0"`** | `true` | `0` | `"0"` |
126
+ | **`""` (empty attribute)** | `true` (client) / `false` (server) | `0` | `""` |
127
+ | **`null` / Absent** | `false` (or `default` value) | `null` (or `default` value) | `null` (or `default` value) |
128
+ | **`"hello"`** | `true` | `NaN` | `"hello"` |
129
+
130
+ * **Reactivity & Synchronization**:
131
+ - Changing an attribute in the DOM (e.g., `element.setAttribute('is-checked', 'true')`) automatically triggers the `attributeChangedCallback`, recoerces the value, and updates the unified `state.isChecked`.
132
+ - Mutating the property directly in `state` (inside the `client` block) updates the internal reactivity tree, but does *not* automatically reflect back to the physical DOM attribute unless manually synchronized (avoiding costly DOM reflection loops).
133
+
134
+ * **Native HTML Boolean Attributes Toggling (`BOOLEAN_ATTRIBUTES`)**:
135
+ - **Overview**: When reactive tokens are bound to attributes inside component templates (e.g., `<button disabled="{{ isDisabled }}">`), Coralite applies specialized toggling logic if the target attribute name is in the reserved native HTML boolean attributes list.
136
+ - **The Reserved List**: Includes standard HTML boolean attributes: `allowfullscreen`, `async`, `autofocus`, `autoplay`, `checked`, `controls`, `default`, `defer`, `disabled`, `formnovalidate`, `hidden`, `inert`, `ismap`, `itemscope`, `loop`, `multiple`, `muted`, `nomodule`, `novalidate`, `open`, `playsinline`, `readonly`, `required`, `reversed`, `selected`, and `truespeed`.
137
+ - **How it Works**:
138
+ - If the bound value resolves to any falsy value (specifically `""`, `"false"`, `"null"`, `"0"`, or `"undefined"`), the attribute is **completely removed** from the target element (via `element.removeAttribute(name)`). This matches native HTML behavior, where the mere presence of a boolean attribute (even if written as `disabled="false"`) evaluates to true in the browser.
139
+ - If the bound value is truthy, the attribute is set as an empty string presence attribute (via `element.setAttribute(name, '')`).
140
+ - **Limitations**:
141
+ - This automatic add/remove toggling logic *only* applies to attributes on the reserved native HTML list.
142
+ - Custom boolean attributes (e.g., `<div is-active="{{ isActive }}">`) or other attributes not on the reserved list are not removed; instead, their values are written directly as string attributes (e.g., `is-active="false"`).
143
+
86
144
 
87
145
  #### 2. `server({ state, page, root, module, id, session, app, noHydration, ...plugins })` (Async/Server)
88
146
 
@@ -279,7 +337,8 @@ These strings must be non-empty.
279
337
  * `baseURL` (string): Base URL for asset paths (defaults to `/`).
280
338
  * `assets` (array): Static assets to copy during the build.
281
339
  * `externalStyles` (array of strings): Global stylesheets to inject into every page.
282
- * `mode` (string): Build mode, either `'production'` or `'development'`.
340
+ * `mode` (string): Build mode: `'production'`, `'development'`, or `'testing'`.
341
+ * `testing` (object): Optional configuration for `'testing'` mode (e.g., `{ mocks: { 'comp-id': { server: ... } } }`).
283
342
  * `projectRoot` (string): The root directory of the project.
284
343
  * `ignoreByAttribute` (array): Attributes to ignore during parse.
285
344
  * `skipRenderByAttribute` (array): Attributes to skip rendering.
@@ -332,12 +391,22 @@ export default defineConfig({
332
391
 
333
392
  * **Metadata Plugin**: Extracts SEO data during the build phase.
334
393
  * **Static Asset Plugin**: Copies static assets to the build output folder.
335
- * **Testing Plugin**: Automates E2E testing preparation by duplicating all `ref` attributes to `data-testid` deterministically on both server and client.
394
+ * **Testing Plugin**: Automatically activated in `testing` mode. It provides deterministic `data-testid` injection, disables animations, and enables deep framework telemetry.
336
395
 
337
396
  ## 10. E2E Testing
338
397
 
339
- * **Readiness**: Await `window.__coralite__.lifecycle.hydrated` after navigation. Use `window.__coralite__.lifecycle.rendered` for visual-only readiness, or `window.__coralite__.lifecycle.waitFor(el)` for dynamic elements.
340
- * **Selectors**: Rely on `data-testid` generated by the **Testing Plugin** (e.g., `[data-testid="my-component-0__submit-btn"]`) for robust selectors.
398
+ For a robust E2E environment, users are encouraged to use `mode: 'testing'` exclusively.
399
+
400
+ * **Static Build Target**: `testing` mode acts as a static build target, identical to `production` mode. It compiles optimized static assets and strips development-only metadata, but leaves test-related tooling intact.
401
+ * **Incremental Build Cache Invalidation**: The build compiler computes a hash of the `testing.mocks` configuration. If your mock definitions change, it invalidates the incremental build cache (ISR) and triggers a rebuild for all affected pages.
402
+ * **Targeting Selectors**: Target elements using the auto-injected `data-testid` attributes. To target specific components or elements without hardcoding the dynamic instance index, use CSS suffix selectors (e.g. `[data-testid$="__btn"]`).
403
+ * **Readiness**: Await `window.__coralite__.lifecycle.hydrated` after navigation.
404
+ * **Deterministic Selectors**: In `testing` mode, Coralite automatically injects `data-testid` onto all interactive elements (`button`, `a`, `input`, etc.) and custom elements using the pattern `[instanceId]__[tagName]-[index]`. Template `ref` attributes are also mapped to `data-testid`.
405
+ * **Velocity Engine**: Animations, transitions, and smooth scrolling are globally disabled in `testing` mode to eliminate race conditions and speed up tests.
406
+ * **Glass Box Assertions**: The reactive state of every hydrated component is exposed via `window.__coralite__.components['instance-id'].state`.
407
+ * **Event Telemetry**: All `CustomEvent` dispatches are logged to `window.__coralite__.events`.
408
+ * **Fail-Fast Hydration**: Any hydration mismatch or client-side error immediately triggers a fatal red overlay, failing the test instantly.
409
+ * **Server Mocking**: Override component `server()` blocks via the `testing.mocks` configuration in `coralite.config.js`.
341
410
 
342
411
  ## 11. Form Integration and Interaction Patterns
343
412
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coralite",
3
- "version": "0.40.2",
3
+ "version": "0.41.0",
4
4
  "description": "HTML modules static site generator",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -95,18 +95,20 @@
95
95
  "test:unit": "node --experimental-vm-modules --experimental-import-meta-resolve --test \"./tests/unit/**/*.spec.js\"",
96
96
  "test:unit:watch": "node --experimental-vm-modules --experimental-import-meta-resolve --test --watch \"./tests/unit/**/*.spec.js\"",
97
97
  "test:unit:coverage": "node --experimental-vm-modules --experimental-import-meta-resolve --experimental-test-coverage --test \"./tests/unit/**/*.spec.js\"",
98
- "test:e2e": "pnpm build && pnpm clean:e2e && pnpm build:html:dev && pnpm build:html:prod && playwright test",
98
+ "test:e2e": "pnpm build && pnpm clean:e2e && pnpm build:html:dev && pnpm build:html:prod && pnpm build:html:testing && playwright test",
99
99
  "test:e2e:report": "playwright show-report",
100
100
  "test:e2e:ui": "playwright test --ui",
101
- "clean:e2e": "premove .coralite-dev && premove .coralite-prod",
101
+ "clean:e2e": "premove .coralite-dev && premove .coralite-prod && premove .coralite-testing",
102
102
  "server": "pnpm run server:dev",
103
103
  "server:dev": "node ./tests/scripts/serve.js --dir .coralite-dev --port 3000",
104
104
  "server:prod": "node ./tests/scripts/serve.js --dir .coralite-prod --port 3001",
105
+ "server:testing": "node ./tests/scripts/serve.js --dir .coralite-testing --port 3002",
105
106
  "build": "premove dist && pnpm build:lib && pnpm build:types",
106
107
  "build:lib": "esbuild ./lib/index.js ./lib/coralite-element.js ./lib/plugin.js ./lib/utils/core.js ./lib/utils/index.js ./lib/utils/client/inject.js --bundle --target=esnext --format=esm --outdir=dist/lib --platform=node --sourcemap --packages=external --alias:#lib=./lib/index.js --alias:#plugins=./plugins/index.js --outbase=./lib",
107
108
  "build:types": "tsc",
108
109
  "build:html:dev": "node --experimental-vm-modules ./tests/scripts/build-html.js --mode development --outDir .coralite-dev",
109
110
  "build:html:prod": "node --experimental-vm-modules ./tests/scripts/build-html.js --mode production --outDir .coralite-prod",
111
+ "build:html:testing": "node --experimental-vm-modules ./tests/scripts/build-testing.js",
110
112
  "bench": "node --experimental-vm-modules ./tests/scripts/run-benchmarks.js"
111
113
  }
112
114
  }