@coherent.js/core 1.0.0-beta.6 → 1.0.0-beta.7

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.
Files changed (108) hide show
  1. package/dist/coherent.d.ts +150 -10
  2. package/dist/coherent.d.ts.map +1 -1
  3. package/dist/coherent.js +166 -33
  4. package/dist/coherent.js.map +1 -1
  5. package/dist/components/component-system.js +109 -109
  6. package/dist/components/lifecycle.d.ts +212 -0
  7. package/dist/components/lifecycle.d.ts.map +1 -0
  8. package/dist/components/lifecycle.js +525 -0
  9. package/dist/components/lifecycle.js.map +1 -0
  10. package/dist/core/html-utils.js +5 -5
  11. package/dist/core/object-factory.js +21 -21
  12. package/dist/core/object-utils.js +2 -2
  13. package/dist/dev/dev-tools.d.ts +1 -1
  14. package/dist/dev/dev-tools.js +28 -28
  15. package/dist/forms/validation.d.ts +271 -0
  16. package/dist/forms/validation.d.ts.map +1 -0
  17. package/dist/forms/validation.js +573 -0
  18. package/dist/forms/validation.js.map +1 -0
  19. package/dist/index.cjs +157 -4
  20. package/dist/index.cjs.map +4 -4
  21. package/dist/index.js +153 -4
  22. package/dist/index.js.map +4 -4
  23. package/dist/performance/bundle-optimizer.js +11 -11
  24. package/dist/performance/cache-manager.js +6 -6
  25. package/dist/performance/component-cache.d.ts +120 -0
  26. package/dist/performance/component-cache.d.ts.map +1 -0
  27. package/dist/performance/component-cache.js +364 -0
  28. package/dist/performance/component-cache.js.map +1 -0
  29. package/dist/performance/monitor.js +10 -10
  30. package/dist/performance/monitor.js.map +1 -1
  31. package/dist/rendering/base-renderer.js +13 -13
  32. package/dist/rendering/css-manager.d.ts +73 -0
  33. package/dist/rendering/css-manager.d.ts.map +1 -0
  34. package/dist/rendering/css-manager.js +176 -0
  35. package/dist/rendering/css-manager.js.map +1 -0
  36. package/dist/rendering/dom-renderer.d.ts +23 -0
  37. package/dist/rendering/dom-renderer.d.ts.map +1 -1
  38. package/dist/rendering/dom-renderer.js +77 -9
  39. package/dist/rendering/dom-renderer.js.map +1 -1
  40. package/dist/rendering/html-renderer.d.ts +15 -0
  41. package/dist/rendering/html-renderer.d.ts.map +1 -1
  42. package/dist/rendering/html-renderer.js +85 -4
  43. package/dist/rendering/html-renderer.js.map +1 -1
  44. package/dist/rendering/streaming-renderer.js +12 -12
  45. package/dist/rendering/vdom-diff.d.ts +47 -0
  46. package/dist/rendering/vdom-diff.d.ts.map +1 -0
  47. package/dist/rendering/vdom-diff.js +416 -0
  48. package/dist/rendering/vdom-diff.js.map +1 -0
  49. package/dist/routing/router.d.ts +241 -0
  50. package/dist/routing/router.d.ts.map +1 -0
  51. package/dist/routing/router.js +648 -0
  52. package/dist/routing/router.js.map +1 -0
  53. package/dist/state/reactive-state.d.ts +166 -0
  54. package/dist/state/reactive-state.d.ts.map +1 -0
  55. package/dist/state/reactive-state.js +546 -0
  56. package/dist/state/reactive-state.js.map +1 -0
  57. package/dist/utils/dependency-utils.js +2 -2
  58. package/dist/utils/error-handler.d.ts +148 -0
  59. package/dist/utils/error-handler.d.ts.map +1 -0
  60. package/dist/utils/error-handler.js +468 -0
  61. package/dist/utils/error-handler.js.map +1 -0
  62. package/dist/utils/normalization.js +1 -1
  63. package/dist/utils/validation.js +1 -1
  64. package/package.json +5 -1
  65. package/dist/database/adapters/mongodb.d.ts +0 -15
  66. package/dist/database/adapters/mongodb.d.ts.map +0 -1
  67. package/dist/database/adapters/mongodb.js +0 -216
  68. package/dist/database/adapters/mongodb.js.map +0 -1
  69. package/dist/database/adapters/mysql.d.ts +0 -12
  70. package/dist/database/adapters/mysql.d.ts.map +0 -1
  71. package/dist/database/adapters/mysql.js +0 -171
  72. package/dist/database/adapters/mysql.js.map +0 -1
  73. package/dist/database/adapters/postgresql.d.ts +0 -12
  74. package/dist/database/adapters/postgresql.d.ts.map +0 -1
  75. package/dist/database/adapters/postgresql.js +0 -177
  76. package/dist/database/adapters/postgresql.js.map +0 -1
  77. package/dist/database/adapters/sqlite.d.ts +0 -15
  78. package/dist/database/adapters/sqlite.d.ts.map +0 -1
  79. package/dist/database/adapters/sqlite.js +0 -241
  80. package/dist/database/adapters/sqlite.js.map +0 -1
  81. package/dist/database/connection-manager.d.ts +0 -135
  82. package/dist/database/connection-manager.d.ts.map +0 -1
  83. package/dist/database/connection-manager.js +0 -362
  84. package/dist/database/connection-manager.js.map +0 -1
  85. package/dist/database/index.d.ts +0 -38
  86. package/dist/database/index.d.ts.map +0 -1
  87. package/dist/database/index.js +0 -60
  88. package/dist/database/index.js.map +0 -1
  89. package/dist/database/middleware.d.ts +0 -122
  90. package/dist/database/middleware.d.ts.map +0 -1
  91. package/dist/database/middleware.js +0 -390
  92. package/dist/database/middleware.js.map +0 -1
  93. package/dist/database/migration.d.ts +0 -62
  94. package/dist/database/migration.d.ts.map +0 -1
  95. package/dist/database/migration.js +0 -423
  96. package/dist/database/migration.js.map +0 -1
  97. package/dist/database/model.d.ts +0 -8
  98. package/dist/database/model.d.ts.map +0 -1
  99. package/dist/database/model.js +0 -167
  100. package/dist/database/model.js.map +0 -1
  101. package/dist/database/query-builder.d.ts +0 -111
  102. package/dist/database/query-builder.d.ts.map +0 -1
  103. package/dist/database/query-builder.js +0 -187
  104. package/dist/database/query-builder.js.map +0 -1
  105. package/dist/database/utils.d.ts +0 -196
  106. package/dist/database/utils.d.ts.map +0 -1
  107. package/dist/database/utils.js +0 -372
  108. package/dist/database/utils.js.map +0 -1
