mnfst 0.5.102 → 0.5.104

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.
@@ -259,12 +259,16 @@ function deepSeal(obj) {
259
259
  }
260
260
  }
261
261
  } else {
262
- for (const key in obj) {
263
- if (obj.hasOwnProperty(key)) {
264
- const value = obj[key];
265
- if (value !== null && typeof value === 'object') {
266
- deepSeal(value);
267
- }
262
+ // Iterate own enumerable keys via Object.keys instead of for…in +
263
+ // .hasOwnProperty(). The latter throws "hasOwnProperty is not a
264
+ // function" on any object that either lacks the Object prototype
265
+ // (e.g. Object.create(null)) or has a column literally named
266
+ // `hasOwnProperty` shadowing the prototype method — both of which
267
+ // can happen with payloads from Appwrite / arbitrary backends.
268
+ for (const key of Object.keys(obj)) {
269
+ const value = obj[key];
270
+ if (value !== null && typeof value === 'object') {
271
+ deepSeal(value);
268
272
  }
269
273
  }
270
274
  }
@@ -387,14 +391,20 @@ function createReactiveReferences(data, dataSourceName = null) {
387
391
  }
388
392
 
389
393
  if (typeof data === 'object') {
390
- // Create new object with new references for each property
394
+ // Create new object with new references for each property.
395
+ // Iterate via Object.keys() (own enumerable, no prototype walk)
396
+ // rather than for…in + .hasOwnProperty(). The latter pattern
397
+ // throws "hasOwnProperty is not a function" on any payload that
398
+ // either has a column literally named `hasOwnProperty` shadowing
399
+ // the prototype, or lacks the Object prototype entirely
400
+ // (Object.create(null), some SDK response shapes). This is the
401
+ // hot path for every Appwrite mutation result and realtime event,
402
+ // so it must be defensive about arbitrary backend payloads.
391
403
  const newObj = {};
392
- for (const key in data) {
393
- if (data.hasOwnProperty(key)) {
394
- const value = data[key];
395
- // Recursively create new references for nested objects/arrays
396
- newObj[key] = createReactiveReferences(value, dataSourceName);
397
- }
404
+ for (const key of Object.keys(data)) {
405
+ const value = data[key];
406
+ // Recursively create new references for nested objects/arrays
407
+ newObj[key] = createReactiveReferences(value, dataSourceName);
398
408
  }
399
409
 
400
410
  // Detect file objects (have mimeType or sizeOriginal)
@@ -8732,6 +8742,29 @@ function registerXMagicMethod(loadDataSource) {
8732
8742
  if (key in target && typeof target[key] === 'function') {
8733
8743
  return target[key].bind(target);
8734
8744
  }
8745
+ // Appwrite sources intentionally skip the client-side
8746
+ // $query attachment (see attachArrayMethods comment:
8747
+ // "Appwrite sources will get their $query from the
8748
+ // Appwrite plugin"). Delegate to the Appwrite methods
8749
+ // handler so the click hits the backend instead of
8750
+ // silently falling through to `undefined` or, in some
8751
+ // proxy paths, a no-op `() => []`. Without this, demo
8752
+ // sort/query buttons appear to do nothing — no console
8753
+ // error, no network request — because the call resolves
8754
+ // to the chaining fallback's stub `queryFn`.
8755
+ if (key === '$query' || key === '$search') {
8756
+ const createAppwriteMethodsHandler = window.ManifestDataProxiesAppwrite?.createAppwriteMethodsHandler;
8757
+ if (createAppwriteMethodsHandler) {
8758
+ try {
8759
+ const manifest = window.ManifestComponentsRegistry?.manifest || null;
8760
+ const dataSource = manifest?.data?.[prop] || manifest?.appwrite?.[prop];
8761
+ if (dataSource && window.ManifestDataConfig?.isAppwriteCollection?.(dataSource)) {
8762
+ const methodsHandler = createAppwriteMethodsHandler(prop, loadDataSource);
8763
+ return methodsHandler.bind(null, key);
8764
+ }
8765
+ } catch { /* fall through */ }
8766
+ }
8767
+ }
8735
8768
  }
8736
8769
  // Forward all other property access to the target array
8737
8770
  const value = target[key];
@@ -9049,6 +9082,22 @@ function registerXMagicMethod(loadDataSource) {
9049
9082
  if (target && typeof target === 'object' && key in target && typeof target[key] === 'function') {
9050
9083
  return target[key].bind(target);
9051
9084
  }
9085
+ // Appwrite-source delegation: $query is intentionally
9086
+ // not attached to Appwrite arrays by attachArrayMethods
9087
+ // (it requires a backend round-trip). Route to the
9088
+ // Appwrite methods handler instead of the no-op fallback
9089
+ // so sort/query/search buttons actually fire requests.
9090
+ const createAppwriteMethodsHandler = window.ManifestDataProxiesAppwrite?.createAppwriteMethodsHandler;
9091
+ if (createAppwriteMethodsHandler) {
9092
+ try {
9093
+ const manifest = window.ManifestComponentsRegistry?.manifest || null;
9094
+ const dataSource = manifest?.data?.[prop] || manifest?.appwrite?.[prop];
9095
+ if (dataSource && window.ManifestDataConfig?.isAppwriteCollection?.(dataSource)) {
9096
+ const methodsHandler = createAppwriteMethodsHandler(prop, loadDataSource);
9097
+ return methodsHandler.bind(null, key);
9098
+ }
9099
+ } catch { /* fall through */ }
9100
+ }
9052
9101
  // Fallback: return safe function that returns empty array
9053
9102
  return function () {
9054
9103
  return [];
@@ -6,7 +6,7 @@
6
6
  "manifest.color.js": "sha384-Z9G/lzt0vVMxjz4wkPuGG1X9mmQAJR15aOoGX3ephf7r2wnlUWet5GLgkUMtT4vt",
7
7
  "manifest.colorpicker.js": "sha384-0EVn+Ha06h7FIvOxc6WjZYnKYXzi+zba08yKvczSEGTRkWRxyKN2TFrZHI1SDCXu",
8
8
  "manifest.components.js": "sha384-3dCTD5EwCZTiX+1obYtDNM3WWwPh2JDQUQQsdRUUK3gs6FXjse1ShkKaT/2jsNaI",
9
- "manifest.data.js": "sha384-+wfMPBlMsmLJ7EJWGJMTKGAhLaLCyOVX+Nq+ps3Lly58QC9Dp3XRHK5yangII0yq",
9
+ "manifest.data.js": "sha384-xdeTXOfmvxTc6M4Fl+bAjGfi3XulV2iPFGvRcKyK0ml4dwHAqSy3X9ZC/UJzpDk2",
10
10
  "manifest.dropdowns.js": "sha384-WMrFoSpKfJuo81dyrwhVrDO8rq+rDwh2x8x4nH01BY5ZHkvjE+/SaT2gWCI0zOn+",
11
11
  "manifest.export.js": "sha384-qvdGz1TiGEDOeWJ5os1z03RURdKX+ezZEQ1KyV+9iC7X0esLK83mtY87t4MQv45t",
12
12
  "manifest.icons.js": "sha384-uOkboYrovjCpl22eey3Jaxpey+pOnot5NDnRRumcRxiR7IOVaRh1i20gYnWXR5dW",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mnfst",
3
- "version": "0.5.102",
3
+ "version": "0.5.104",
4
4
  "private": false,
5
5
  "workspaces": [
6
6
  "templates/starter",