@odoo/owl 2.8.1 → 2.8.3

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.
Binary file
package/dist/owl.cjs.js CHANGED
@@ -88,10 +88,16 @@ function toggler(key, child) {
88
88
  class OwlError extends Error {
89
89
  }
90
90
 
91
- const { setAttribute: elemSetAttribute, removeAttribute } = Element.prototype;
92
- const tokenList = DOMTokenList.prototype;
93
- const tokenListAdd = tokenList.add;
94
- const tokenListRemove = tokenList.remove;
91
+ let elemSetAttribute;
92
+ let removeAttribute;
93
+ let tokenListAdd;
94
+ let tokenListRemove;
95
+ if (typeof Element !== "undefined") {
96
+ ({ setAttribute: elemSetAttribute, removeAttribute } = Element.prototype);
97
+ const tokenList = DOMTokenList.prototype;
98
+ tokenListAdd = tokenList.add;
99
+ tokenListRemove = tokenList.remove;
100
+ }
95
101
  const isArray = Array.isArray;
96
102
  const { split, trim } = String.prototype;
97
103
  const wordRegexp = /\s+/;
@@ -470,10 +476,15 @@ function setupSyntheticEvent(evName, eventKey, capture = false) {
470
476
  }
471
477
 
472
478
  const getDescriptor$3 = (o, p) => Object.getOwnPropertyDescriptor(o, p);
473
- const nodeProto$4 = Node.prototype;
474
- const nodeInsertBefore$3 = nodeProto$4.insertBefore;
475
- const nodeSetTextContent$1 = getDescriptor$3(nodeProto$4, "textContent").set;
476
- const nodeRemoveChild$3 = nodeProto$4.removeChild;
479
+ let nodeInsertBefore$3;
480
+ let nodeSetTextContent$1;
481
+ let nodeRemoveChild$3;
482
+ if (typeof Node !== "undefined") {
483
+ const nodeProto = Node.prototype;
484
+ nodeInsertBefore$3 = nodeProto.insertBefore;
485
+ nodeSetTextContent$1 = getDescriptor$3(nodeProto, "textContent").set;
486
+ nodeRemoveChild$3 = nodeProto.removeChild;
487
+ }
477
488
  // -----------------------------------------------------------------------------
478
489
  // Multi NODE
479
490
  // -----------------------------------------------------------------------------
@@ -609,11 +620,15 @@ function multi(children) {
609
620
  }
610
621
 
611
622
  const getDescriptor$2 = (o, p) => Object.getOwnPropertyDescriptor(o, p);
612
- const nodeProto$3 = Node.prototype;
613
- const characterDataProto$1 = CharacterData.prototype;
614
- const nodeInsertBefore$2 = nodeProto$3.insertBefore;
615
- const characterDataSetData$1 = getDescriptor$2(characterDataProto$1, "data").set;
616
- const nodeRemoveChild$2 = nodeProto$3.removeChild;
623
+ let nodeInsertBefore$2;
624
+ let characterDataSetData$1;
625
+ let nodeRemoveChild$2;
626
+ if (typeof Node !== "undefined") {
627
+ const nodeProto = Node.prototype;
628
+ nodeInsertBefore$2 = nodeProto.insertBefore;
629
+ nodeRemoveChild$2 = nodeProto.removeChild;
630
+ characterDataSetData$1 = getDescriptor$2(CharacterData.prototype, "data").set;
631
+ }
617
632
  class VSimpleNode {
618
633
  constructor(text) {
619
634
  this.text = text;
@@ -679,13 +694,19 @@ function toText(value) {
679
694
  }
680
695
 
681
696
  const getDescriptor$1 = (o, p) => Object.getOwnPropertyDescriptor(o, p);
682
- const nodeProto$2 = Node.prototype;
683
- const elementProto = Element.prototype;
684
- const characterDataProto = CharacterData.prototype;
685
- const characterDataSetData = getDescriptor$1(characterDataProto, "data").set;
686
- const nodeGetFirstChild = getDescriptor$1(nodeProto$2, "firstChild").get;
687
- const nodeGetNextSibling = getDescriptor$1(nodeProto$2, "nextSibling").get;
688
- const NO_OP = () => { };
697
+ let nodeProto;
698
+ let elementProto;
699
+ let characterDataSetData;
700
+ let nodeGetFirstChild;
701
+ let nodeGetNextSibling;
702
+ if (typeof Node !== "undefined") {
703
+ nodeProto = Node.prototype;
704
+ elementProto = Element.prototype;
705
+ characterDataSetData = getDescriptor$1(CharacterData.prototype, "data").set;
706
+ nodeGetFirstChild = getDescriptor$1(nodeProto, "firstChild").get;
707
+ nodeGetNextSibling = getDescriptor$1(nodeProto, "nextSibling").get;
708
+ }
709
+ const NO_OP$1 = () => { };
689
710
  function makePropSetter(name) {
690
711
  return function setProp(value) {
691
712
  // support 0, fallback to empty string for other falsy values
@@ -1015,7 +1036,7 @@ function updateCtx(ctx, tree) {
1015
1036
  idx: info.idx,
1016
1037
  refIdx: info.refIdx,
1017
1038
  setData: makeRefSetter(index, ctx.refList),
1018
- updateData: NO_OP,
1039
+ updateData: NO_OP$1,
1019
1040
  });
1020
1041
  }
1021
1042
  }
@@ -1073,8 +1094,8 @@ function createBlockClass(template, ctx) {
1073
1094
  const isDynamic = refN > 0;
1074
1095
  // these values are defined here to make them faster to lookup in the class
1075
1096
  // block scope
1076
- const nodeCloneNode = nodeProto$2.cloneNode;
1077
- const nodeInsertBefore = nodeProto$2.insertBefore;
1097
+ const nodeCloneNode = nodeProto.cloneNode;
1098
+ const nodeInsertBefore = nodeProto.insertBefore;
1078
1099
  const elementRemove = elementProto.remove;
1079
1100
  class Block {
1080
1101
  constructor(data) {
@@ -1203,11 +1224,17 @@ function makeRefSetter(index, refs) {
1203
1224
  }
1204
1225
 
1205
1226
  const getDescriptor = (o, p) => Object.getOwnPropertyDescriptor(o, p);
1206
- const nodeProto$1 = Node.prototype;
1207
- const nodeInsertBefore$1 = nodeProto$1.insertBefore;
1208
- const nodeAppendChild = nodeProto$1.appendChild;
1209
- const nodeRemoveChild$1 = nodeProto$1.removeChild;
1210
- const nodeSetTextContent = getDescriptor(nodeProto$1, "textContent").set;
1227
+ let nodeInsertBefore$1;
1228
+ let nodeAppendChild;
1229
+ let nodeRemoveChild$1;
1230
+ let nodeSetTextContent;
1231
+ if (typeof Node !== "undefined") {
1232
+ const nodeProto = Node.prototype;
1233
+ nodeInsertBefore$1 = nodeProto.insertBefore;
1234
+ nodeAppendChild = nodeProto.appendChild;
1235
+ nodeRemoveChild$1 = nodeProto.removeChild;
1236
+ nodeSetTextContent = getDescriptor(nodeProto, "textContent").set;
1237
+ }
1211
1238
  // -----------------------------------------------------------------------------
1212
1239
  // List Node
1213
1240
  // -----------------------------------------------------------------------------
@@ -1419,9 +1446,13 @@ function createMapping(ch1, startIdx1, endIdx2) {
1419
1446
  return mapping;
1420
1447
  }
1421
1448
 
1422
- const nodeProto = Node.prototype;
1423
- const nodeInsertBefore = nodeProto.insertBefore;
1424
- const nodeRemoveChild = nodeProto.removeChild;
1449
+ let nodeInsertBefore;
1450
+ let nodeRemoveChild;
1451
+ if (typeof Node !== "undefined") {
1452
+ const nodeProto = Node.prototype;
1453
+ nodeInsertBefore = nodeProto.insertBefore;
1454
+ nodeRemoveChild = nodeProto.removeChild;
1455
+ }
1425
1456
  class VHtml {
1426
1457
  constructor(html) {
1427
1458
  this.content = [];
@@ -1641,6 +1672,7 @@ function handleError(params) {
1641
1672
  let current = fiber;
1642
1673
  do {
1643
1674
  current.node.fiber = current;
1675
+ fibersInError.set(current, error);
1644
1676
  current = current.parent;
1645
1677
  } while (current);
1646
1678
  fibersInError.set(fiber.root, error);
@@ -2387,13 +2419,19 @@ function useState(state) {
2387
2419
  const node = getCurrent();
2388
2420
  let render = batchedRenderFunctions.get(node);
2389
2421
  if (!render) {
2390
- render = batched(node.render.bind(node, false));
2422
+ const wrapper = { fn: batched(node.render.bind(node, false)) };
2423
+ render = (...args) => wrapper.fn(...args);
2391
2424
  batchedRenderFunctions.set(node, render);
2392
2425
  // manual implementation of onWillDestroy to break cyclic dependency
2393
- node.willDestroy.push(clearReactivesForCallback.bind(null, render));
2426
+ node.willDestroy.push(cleanupRenderAndReactives.bind(null, wrapper, render));
2394
2427
  }
2395
2428
  return reactive(state, render);
2396
2429
  }
2430
+ const NO_OP = () => { };
2431
+ function cleanupRenderAndReactives(wrapper, render) {
2432
+ wrapper.fn = NO_OP;
2433
+ clearReactivesForCallback(render);
2434
+ }
2397
2435
  class ComponentNode {
2398
2436
  constructor(C, props, app, parent, parentKey) {
2399
2437
  this.fiber = null;
@@ -3698,7 +3736,10 @@ function interpolate(s) {
3698
3736
  const whitespaceRE = /\s+/g;
3699
3737
  // using a non-html document so that <inner/outer>HTML serializes as XML instead
3700
3738
  // of HTML (as we will parse it as xml later)
3701
- const xmlDoc = document.implementation.createDocument(null, null, null);
3739
+ let xmlDoc;
3740
+ if (typeof document !== "undefined") {
3741
+ xmlDoc = document.implementation.createDocument(null, null, null);
3742
+ }
3702
3743
  const MODS = new Set(["stop", "capture", "prevent", "self", "synthetic"]);
3703
3744
  let nextDataIds = {};
3704
3745
  function generateId(prefix = "") {
@@ -5817,11 +5858,15 @@ function compile(template, options = {
5817
5858
  }
5818
5859
 
5819
5860
  // do not modify manually. This file is generated by the release script.
5820
- const version = "2.8.1";
5861
+ const version = "2.8.3";
5821
5862
 
5822
5863
  // -----------------------------------------------------------------------------
5823
5864
  // Scheduler
5824
5865
  // -----------------------------------------------------------------------------
5866
+ let requestAnimationFrame;
5867
+ if (typeof window !== "undefined") {
5868
+ requestAnimationFrame = window.requestAnimationFrame.bind(window);
5869
+ }
5825
5870
  class Scheduler {
5826
5871
  constructor() {
5827
5872
  this.tasks = new Set();
@@ -5909,11 +5954,13 @@ class Scheduler {
5909
5954
  }
5910
5955
  // capture the value of requestAnimationFrame as soon as possible, to avoid
5911
5956
  // interactions with other code, such as test frameworks that override them
5912
- Scheduler.requestAnimationFrame = window.requestAnimationFrame.bind(window);
5957
+ Scheduler.requestAnimationFrame = requestAnimationFrame;
5913
5958
 
5914
5959
  let hasBeenLogged = false;
5915
5960
  const apps = new Set();
5916
- window.__OWL_DEVTOOLS__ || (window.__OWL_DEVTOOLS__ = { apps, Fiber, RootFiber, toRaw, reactive });
5961
+ if (typeof window !== "undefined") {
5962
+ window.__OWL_DEVTOOLS__ || (window.__OWL_DEVTOOLS__ = { apps, Fiber, RootFiber, toRaw, reactive });
5963
+ }
5917
5964
  class App extends TemplateSet {
5918
5965
  constructor(Root, config = {}) {
5919
5966
  super(config);
@@ -6324,6 +6371,6 @@ exports.whenReady = whenReady;
6324
6371
  exports.xml = xml;
6325
6372
 
6326
6373
 
6327
- __info__.date = '2025-09-23T07:17:45.055Z';
6328
- __info__.hash = '5211116';
6374
+ __info__.date = '2026-03-30T13:05:32.099Z';
6375
+ __info__.hash = 'efae3e4';
6329
6376
  __info__.url = 'https://github.com/odoo/owl';
package/dist/owl.es.js CHANGED
@@ -84,10 +84,16 @@ function toggler(key, child) {
84
84
  class OwlError extends Error {
85
85
  }
86
86
 
87
- const { setAttribute: elemSetAttribute, removeAttribute } = Element.prototype;
88
- const tokenList = DOMTokenList.prototype;
89
- const tokenListAdd = tokenList.add;
90
- const tokenListRemove = tokenList.remove;
87
+ let elemSetAttribute;
88
+ let removeAttribute;
89
+ let tokenListAdd;
90
+ let tokenListRemove;
91
+ if (typeof Element !== "undefined") {
92
+ ({ setAttribute: elemSetAttribute, removeAttribute } = Element.prototype);
93
+ const tokenList = DOMTokenList.prototype;
94
+ tokenListAdd = tokenList.add;
95
+ tokenListRemove = tokenList.remove;
96
+ }
91
97
  const isArray = Array.isArray;
92
98
  const { split, trim } = String.prototype;
93
99
  const wordRegexp = /\s+/;
@@ -466,10 +472,15 @@ function setupSyntheticEvent(evName, eventKey, capture = false) {
466
472
  }
467
473
 
468
474
  const getDescriptor$3 = (o, p) => Object.getOwnPropertyDescriptor(o, p);
469
- const nodeProto$4 = Node.prototype;
470
- const nodeInsertBefore$3 = nodeProto$4.insertBefore;
471
- const nodeSetTextContent$1 = getDescriptor$3(nodeProto$4, "textContent").set;
472
- const nodeRemoveChild$3 = nodeProto$4.removeChild;
475
+ let nodeInsertBefore$3;
476
+ let nodeSetTextContent$1;
477
+ let nodeRemoveChild$3;
478
+ if (typeof Node !== "undefined") {
479
+ const nodeProto = Node.prototype;
480
+ nodeInsertBefore$3 = nodeProto.insertBefore;
481
+ nodeSetTextContent$1 = getDescriptor$3(nodeProto, "textContent").set;
482
+ nodeRemoveChild$3 = nodeProto.removeChild;
483
+ }
473
484
  // -----------------------------------------------------------------------------
474
485
  // Multi NODE
475
486
  // -----------------------------------------------------------------------------
@@ -605,11 +616,15 @@ function multi(children) {
605
616
  }
606
617
 
607
618
  const getDescriptor$2 = (o, p) => Object.getOwnPropertyDescriptor(o, p);
608
- const nodeProto$3 = Node.prototype;
609
- const characterDataProto$1 = CharacterData.prototype;
610
- const nodeInsertBefore$2 = nodeProto$3.insertBefore;
611
- const characterDataSetData$1 = getDescriptor$2(characterDataProto$1, "data").set;
612
- const nodeRemoveChild$2 = nodeProto$3.removeChild;
619
+ let nodeInsertBefore$2;
620
+ let characterDataSetData$1;
621
+ let nodeRemoveChild$2;
622
+ if (typeof Node !== "undefined") {
623
+ const nodeProto = Node.prototype;
624
+ nodeInsertBefore$2 = nodeProto.insertBefore;
625
+ nodeRemoveChild$2 = nodeProto.removeChild;
626
+ characterDataSetData$1 = getDescriptor$2(CharacterData.prototype, "data").set;
627
+ }
613
628
  class VSimpleNode {
614
629
  constructor(text) {
615
630
  this.text = text;
@@ -675,13 +690,19 @@ function toText(value) {
675
690
  }
676
691
 
677
692
  const getDescriptor$1 = (o, p) => Object.getOwnPropertyDescriptor(o, p);
678
- const nodeProto$2 = Node.prototype;
679
- const elementProto = Element.prototype;
680
- const characterDataProto = CharacterData.prototype;
681
- const characterDataSetData = getDescriptor$1(characterDataProto, "data").set;
682
- const nodeGetFirstChild = getDescriptor$1(nodeProto$2, "firstChild").get;
683
- const nodeGetNextSibling = getDescriptor$1(nodeProto$2, "nextSibling").get;
684
- const NO_OP = () => { };
693
+ let nodeProto;
694
+ let elementProto;
695
+ let characterDataSetData;
696
+ let nodeGetFirstChild;
697
+ let nodeGetNextSibling;
698
+ if (typeof Node !== "undefined") {
699
+ nodeProto = Node.prototype;
700
+ elementProto = Element.prototype;
701
+ characterDataSetData = getDescriptor$1(CharacterData.prototype, "data").set;
702
+ nodeGetFirstChild = getDescriptor$1(nodeProto, "firstChild").get;
703
+ nodeGetNextSibling = getDescriptor$1(nodeProto, "nextSibling").get;
704
+ }
705
+ const NO_OP$1 = () => { };
685
706
  function makePropSetter(name) {
686
707
  return function setProp(value) {
687
708
  // support 0, fallback to empty string for other falsy values
@@ -1011,7 +1032,7 @@ function updateCtx(ctx, tree) {
1011
1032
  idx: info.idx,
1012
1033
  refIdx: info.refIdx,
1013
1034
  setData: makeRefSetter(index, ctx.refList),
1014
- updateData: NO_OP,
1035
+ updateData: NO_OP$1,
1015
1036
  });
1016
1037
  }
1017
1038
  }
@@ -1069,8 +1090,8 @@ function createBlockClass(template, ctx) {
1069
1090
  const isDynamic = refN > 0;
1070
1091
  // these values are defined here to make them faster to lookup in the class
1071
1092
  // block scope
1072
- const nodeCloneNode = nodeProto$2.cloneNode;
1073
- const nodeInsertBefore = nodeProto$2.insertBefore;
1093
+ const nodeCloneNode = nodeProto.cloneNode;
1094
+ const nodeInsertBefore = nodeProto.insertBefore;
1074
1095
  const elementRemove = elementProto.remove;
1075
1096
  class Block {
1076
1097
  constructor(data) {
@@ -1199,11 +1220,17 @@ function makeRefSetter(index, refs) {
1199
1220
  }
1200
1221
 
1201
1222
  const getDescriptor = (o, p) => Object.getOwnPropertyDescriptor(o, p);
1202
- const nodeProto$1 = Node.prototype;
1203
- const nodeInsertBefore$1 = nodeProto$1.insertBefore;
1204
- const nodeAppendChild = nodeProto$1.appendChild;
1205
- const nodeRemoveChild$1 = nodeProto$1.removeChild;
1206
- const nodeSetTextContent = getDescriptor(nodeProto$1, "textContent").set;
1223
+ let nodeInsertBefore$1;
1224
+ let nodeAppendChild;
1225
+ let nodeRemoveChild$1;
1226
+ let nodeSetTextContent;
1227
+ if (typeof Node !== "undefined") {
1228
+ const nodeProto = Node.prototype;
1229
+ nodeInsertBefore$1 = nodeProto.insertBefore;
1230
+ nodeAppendChild = nodeProto.appendChild;
1231
+ nodeRemoveChild$1 = nodeProto.removeChild;
1232
+ nodeSetTextContent = getDescriptor(nodeProto, "textContent").set;
1233
+ }
1207
1234
  // -----------------------------------------------------------------------------
1208
1235
  // List Node
1209
1236
  // -----------------------------------------------------------------------------
@@ -1415,9 +1442,13 @@ function createMapping(ch1, startIdx1, endIdx2) {
1415
1442
  return mapping;
1416
1443
  }
1417
1444
 
1418
- const nodeProto = Node.prototype;
1419
- const nodeInsertBefore = nodeProto.insertBefore;
1420
- const nodeRemoveChild = nodeProto.removeChild;
1445
+ let nodeInsertBefore;
1446
+ let nodeRemoveChild;
1447
+ if (typeof Node !== "undefined") {
1448
+ const nodeProto = Node.prototype;
1449
+ nodeInsertBefore = nodeProto.insertBefore;
1450
+ nodeRemoveChild = nodeProto.removeChild;
1451
+ }
1421
1452
  class VHtml {
1422
1453
  constructor(html) {
1423
1454
  this.content = [];
@@ -1637,6 +1668,7 @@ function handleError(params) {
1637
1668
  let current = fiber;
1638
1669
  do {
1639
1670
  current.node.fiber = current;
1671
+ fibersInError.set(current, error);
1640
1672
  current = current.parent;
1641
1673
  } while (current);
1642
1674
  fibersInError.set(fiber.root, error);
@@ -2383,13 +2415,19 @@ function useState(state) {
2383
2415
  const node = getCurrent();
2384
2416
  let render = batchedRenderFunctions.get(node);
2385
2417
  if (!render) {
2386
- render = batched(node.render.bind(node, false));
2418
+ const wrapper = { fn: batched(node.render.bind(node, false)) };
2419
+ render = (...args) => wrapper.fn(...args);
2387
2420
  batchedRenderFunctions.set(node, render);
2388
2421
  // manual implementation of onWillDestroy to break cyclic dependency
2389
- node.willDestroy.push(clearReactivesForCallback.bind(null, render));
2422
+ node.willDestroy.push(cleanupRenderAndReactives.bind(null, wrapper, render));
2390
2423
  }
2391
2424
  return reactive(state, render);
2392
2425
  }
2426
+ const NO_OP = () => { };
2427
+ function cleanupRenderAndReactives(wrapper, render) {
2428
+ wrapper.fn = NO_OP;
2429
+ clearReactivesForCallback(render);
2430
+ }
2393
2431
  class ComponentNode {
2394
2432
  constructor(C, props, app, parent, parentKey) {
2395
2433
  this.fiber = null;
@@ -3694,7 +3732,10 @@ function interpolate(s) {
3694
3732
  const whitespaceRE = /\s+/g;
3695
3733
  // using a non-html document so that <inner/outer>HTML serializes as XML instead
3696
3734
  // of HTML (as we will parse it as xml later)
3697
- const xmlDoc = document.implementation.createDocument(null, null, null);
3735
+ let xmlDoc;
3736
+ if (typeof document !== "undefined") {
3737
+ xmlDoc = document.implementation.createDocument(null, null, null);
3738
+ }
3698
3739
  const MODS = new Set(["stop", "capture", "prevent", "self", "synthetic"]);
3699
3740
  let nextDataIds = {};
3700
3741
  function generateId(prefix = "") {
@@ -5813,11 +5854,15 @@ function compile(template, options = {
5813
5854
  }
5814
5855
 
5815
5856
  // do not modify manually. This file is generated by the release script.
5816
- const version = "2.8.1";
5857
+ const version = "2.8.3";
5817
5858
 
5818
5859
  // -----------------------------------------------------------------------------
5819
5860
  // Scheduler
5820
5861
  // -----------------------------------------------------------------------------
5862
+ let requestAnimationFrame;
5863
+ if (typeof window !== "undefined") {
5864
+ requestAnimationFrame = window.requestAnimationFrame.bind(window);
5865
+ }
5821
5866
  class Scheduler {
5822
5867
  constructor() {
5823
5868
  this.tasks = new Set();
@@ -5905,11 +5950,13 @@ class Scheduler {
5905
5950
  }
5906
5951
  // capture the value of requestAnimationFrame as soon as possible, to avoid
5907
5952
  // interactions with other code, such as test frameworks that override them
5908
- Scheduler.requestAnimationFrame = window.requestAnimationFrame.bind(window);
5953
+ Scheduler.requestAnimationFrame = requestAnimationFrame;
5909
5954
 
5910
5955
  let hasBeenLogged = false;
5911
5956
  const apps = new Set();
5912
- window.__OWL_DEVTOOLS__ || (window.__OWL_DEVTOOLS__ = { apps, Fiber, RootFiber, toRaw, reactive });
5957
+ if (typeof window !== "undefined") {
5958
+ window.__OWL_DEVTOOLS__ || (window.__OWL_DEVTOOLS__ = { apps, Fiber, RootFiber, toRaw, reactive });
5959
+ }
5913
5960
  class App extends TemplateSet {
5914
5961
  constructor(Root, config = {}) {
5915
5962
  super(config);
@@ -6284,6 +6331,6 @@ TemplateSet.prototype._compileTemplate = function _compileTemplate(name, templat
6284
6331
  export { App, Component, EventBus, OwlError, __info__, batched, blockDom, htmlEscape, loadFile, markRaw, markup, mount, onError, onMounted, onPatched, onRendered, onWillDestroy, onWillPatch, onWillRender, onWillStart, onWillUnmount, onWillUpdateProps, reactive, status, toRaw, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useRef, useState, useSubEnv, validate, validateType, whenReady, xml };
6285
6332
 
6286
6333
 
6287
- __info__.date = '2025-09-23T07:17:45.055Z';
6288
- __info__.hash = '5211116';
6334
+ __info__.date = '2026-03-30T13:05:32.099Z';
6335
+ __info__.hash = 'efae3e4';
6289
6336
  __info__.url = 'https://github.com/odoo/owl';