@codemirror/state 0.19.7 → 0.19.8

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.19.8 (2022-02-15)
2
+
3
+ ### Bug fixes
4
+
5
+ Fix a bug where facet values with computed inputs could incorrectly retain their old value on reconfiguration.
6
+
1
7
  ## 0.19.7 (2022-02-11)
2
8
 
3
9
  ### Bug fixes
package/dist/index.cjs CHANGED
@@ -959,7 +959,7 @@ class FacetProvider {
959
959
  var _a;
960
960
  let getter = this.value;
961
961
  let compare = this.facet.compareInput;
962
- let idx = addresses[this.id] >> 1, multi = this.type == 2 /* Multi */;
962
+ let id = this.id, idx = addresses[id] >> 1, multi = this.type == 2 /* Multi */;
963
963
  let depDoc = false, depSel = false, depAddrs = [];
964
964
  for (let dep of this.dependencies) {
965
965
  if (dep == "doc")
@@ -969,24 +969,35 @@ class FacetProvider {
969
969
  else if ((((_a = addresses[dep.id]) !== null && _a !== void 0 ? _a : 1) & 1) == 0)
970
970
  depAddrs.push(addresses[dep.id]);
971
971
  }
972
- return (state, tr) => {
973
- let oldVal = state.values[idx];
974
- if (oldVal === Uninitialized) {
972
+ return {
973
+ create(state) {
975
974
  state.values[idx] = getter(state);
976
975
  return 1 /* Changed */;
977
- }
978
- if (tr) {
979
- let depChanged = (depDoc && tr.docChanged) || (depSel && (tr.docChanged || tr.selection)) ||
980
- depAddrs.some(addr => (ensureAddr(state, addr) & 1 /* Changed */) > 0);
981
- if (depChanged) {
976
+ },
977
+ update(state, tr) {
978
+ if ((depDoc && tr.docChanged) || (depSel && (tr.docChanged || tr.selection)) ||
979
+ depAddrs.some(addr => (ensureAddr(state, addr) & 1 /* Changed */) > 0)) {
982
980
  let newVal = getter(state);
983
- if (multi ? !compareArray(newVal, oldVal, compare) : !compare(newVal, oldVal)) {
981
+ if (multi ? !compareArray(newVal, state.values[idx], compare) : !compare(newVal, state.values[idx])) {
984
982
  state.values[idx] = newVal;
985
983
  return 1 /* Changed */;
986
984
  }
987
985
  }
986
+ return 0;
987
+ },
988
+ reconfigure(state, oldState) {
989
+ let newVal = getter(state);
990
+ let oldAddr = oldState.config.address[id];
991
+ if (oldAddr != null) {
992
+ let oldVal = getAddr(oldState, oldAddr);
993
+ if (multi ? compareArray(newVal, oldVal, compare) : compare(newVal, oldVal)) {
994
+ state.values[idx] = oldVal;
995
+ return 0;
996
+ }
997
+ }
998
+ state.values[idx] = newVal;
999
+ return 1 /* Changed */;
988
1000
  }
989
- return 0;
990
1001
  };
991
1002
  }
992
1003
  }
@@ -1003,14 +1014,7 @@ function dynamicFacetSlot(addresses, facet, providers) {
1003
1014
  let providerTypes = providers.map(p => p.type);
1004
1015
  let dynamic = providerAddrs.filter(p => !(p & 1));
1005
1016
  let idx = addresses[facet.id] >> 1;
1006
- return (state, tr) => {
1007
- let oldVal = state.values[idx], changed = oldVal === Uninitialized;
1008
- for (let dynAddr of dynamic) {
1009
- if (ensureAddr(state, dynAddr) & 1 /* Changed */)
1010
- changed = true;
1011
- }
1012
- if (!changed)
1013
- return 0;
1017
+ function get(state) {
1014
1018
  let values = [];
1015
1019
  for (let i = 0; i < providerAddrs.length; i++) {
1016
1020
  let value = getAddr(state, providerAddrs[i]);
@@ -1020,11 +1024,39 @@ function dynamicFacetSlot(addresses, facet, providers) {
1020
1024
  else
1021
1025
  values.push(value);
1022
1026
  }
1023
- let value = facet.combine(values);
1024
- if (oldVal !== Uninitialized && facet.compare(value, oldVal))
1025
- return 0;
1026
- state.values[idx] = value;
1027
- return 1 /* Changed */;
1027
+ return facet.combine(values);
1028
+ }
1029
+ return {
1030
+ create(state) {
1031
+ for (let addr of providerAddrs)
1032
+ ensureAddr(state, addr);
1033
+ state.values[idx] = get(state);
1034
+ return 1 /* Changed */;
1035
+ },
1036
+ update(state, tr) {
1037
+ if (!dynamic.some(dynAddr => ensureAddr(state, dynAddr) & 1 /* Changed */))
1038
+ return 0;
1039
+ let value = get(state);
1040
+ if (facet.compare(value, state.values[idx]))
1041
+ return 0;
1042
+ state.values[idx] = value;
1043
+ return 1 /* Changed */;
1044
+ },
1045
+ reconfigure(state, oldState) {
1046
+ let depChanged = providerAddrs.some(addr => ensureAddr(state, addr) & 1 /* Changed */);
1047
+ let oldProviders = oldState.config.facets[facet.id], oldValue = oldState.facet(facet);
1048
+ if (oldProviders && !depChanged && sameArray(providers, oldProviders)) {
1049
+ state.values[idx] = oldValue;
1050
+ return 0;
1051
+ }
1052
+ let value = get(state);
1053
+ if (facet.compare(value, oldValue)) {
1054
+ state.values[idx] = oldValue;
1055
+ return 0;
1056
+ }
1057
+ state.values[idx] = value;
1058
+ return 1 /* Changed */;
1059
+ }
1028
1060
  };
1029
1061
  }
1030
1062
  const initField = Facet.define({ static: true });
@@ -1070,20 +1102,27 @@ class StateField {
1070
1102
  */
1071
1103
  slot(addresses) {
1072
1104
  let idx = addresses[this.id] >> 1;
1073
- return (state, tr) => {
1074
- let oldVal = state.values[idx];
1075
- if (oldVal === Uninitialized) {
1105
+ return {
1106
+ create: (state) => {
1076
1107
  state.values[idx] = this.create(state);
1077
1108
  return 1 /* Changed */;
1078
- }
1079
- if (tr) {
1109
+ },
1110
+ update: (state, tr) => {
1111
+ let oldVal = state.values[idx];
1080
1112
  let value = this.updateF(oldVal, tr);
1081
- if (!this.compareF(oldVal, value)) {
1082
- state.values[idx] = value;
1083
- return 1 /* Changed */;
1113
+ if (this.compareF(oldVal, value))
1114
+ return 0;
1115
+ state.values[idx] = value;
1116
+ return 1 /* Changed */;
1117
+ },
1118
+ reconfigure: (state, oldState) => {
1119
+ if (oldState.config.address[this.id] != null) {
1120
+ state.values[idx] = oldState.field(this);
1121
+ return 0;
1084
1122
  }
1123
+ state.values[idx] = this.create(state);
1124
+ return 1 /* Changed */;
1085
1125
  }
1086
- return 0;
1087
1126
  };
1088
1127
  }
1089
1128
  /**
@@ -1223,44 +1262,26 @@ class Configuration {
1223
1262
  let address = Object.create(null);
1224
1263
  let staticValues = [];
1225
1264
  let dynamicSlots = [];
1226
- let dynamicValues = [];
1227
1265
  for (let field of fields) {
1228
1266
  address[field.id] = dynamicSlots.length << 1;
1229
1267
  dynamicSlots.push(a => field.slot(a));
1230
- dynamicValues.push(oldState && oldState.config.address[field.id] != null ? oldState.field(field) : Uninitialized);
1231
1268
  }
1232
- let canReuseCache = new Map;
1233
- let canReuseDep = (dep) => {
1234
- if (!(dep instanceof Facet))
1235
- return true;
1236
- let cached = canReuseCache.get(dep);
1237
- if (cached != null)
1238
- return cached;
1239
- canReuseCache.set(dep, false);
1240
- if (!oldFacets || !sameArray(oldFacets[dep.id] || [], facets[dep.id] || []))
1241
- return;
1242
- for (let input of facets[dep.id] || [])
1243
- if (!input.dependencies.every(canReuseDep))
1244
- return;
1245
- canReuseCache.set(dep, true);
1246
- };
1247
1269
  let oldFacets = oldState === null || oldState === void 0 ? void 0 : oldState.config.facets;
1248
1270
  for (let id in facets) {
1249
1271
  let providers = facets[id], facet = providers[0].facet;
1250
1272
  let oldProviders = oldFacets && oldFacets[id] || [];
1251
- let canReuse = sameArray(providers, oldProviders);
1252
1273
  if (providers.every(p => p.type == 0 /* Static */)) {
1253
1274
  address[facet.id] = (staticValues.length << 1) | 1;
1254
- let value = canReuse ? oldState.facet(facet) : facet.combine(providers.map(p => p.value)), oldValue;
1255
- if (!canReuse && oldState && facet.compare(value, oldValue = oldState.facet(facet)))
1256
- value = oldValue;
1257
- staticValues.push(value);
1275
+ if (sameArray(oldProviders, providers)) {
1276
+ staticValues.push(oldState.facet(facet));
1277
+ }
1278
+ else {
1279
+ let value = facet.combine(providers.map(p => p.value));
1280
+ staticValues.push(oldState && facet.compare(value, oldState.facet(facet)) ? oldState.facet(facet) : value);
1281
+ }
1258
1282
  }
1259
1283
  else {
1260
1284
  for (let p of providers) {
1261
- let canReuseThis = p.dependencies.every(canReuseDep);
1262
- if (!canReuseThis)
1263
- canReuse = false;
1264
1285
  if (p.type == 0 /* Static */) {
1265
1286
  address[p.id] = (staticValues.length << 1) | 1;
1266
1287
  staticValues.push(p.value);
@@ -1268,20 +1289,14 @@ class Configuration {
1268
1289
  else {
1269
1290
  address[p.id] = dynamicSlots.length << 1;
1270
1291
  dynamicSlots.push(a => p.dynamicSlot(a));
1271
- let oldAddr = oldState && canReuseThis ? oldState.config.address[p.id] : null;
1272
- dynamicValues.push(oldAddr != null ? getAddr(oldState, oldAddr) : Uninitialized);
1273
1292
  }
1274
1293
  }
1275
1294
  address[facet.id] = dynamicSlots.length << 1;
1276
1295
  dynamicSlots.push(a => dynamicFacetSlot(a, facet, providers));
1277
- dynamicValues.push(canReuse || oldProviders.length ? oldState.facet(facet) : Uninitialized);
1278
1296
  }
1279
1297
  }
1280
1298
  let dynamic = dynamicSlots.map(f => f(address));
1281
- return {
1282
- configuration: new Configuration(base, newCompartments, dynamic, address, staticValues, facets),
1283
- values: dynamicValues
1284
- };
1299
+ return new Configuration(base, newCompartments, dynamic, address, staticValues, facets);
1285
1300
  }
1286
1301
  }
1287
1302
  function flatten(extension, compartments, newCompartments) {
@@ -1333,7 +1348,6 @@ function flatten(extension, compartments, newCompartments) {
1333
1348
  inner(extension, Prec_.default);
1334
1349
  return result.reduce((a, b) => a.concat(b));
1335
1350
  }
1336
- const Uninitialized = {};
1337
1351
  function ensureAddr(state, addr) {
1338
1352
  if (addr & 1)
1339
1353
  return 2 /* Computed */;
@@ -1344,7 +1358,7 @@ function ensureAddr(state, addr) {
1344
1358
  if (status & 2 /* Computed */)
1345
1359
  return status;
1346
1360
  state.status[idx] = 4 /* Computing */;
1347
- let changed = state.config.dynamicSlots[idx](state, state.applying);
1361
+ let changed = state.computeSlot(state, state.config.dynamicSlots[idx]);
1348
1362
  return state.status[idx] = 2 /* Computed */ | changed;
1349
1363
  }
1350
1364
  function getAddr(state, addr) {
@@ -1863,24 +1877,20 @@ class EditorState {
1863
1877
  /**
1864
1878
  @internal
1865
1879
  */
1866
- values, tr = null) {
1880
+ values, computeSlot, tr) {
1867
1881
  this.config = config;
1868
1882
  this.doc = doc;
1869
1883
  this.selection = selection;
1870
1884
  this.values = values;
1871
- /**
1872
- @internal
1873
- */
1874
- this.applying = null;
1875
1885
  this.status = config.statusTemplate.slice();
1876
- this.applying = tr;
1886
+ this.computeSlot = computeSlot;
1877
1887
  // Fill in the computed state immediately, so that further queries
1878
1888
  // for it made during the update return this state
1879
1889
  if (tr)
1880
1890
  tr._state = this;
1881
1891
  for (let i = 0; i < this.config.dynamicSlots.length; i++)
1882
1892
  ensureAddr(this, i << 1);
1883
- this.applying = null;
1893
+ this.computeSlot = null;
1884
1894
  }
1885
1895
  field(field, require = true) {
1886
1896
  let addr = this.config.address[field.id];
@@ -1935,15 +1945,14 @@ class EditorState {
1935
1945
  }
1936
1946
  let startValues;
1937
1947
  if (!conf) {
1938
- let resolved = Configuration.resolve(base, compartments, this);
1939
- conf = resolved.configuration;
1940
- let intermediateState = new EditorState(conf, this.doc, this.selection, resolved.values, null);
1948
+ conf = Configuration.resolve(base, compartments, this);
1949
+ let intermediateState = new EditorState(conf, this.doc, this.selection, conf.dynamicSlots.map(() => null), (state, slot) => slot.reconfigure(state, this), null);
1941
1950
  startValues = intermediateState.values;
1942
1951
  }
1943
1952
  else {
1944
1953
  startValues = tr.startState.values.slice();
1945
1954
  }
1946
- new EditorState(conf, tr.newDoc, tr.newSelection, startValues, tr);
1955
+ new EditorState(conf, tr.newDoc, tr.newSelection, startValues, (state, slot) => slot.update(state, tr), tr);
1947
1956
  }
1948
1957
  /**
1949
1958
  Create a [transaction spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec) that
@@ -2067,7 +2076,7 @@ class EditorState {
2067
2076
  transactions.
2068
2077
  */
2069
2078
  static create(config = {}) {
2070
- let { configuration, values } = Configuration.resolve(config.extensions || [], new Map);
2079
+ let configuration = Configuration.resolve(config.extensions || [], new Map);
2071
2080
  let doc = config.doc instanceof text.Text ? config.doc
2072
2081
  : text.Text.of((config.doc || "").split(configuration.staticFacet(EditorState.lineSeparator) || DefaultSplit));
2073
2082
  let selection = !config.selection ? EditorSelection.single(0)
@@ -2076,7 +2085,7 @@ class EditorState {
2076
2085
  checkSelection(selection, doc.length);
2077
2086
  if (!configuration.staticFacet(allowMultipleSelections))
2078
2087
  selection = selection.asSingle();
2079
- return new EditorState(configuration, doc, selection, values);
2088
+ return new EditorState(configuration, doc, selection, configuration.dynamicSlots.map(() => null), (state, slot) => slot.create(state), null);
2080
2089
  }
2081
2090
  /**
2082
2091
  The size (in columns) of a tab in the document, determined by
package/dist/index.js CHANGED
@@ -955,7 +955,7 @@ class FacetProvider {
955
955
  var _a;
956
956
  let getter = this.value;
957
957
  let compare = this.facet.compareInput;
958
- let idx = addresses[this.id] >> 1, multi = this.type == 2 /* Multi */;
958
+ let id = this.id, idx = addresses[id] >> 1, multi = this.type == 2 /* Multi */;
959
959
  let depDoc = false, depSel = false, depAddrs = [];
960
960
  for (let dep of this.dependencies) {
961
961
  if (dep == "doc")
@@ -965,24 +965,35 @@ class FacetProvider {
965
965
  else if ((((_a = addresses[dep.id]) !== null && _a !== void 0 ? _a : 1) & 1) == 0)
966
966
  depAddrs.push(addresses[dep.id]);
967
967
  }
968
- return (state, tr) => {
969
- let oldVal = state.values[idx];
970
- if (oldVal === Uninitialized) {
968
+ return {
969
+ create(state) {
971
970
  state.values[idx] = getter(state);
972
971
  return 1 /* Changed */;
973
- }
974
- if (tr) {
975
- let depChanged = (depDoc && tr.docChanged) || (depSel && (tr.docChanged || tr.selection)) ||
976
- depAddrs.some(addr => (ensureAddr(state, addr) & 1 /* Changed */) > 0);
977
- if (depChanged) {
972
+ },
973
+ update(state, tr) {
974
+ if ((depDoc && tr.docChanged) || (depSel && (tr.docChanged || tr.selection)) ||
975
+ depAddrs.some(addr => (ensureAddr(state, addr) & 1 /* Changed */) > 0)) {
978
976
  let newVal = getter(state);
979
- if (multi ? !compareArray(newVal, oldVal, compare) : !compare(newVal, oldVal)) {
977
+ if (multi ? !compareArray(newVal, state.values[idx], compare) : !compare(newVal, state.values[idx])) {
980
978
  state.values[idx] = newVal;
981
979
  return 1 /* Changed */;
982
980
  }
983
981
  }
982
+ return 0;
983
+ },
984
+ reconfigure(state, oldState) {
985
+ let newVal = getter(state);
986
+ let oldAddr = oldState.config.address[id];
987
+ if (oldAddr != null) {
988
+ let oldVal = getAddr(oldState, oldAddr);
989
+ if (multi ? compareArray(newVal, oldVal, compare) : compare(newVal, oldVal)) {
990
+ state.values[idx] = oldVal;
991
+ return 0;
992
+ }
993
+ }
994
+ state.values[idx] = newVal;
995
+ return 1 /* Changed */;
984
996
  }
985
- return 0;
986
997
  };
987
998
  }
988
999
  }
@@ -999,14 +1010,7 @@ function dynamicFacetSlot(addresses, facet, providers) {
999
1010
  let providerTypes = providers.map(p => p.type);
1000
1011
  let dynamic = providerAddrs.filter(p => !(p & 1));
1001
1012
  let idx = addresses[facet.id] >> 1;
1002
- return (state, tr) => {
1003
- let oldVal = state.values[idx], changed = oldVal === Uninitialized;
1004
- for (let dynAddr of dynamic) {
1005
- if (ensureAddr(state, dynAddr) & 1 /* Changed */)
1006
- changed = true;
1007
- }
1008
- if (!changed)
1009
- return 0;
1013
+ function get(state) {
1010
1014
  let values = [];
1011
1015
  for (let i = 0; i < providerAddrs.length; i++) {
1012
1016
  let value = getAddr(state, providerAddrs[i]);
@@ -1016,11 +1020,39 @@ function dynamicFacetSlot(addresses, facet, providers) {
1016
1020
  else
1017
1021
  values.push(value);
1018
1022
  }
1019
- let value = facet.combine(values);
1020
- if (oldVal !== Uninitialized && facet.compare(value, oldVal))
1021
- return 0;
1022
- state.values[idx] = value;
1023
- return 1 /* Changed */;
1023
+ return facet.combine(values);
1024
+ }
1025
+ return {
1026
+ create(state) {
1027
+ for (let addr of providerAddrs)
1028
+ ensureAddr(state, addr);
1029
+ state.values[idx] = get(state);
1030
+ return 1 /* Changed */;
1031
+ },
1032
+ update(state, tr) {
1033
+ if (!dynamic.some(dynAddr => ensureAddr(state, dynAddr) & 1 /* Changed */))
1034
+ return 0;
1035
+ let value = get(state);
1036
+ if (facet.compare(value, state.values[idx]))
1037
+ return 0;
1038
+ state.values[idx] = value;
1039
+ return 1 /* Changed */;
1040
+ },
1041
+ reconfigure(state, oldState) {
1042
+ let depChanged = providerAddrs.some(addr => ensureAddr(state, addr) & 1 /* Changed */);
1043
+ let oldProviders = oldState.config.facets[facet.id], oldValue = oldState.facet(facet);
1044
+ if (oldProviders && !depChanged && sameArray(providers, oldProviders)) {
1045
+ state.values[idx] = oldValue;
1046
+ return 0;
1047
+ }
1048
+ let value = get(state);
1049
+ if (facet.compare(value, oldValue)) {
1050
+ state.values[idx] = oldValue;
1051
+ return 0;
1052
+ }
1053
+ state.values[idx] = value;
1054
+ return 1 /* Changed */;
1055
+ }
1024
1056
  };
1025
1057
  }
1026
1058
  const initField = /*@__PURE__*/Facet.define({ static: true });
@@ -1066,20 +1098,27 @@ class StateField {
1066
1098
  */
1067
1099
  slot(addresses) {
1068
1100
  let idx = addresses[this.id] >> 1;
1069
- return (state, tr) => {
1070
- let oldVal = state.values[idx];
1071
- if (oldVal === Uninitialized) {
1101
+ return {
1102
+ create: (state) => {
1072
1103
  state.values[idx] = this.create(state);
1073
1104
  return 1 /* Changed */;
1074
- }
1075
- if (tr) {
1105
+ },
1106
+ update: (state, tr) => {
1107
+ let oldVal = state.values[idx];
1076
1108
  let value = this.updateF(oldVal, tr);
1077
- if (!this.compareF(oldVal, value)) {
1078
- state.values[idx] = value;
1079
- return 1 /* Changed */;
1109
+ if (this.compareF(oldVal, value))
1110
+ return 0;
1111
+ state.values[idx] = value;
1112
+ return 1 /* Changed */;
1113
+ },
1114
+ reconfigure: (state, oldState) => {
1115
+ if (oldState.config.address[this.id] != null) {
1116
+ state.values[idx] = oldState.field(this);
1117
+ return 0;
1080
1118
  }
1119
+ state.values[idx] = this.create(state);
1120
+ return 1 /* Changed */;
1081
1121
  }
1082
- return 0;
1083
1122
  };
1084
1123
  }
1085
1124
  /**
@@ -1219,44 +1258,26 @@ class Configuration {
1219
1258
  let address = Object.create(null);
1220
1259
  let staticValues = [];
1221
1260
  let dynamicSlots = [];
1222
- let dynamicValues = [];
1223
1261
  for (let field of fields) {
1224
1262
  address[field.id] = dynamicSlots.length << 1;
1225
1263
  dynamicSlots.push(a => field.slot(a));
1226
- dynamicValues.push(oldState && oldState.config.address[field.id] != null ? oldState.field(field) : Uninitialized);
1227
1264
  }
1228
- let canReuseCache = new Map;
1229
- let canReuseDep = (dep) => {
1230
- if (!(dep instanceof Facet))
1231
- return true;
1232
- let cached = canReuseCache.get(dep);
1233
- if (cached != null)
1234
- return cached;
1235
- canReuseCache.set(dep, false);
1236
- if (!oldFacets || !sameArray(oldFacets[dep.id] || [], facets[dep.id] || []))
1237
- return;
1238
- for (let input of facets[dep.id] || [])
1239
- if (!input.dependencies.every(canReuseDep))
1240
- return;
1241
- canReuseCache.set(dep, true);
1242
- };
1243
1265
  let oldFacets = oldState === null || oldState === void 0 ? void 0 : oldState.config.facets;
1244
1266
  for (let id in facets) {
1245
1267
  let providers = facets[id], facet = providers[0].facet;
1246
1268
  let oldProviders = oldFacets && oldFacets[id] || [];
1247
- let canReuse = sameArray(providers, oldProviders);
1248
1269
  if (providers.every(p => p.type == 0 /* Static */)) {
1249
1270
  address[facet.id] = (staticValues.length << 1) | 1;
1250
- let value = canReuse ? oldState.facet(facet) : facet.combine(providers.map(p => p.value)), oldValue;
1251
- if (!canReuse && oldState && facet.compare(value, oldValue = oldState.facet(facet)))
1252
- value = oldValue;
1253
- staticValues.push(value);
1271
+ if (sameArray(oldProviders, providers)) {
1272
+ staticValues.push(oldState.facet(facet));
1273
+ }
1274
+ else {
1275
+ let value = facet.combine(providers.map(p => p.value));
1276
+ staticValues.push(oldState && facet.compare(value, oldState.facet(facet)) ? oldState.facet(facet) : value);
1277
+ }
1254
1278
  }
1255
1279
  else {
1256
1280
  for (let p of providers) {
1257
- let canReuseThis = p.dependencies.every(canReuseDep);
1258
- if (!canReuseThis)
1259
- canReuse = false;
1260
1281
  if (p.type == 0 /* Static */) {
1261
1282
  address[p.id] = (staticValues.length << 1) | 1;
1262
1283
  staticValues.push(p.value);
@@ -1264,20 +1285,14 @@ class Configuration {
1264
1285
  else {
1265
1286
  address[p.id] = dynamicSlots.length << 1;
1266
1287
  dynamicSlots.push(a => p.dynamicSlot(a));
1267
- let oldAddr = oldState && canReuseThis ? oldState.config.address[p.id] : null;
1268
- dynamicValues.push(oldAddr != null ? getAddr(oldState, oldAddr) : Uninitialized);
1269
1288
  }
1270
1289
  }
1271
1290
  address[facet.id] = dynamicSlots.length << 1;
1272
1291
  dynamicSlots.push(a => dynamicFacetSlot(a, facet, providers));
1273
- dynamicValues.push(canReuse || oldProviders.length ? oldState.facet(facet) : Uninitialized);
1274
1292
  }
1275
1293
  }
1276
1294
  let dynamic = dynamicSlots.map(f => f(address));
1277
- return {
1278
- configuration: new Configuration(base, newCompartments, dynamic, address, staticValues, facets),
1279
- values: dynamicValues
1280
- };
1295
+ return new Configuration(base, newCompartments, dynamic, address, staticValues, facets);
1281
1296
  }
1282
1297
  }
1283
1298
  function flatten(extension, compartments, newCompartments) {
@@ -1329,7 +1344,6 @@ function flatten(extension, compartments, newCompartments) {
1329
1344
  inner(extension, Prec_.default);
1330
1345
  return result.reduce((a, b) => a.concat(b));
1331
1346
  }
1332
- const Uninitialized = {};
1333
1347
  function ensureAddr(state, addr) {
1334
1348
  if (addr & 1)
1335
1349
  return 2 /* Computed */;
@@ -1340,7 +1354,7 @@ function ensureAddr(state, addr) {
1340
1354
  if (status & 2 /* Computed */)
1341
1355
  return status;
1342
1356
  state.status[idx] = 4 /* Computing */;
1343
- let changed = state.config.dynamicSlots[idx](state, state.applying);
1357
+ let changed = state.computeSlot(state, state.config.dynamicSlots[idx]);
1344
1358
  return state.status[idx] = 2 /* Computed */ | changed;
1345
1359
  }
1346
1360
  function getAddr(state, addr) {
@@ -1858,24 +1872,20 @@ class EditorState {
1858
1872
  /**
1859
1873
  @internal
1860
1874
  */
1861
- values, tr = null) {
1875
+ values, computeSlot, tr) {
1862
1876
  this.config = config;
1863
1877
  this.doc = doc;
1864
1878
  this.selection = selection;
1865
1879
  this.values = values;
1866
- /**
1867
- @internal
1868
- */
1869
- this.applying = null;
1870
1880
  this.status = config.statusTemplate.slice();
1871
- this.applying = tr;
1881
+ this.computeSlot = computeSlot;
1872
1882
  // Fill in the computed state immediately, so that further queries
1873
1883
  // for it made during the update return this state
1874
1884
  if (tr)
1875
1885
  tr._state = this;
1876
1886
  for (let i = 0; i < this.config.dynamicSlots.length; i++)
1877
1887
  ensureAddr(this, i << 1);
1878
- this.applying = null;
1888
+ this.computeSlot = null;
1879
1889
  }
1880
1890
  field(field, require = true) {
1881
1891
  let addr = this.config.address[field.id];
@@ -1930,15 +1940,14 @@ class EditorState {
1930
1940
  }
1931
1941
  let startValues;
1932
1942
  if (!conf) {
1933
- let resolved = Configuration.resolve(base, compartments, this);
1934
- conf = resolved.configuration;
1935
- let intermediateState = new EditorState(conf, this.doc, this.selection, resolved.values, null);
1943
+ conf = Configuration.resolve(base, compartments, this);
1944
+ let intermediateState = new EditorState(conf, this.doc, this.selection, conf.dynamicSlots.map(() => null), (state, slot) => slot.reconfigure(state, this), null);
1936
1945
  startValues = intermediateState.values;
1937
1946
  }
1938
1947
  else {
1939
1948
  startValues = tr.startState.values.slice();
1940
1949
  }
1941
- new EditorState(conf, tr.newDoc, tr.newSelection, startValues, tr);
1950
+ new EditorState(conf, tr.newDoc, tr.newSelection, startValues, (state, slot) => slot.update(state, tr), tr);
1942
1951
  }
1943
1952
  /**
1944
1953
  Create a [transaction spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec) that
@@ -2062,7 +2071,7 @@ class EditorState {
2062
2071
  transactions.
2063
2072
  */
2064
2073
  static create(config = {}) {
2065
- let { configuration, values } = Configuration.resolve(config.extensions || [], new Map);
2074
+ let configuration = Configuration.resolve(config.extensions || [], new Map);
2066
2075
  let doc = config.doc instanceof Text ? config.doc
2067
2076
  : Text.of((config.doc || "").split(configuration.staticFacet(EditorState.lineSeparator) || DefaultSplit));
2068
2077
  let selection = !config.selection ? EditorSelection.single(0)
@@ -2071,7 +2080,7 @@ class EditorState {
2071
2080
  checkSelection(selection, doc.length);
2072
2081
  if (!configuration.staticFacet(allowMultipleSelections))
2073
2082
  selection = selection.asSingle();
2074
- return new EditorState(configuration, doc, selection, values);
2083
+ return new EditorState(configuration, doc, selection, configuration.dynamicSlots.map(() => null), (state, slot) => slot.create(state), null);
2075
2084
  }
2076
2085
  /**
2077
2086
  The size (in columns) of a tab in the document, determined by
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemirror/state",
3
- "version": "0.19.7",
3
+ "version": "0.19.8",
4
4
  "description": "Editor state data structures for the CodeMirror code editor",
5
5
  "scripts": {
6
6
  "test": "cm-runtests",