package/dist/index.js CHANGED
@@ -1193,7 +1193,13 @@ function formatAttributes(props) {
1193
1193
  }
1194
1194
  }
1195
1195
  }
1196
- if (value === true) {
1196
+ if (attributeName === "style" && typeof value === "object" && value !== null) {
1197
+ const cssString = Object.entries(value).map(([prop, val]) => {
1198
+ const kebabProp = prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
1199
+ return `${kebabProp}: ${val}`;
1200
+ }).join("; ");
1201
+ formatted += ` ${attributeName}="${escapeHtml(cssString)}"`;
1202
+ } else if (value === true) {
1197
1203
  formatted += ` ${attributeName}`;
1198
1204
  } else if (value !== false && value !== null && value !== void 0) {
1199
1205
  formatted += ` ${attributeName}="${escapeHtml(String(value))}"`;
@@ -1414,6 +1420,9 @@ function createCacheManager(options = {}) {
1414
1420
  }
1415
1421
  clear();
1416
1422
  }
1423
+ function hashObject(obj) {
1424
+ return simpleHash(JSON.stringify(obj));
1425
+ }
1417
1426
  return {
1418
1427
  get,
1419
1428
  set,
@@ -1423,6 +1432,7 @@ function createCacheManager(options = {}) {
1423
1432
  cleanup,
1424
1433
  destroy,
1425
1434
  generateCacheKey,
1435
+ hashObject,
1426
1436
  get memoryUsage() {
1427
1437
  return memoryUsage;
1428
1438
  },
@@ -6137,6 +6147,97 @@ var eventSystem2 = {
6137
6147
  };
6138
6148
  var events_default = eventSystem2;
6139
6149
 
6150
+ // src/components/enhanced-composition.js
6151
+ var hoc = {
6152
+ /**
6153
+ * Wrap component with additional props
6154
+ */
6155
+ withProps(additionalProps) {
6156
+ return (Component2) => (props) => {
6157
+ return Component2({ ...props, ...additionalProps });
6158
+ };
6159
+ },
6160
+ /**
6161
+ * Conditional rendering HOC
6162
+ */
6163
+ withCondition(condition) {
6164
+ return (Component2) => (props) => {
6165
+ return condition(props) ? Component2(props) : null;
6166
+ };
6167
+ },
6168
+ /**
6169
+ * Loading state HOC
6170
+ */
6171
+ withLoading(loadingComponent) {
6172
+ return (Component2) => (props) => {
6173
+ return props.loading ? loadingComponent(props) : Component2(props);
6174
+ };
6175
+ },
6176
+ /**
6177
+ * Error boundary HOC
6178
+ */
6179
+ withError(errorComponent) {
6180
+ return (Component2) => (props) => {
6181
+ try {
6182
+ return Component2(props);
6183
+ } catch (error) {
6184
+ return errorComponent({ error, ...props });
6185
+ }
6186
+ };
6187
+ },
6188
+ /**
6189
+ * Memoization HOC
6190
+ */
6191
+ withMemo(getMemoKey) {
6192
+ const cache = /* @__PURE__ */ new Map();
6193
+ return (Component2) => (props) => {
6194
+ const key = getMemoKey ? getMemoKey(props) : JSON.stringify(props);
6195
+ if (cache.has(key)) {
6196
+ return cache.get(key);
6197
+ }
6198
+ const result = Component2(props);
6199
+ cache.set(key, result);
6200
+ return result;
6201
+ };
6202
+ }
6203
+ };
6204
+ var compose = {
6205
+ /**
6206
+ * Combine multiple components into one
6207
+ */
6208
+ combine(...components) {
6209
+ return (props) => ({
6210
+ fragment: {
6211
+ children: components.map((Component2) => Component2(props))
6212
+ }
6213
+ });
6214
+ },
6215
+ /**
6216
+ * Pipe components through transformations
6217
+ */
6218
+ pipe(...transformers) {
6219
+ return (Component2) => {
6220
+ return transformers.reduce((acc, transformer) => transformer(acc), Component2);
6221
+ };
6222
+ },
6223
+ /**
6224
+ * Branch based on conditions
6225
+ */
6226
+ branch(condition, leftComponent, rightComponent) {
6227
+ return (props) => {
6228
+ return condition(props) ? leftComponent(props) : rightComponent(props);
6229
+ };
6230
+ },
6231
+ /**
6232
+ * Render component or fallback
6233
+ */
6234
+ maybe(Component2, fallback = null) {
6235
+ return (props) => {
6236
+ return Component2 ? Component2(props) : fallback;
6237
+ };
6238
+ }
6239
+ };
6240
+
6140
6241
  // src/index.js
6141
6242
  var scopeCounter = { value: 0 };
6142
6243
  function generateScopeId() {
@@ -6191,10 +6292,46 @@ function dangerouslySetInnerContent(content) {
6191
6292
  __trusted: true
6192
6293
  };
6193
6294
  }
6295
+ function injectHydrationAttributes(component, options) {
6296
+ if (!component || typeof component !== "object" || Array.isArray(component)) {
6297
+ return component;
6298
+ }
6299
+ const tagName = Object.keys(component)[0];
6300
+ if (!tagName) return component;
6301
+ const props = component[tagName];
6302
+ if (typeof props !== "object" || props === null) return component;
6303
+ const injected = { ...props };
6304
+ if (options.hydratable) {
6305
+ injected["data-hydratable"] = "true";
6306
+ }
6307
+ if (options.island) {
6308
+ injected["data-coherent-island"] = "true";
6309
+ }
6310
+ if (options._islandComponentName) {
6311
+ injected["data-coherent-island-component"] = options._islandComponentName;
6312
+ }
6313
+ return { [tagName]: injected };
6314
+ }
6315
+ function Island(componentFn) {
6316
+ const componentName = componentFn.name || "Anonymous";
6317
+ return function IslandComponent(props) {
6318
+ const result = componentFn(props);
6319
+ return injectHydrationAttributes(result, {
6320
+ island: true,
6321
+ _islandComponentName: componentName
6322
+ });
6323
+ };
6324
+ }
6194
6325
  function render2(obj, options = {}) {
6195
6326
  const scoped = options.scoped ?? options.encapsulate ?? false;
6196
- const { scoped: _scoped, encapsulate: _encapsulate, ...rendererOptions } = options;
6197
- const component = scoped ? renderScopedComponent(obj) : obj;
6327
+ const { scoped: _scoped, encapsulate: _encapsulate, hydratable: _hydratable, island: _island, ...rendererOptions } = options;
6328
+ let component = scoped ? renderScopedComponent(obj) : obj;
6329
+ if (typeof component === "function") {
6330
+ component = component(options);
6331
+ }
6332
+ if (_hydratable || _island) {
6333
+ component = injectHydrationAttributes(component, { hydratable: _hydratable, island: _island });
6334
+ }
6198
6335
  return render(component, rendererOptions);
6199
6336
  }
6200
6337
  function renderScopedComponent(component) {
@@ -6268,6 +6405,14 @@ var _corePackageJson = JSON.parse(
6268
6405
  readFileSync(new URL("../package.json", import.meta.url), "utf-8")
6269
6406
  );
6270
6407
  var VERSION = _corePackageJson.version;
6408
+ var fp = {
6409
+ /**
6410
+ * Curried map: fp.map(fn)(array)
6411
+ */
6412
+ map(fn) {
6413
+ return (array) => array.map(fn);
6414
+ }
6415
+ };
6271
6416
  var coherent = {
6272
6417
  // Core rendering
6273
6418
  render: render2,
@@ -6337,9 +6482,11 @@ export {
6337
6482
  FORBIDDEN_CHILDREN,
6338
6483
  GlobalErrorHandler,
6339
6484
  HTMLNestingError,
6485
+ Island,
6340
6486
  LIFECYCLE_PHASES,
6341
6487
  VERSION,
6342
6488
  checkPeerDependencies,
6489
+ compose,
6343
6490
  createActionHandlers,
6344
6491
  createAsyncErrorBoundary,
6345
6492
  createComponent,
@@ -6364,6 +6511,7 @@ export {
6364
6511
  emitSync,
6365
6512
  evaluateLazy,
6366
6513
  events_default as eventSystem,
6514
+ fp,
6367
6515
  getComponent,
6368
6516
  getRegisteredComponents,
6369
6517
  globalDOMIntegration,
@@ -6371,6 +6519,7 @@ export {
6371
6519
  h,
6372
6520
  handleAction,
6373
6521
  hasChildren,
6522
+ hoc,
6374
6523
  importPeerDependency,
6375
6524
  initializeDOMIntegration,
6376
6525
  isCoherentComponent,
@@ -6413,7 +6562,7 @@ export {
6413
6562
  * Coherent.js - Object-Based Rendering Framework
6414
6563
  * A pure JavaScript framework for server-side rendering using natural object syntax
6415
6564
  *
6416
- * @version 1.0.0-beta.6
6565
+ * @version 1.0.0-beta.7
6417
6566
  * @author Coherent Framework Team
6418
6567
  * @license MIT
6419
6568
  */