@breakside/jskit 2023.11.0 → 2023.12.1

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 (46) hide show
  1. package/Frameworks/DOM.jsframework/Info.json +2 -2
  2. package/Frameworks/DOM.jsframework/io.breakside.JSKit.DOM-bundle.js +2 -2
  3. package/Frameworks/FontKit.jsframework/Info.json +2 -2
  4. package/Frameworks/FontKit.jsframework/io.breakside.JSKit.FontKit-bundle.js +2 -2
  5. package/Frameworks/Foundation.jsframework/Info.json +2 -2
  6. package/Frameworks/Foundation.jsframework/JS/JSFileManager+HTML.js +111 -48
  7. package/Frameworks/Foundation.jsframework/JS/JSFileManager+Node.js +8 -1
  8. package/Frameworks/Foundation.jsframework/JS/JSUserDefaults.js +0 -1
  9. package/Frameworks/Foundation.jsframework/io.breakside.JSKit.Foundation-bundle.js +2 -2
  10. package/Frameworks/SecurityKit.jsframework/Info.json +2 -2
  11. package/Frameworks/SecurityKit.jsframework/io.breakside.JSKit.SecurityKit-bundle.js +2 -2
  12. package/Info.json +2 -2
  13. package/Node/io.breakside.jskit-bundle.js +2 -2
  14. package/Root/Frameworks/APIKit/Info.yaml +1 -1
  15. package/Root/Frameworks/APIKitTesting/Info.yaml +1 -1
  16. package/Root/Frameworks/AuthKit/Info.yaml +1 -1
  17. package/Root/Frameworks/CSSOM/Info.yaml +1 -1
  18. package/Root/Frameworks/ChartKit/Info.yaml +1 -1
  19. package/Root/Frameworks/ConferenceKit/Info.yaml +1 -1
  20. package/Root/Frameworks/DBKit/Info.yaml +1 -1
  21. package/Root/Frameworks/DOM/Info.yaml +1 -1
  22. package/Root/Frameworks/Dispatch/Info.yaml +1 -1
  23. package/Root/Frameworks/FontKit/Info.yaml +1 -1
  24. package/Root/Frameworks/Foundation/Info.yaml +1 -1
  25. package/Root/Frameworks/Foundation/JSFileManager+HTML.js +111 -48
  26. package/Root/Frameworks/Foundation/JSFileManager+Node.js +8 -1
  27. package/Root/Frameworks/Foundation/JSUserDefaults.js +0 -1
  28. package/Root/Frameworks/ImageKit/Info.yaml +1 -1
  29. package/Root/Frameworks/MediaKit/Info.yaml +1 -1
  30. package/Root/Frameworks/MediaKitUI/Info.yaml +1 -1
  31. package/Root/Frameworks/NotificationKit/Info.yaml +1 -1
  32. package/Root/Frameworks/PDFKit/Info.yaml +1 -1
  33. package/Root/Frameworks/QRKit/Info.yaml +1 -1
  34. package/Root/Frameworks/SearchKit/Info.yaml +1 -1
  35. package/Root/Frameworks/SecurityKit/Info.yaml +1 -1
  36. package/Root/Frameworks/ServerKit/Info.yaml +1 -1
  37. package/Root/Frameworks/ServerKitTesting/Info.yaml +1 -1
  38. package/Root/Frameworks/TestKit/Info.yaml +1 -1
  39. package/Root/Frameworks/UIKit/Info.yaml +1 -1
  40. package/Root/Frameworks/UIKit/UIAccessibility.js +2 -1
  41. package/Root/Frameworks/UIKit/UIHTMLWindowServer.js +18 -2
  42. package/Root/Frameworks/UIKit/UITextLayer.js +1 -1
  43. package/Root/Frameworks/UIKit/UIView.js +1 -0
  44. package/Root/Frameworks/UIKit/UIWindow.js +2 -4
  45. package/Root/Frameworks/UIKitTesting/Info.yaml +1 -1
  46. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.AuthKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.CSSOM
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ChartKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2021 Breakside Inc.
6
6
  # JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ConferenceKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.DBKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.DOM
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.Dispatch
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSCopyright: Copyright © 2020 Breakside Inc.
5
5
  JSBundleEnvironments:
6
6
  html: Dispatch+HTML.js
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.FontKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.Foundation
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -45,6 +45,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
45
45
  _identifier: null,
46
46
 
47
47
  _db: null,
48
+ _rootURL: null,
48
49
 
49
50
  error: null,
50
51
 
@@ -57,7 +58,6 @@ JSClass("JSHTMLFileManager", JSFileManager, {
57
58
  // MARK: - Opening the File System
58
59
 
59
60
  open: function(completion, target){
60
- logger.info("opening indexeddb file manager");
61
61
  if (!completion){
62
62
  completion = Promise.completion(function JSFileManager_open_promise_completion(status){
63
63
  if (status != JSFileManager.State.success){
@@ -68,6 +68,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
68
68
  }
69
69
  var request = indexedDB.open(this._identifier, CURRENT_DATABASE_VERSION);
70
70
  var manager = this;
71
+ var oldVersion = 0;
71
72
  request.onblocked = function JSFileManager_open_onblocked(e){
72
73
  logger.info("indexeddb file manager upgrade blocked by other windows");
73
74
  completion.call(target, JSFileManager.State.conflictingVersions);
@@ -81,6 +82,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
81
82
  request.onupgradeneeded = function JSFileManager_open_onupgradeneeded(e){
82
83
  logger.info("indexeddb upgrade needed");
83
84
  logger.info("indexeddb upgrading");
85
+ oldVersion = e.oldVersion;
84
86
  try{
85
87
  manager._db = e.target.result;
86
88
  manager.upgrade(e.oldVersion, e.newVersion);
@@ -90,10 +92,24 @@ JSClass("JSHTMLFileManager", JSFileManager, {
90
92
  }
91
93
  };
92
94
  request.onsuccess = function JSFileManager_open_onsuccess(e){
93
- logger.info("indexeddb open");
94
95
  manager._db = e.target.result;
95
- completion.call(target, JSFileManager.State.success);
96
+ if (oldVersion === 1){
97
+ var v1url = manager._rootURL.appendingPathComponents(["Containers", "io.breakside.JSKit.Foundation.JSFileManager"], true);
98
+ var v2url = manager.persistentContainerURL;
99
+ logger.info("moving persistentContainerURL from %{public} to %{public}", v1url.encodedString, v2url.encodedString);
100
+ manager.moveItemAtURL(v1url, v2url, function(success){
101
+ if (success){
102
+ completion.call(target, JSFileManager.State.success);
103
+ }else{
104
+ logger.error("failed to move persistentContainerURL");
105
+ completion.call(target, JSFileManager.State.genericFailure);
106
+ }
107
+ });
108
+ }else{
109
+ completion.call(target, JSFileManager.State.success);
110
+ }
96
111
  };
112
+ this._rootURL = this.urlForPath("/");
97
113
  return completion.promise;
98
114
  },
99
115
 
@@ -108,7 +124,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
108
124
  url.path = path;
109
125
  if (path.startsWith("/")){
110
126
  url.scheme = JSFileManager.Scheme.jskitfile;
111
- url.host = "";
127
+ url._hasAuthority = true;
112
128
  }
113
129
  if (baseURL){
114
130
  url.resolveToBaseURL(baseURL);
@@ -132,7 +148,10 @@ JSClass("JSHTMLFileManager", JSFileManager, {
132
148
  },
133
149
 
134
150
  _getPersistentContainerURL: function(){
135
- return JSURL.initWithString('%s:///Containers/%s/'.sprintf(JSFileManager.Scheme.jskitfile, this._identifier));
151
+ if (JSBundle.mainBundleIdentifier){
152
+ return this._rootURL.appendingPathComponents(["Containers", JSBundle.mainBundleIdentifier], true);
153
+ }
154
+ return this._rootURL;
136
155
  },
137
156
 
138
157
  _getWorkingDirectoryURL: function(){
@@ -140,7 +159,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
140
159
  },
141
160
 
142
161
  begin: function(permission, stores){
143
- return new JSFileManagerTransaction(this._db, stores, permission);
162
+ return new JSHTMLFileManagerTransaction(this._db, stores, permission);
144
163
  },
145
164
 
146
165
  // --------------------------------------------------------------------
@@ -158,7 +177,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
158
177
  throw new Error("JSFileManager.itemExistsAtURL unsupported scheme: %s".sprintf(url.scheme));
159
178
  }
160
179
  var exists = false;
161
- var transaction = this.begin(JSFileManager.Permission.read, JSFileManager.Tables.metadata);
180
+ var transaction = this.begin(JSHTMLFileManager.Permission.read, JSHTMLFileManager.Tables.metadata);
162
181
  transaction.addCompletion(function JSFileManager_itemExists_completion(success){
163
182
  completion.call(target, success && exists);
164
183
  });
@@ -183,7 +202,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
183
202
  throw new Error("JSFileManager.attributesOfItemAtURL unsupported scheme: %s".sprintf(url.scheme));
184
203
  }
185
204
  var metadata = null;
186
- var transaction = this.begin(JSFileManager.Permission.read, JSFileManager.Tables.metadata);
205
+ var transaction = this.begin(JSHTMLFileManager.Permission.read, JSHTMLFileManager.Tables.metadata);
187
206
  transaction.addCompletion(function JSFileManager_attributesOfItem_completion(success){
188
207
  completion.call(target, metadata);
189
208
  });
@@ -196,12 +215,11 @@ JSClass("JSHTMLFileManager", JSFileManager, {
196
215
  _metadataInTransactionAtURL: function(transaction, url, completion){
197
216
  var parent = url.removingLastPathComponent();
198
217
  try {
199
- var index = transaction.metadata.index(JSFileManager.Indexes.metadataPath);
218
+ var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataPath);
200
219
  var lookup = [parent.path || '', url.lastPathComponent];
201
220
  var request = index.get(lookup);
202
221
  var metadata;
203
222
  request.onsuccess = function JSFileManager_metadata_onsuccess(e){
204
- logger.debug("metadata query success; exists: %b", !!e.target.result);
205
223
  completion(e.target.result || null);
206
224
  // FIXME: url could include a symlink folder, in which case we won't
207
225
  // get a result here even if the url is valid after resolving the symlink.
@@ -219,7 +237,6 @@ JSClass("JSHTMLFileManager", JSFileManager, {
219
237
  logger.error("Error querying metadata: %{error}", request.error);
220
238
  completion(null);
221
239
  };
222
- logger.debug("looking up metadata");
223
240
  }catch(e){
224
241
  logger.error("Exception thrown querying metadata: %{error}", e);
225
242
  }
@@ -242,7 +259,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
242
259
  if (url.pathComponents.length === 1){
243
260
  throw new Error("JSFileManager.createDirectoryAtURL cannot create root path");
244
261
  }
245
- var transaction = this.begin(JSFileManager.Permission.readwrite, JSFileManager.Tables.metadata);
262
+ var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, JSHTMLFileManager.Tables.metadata);
246
263
  transaction.addCompletion(completion, target);
247
264
  this._createDirectoryInTransactionAtURL(transaction, url, function JSFileManager_createDirectory_completion(success){
248
265
  if (!success){
@@ -309,8 +326,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
309
326
  if (url.pathComponents.length === 1){
310
327
  throw new Error("JSFileManager.createFileAtURL cannot create root path");
311
328
  }
312
- logger.debug("creating file");
313
- var transaction = this.begin(JSFileManager.Permission.readwrite, [JSFileManager.Tables.metadata, JSFileManager.Tables.data]);
329
+ var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, [JSHTMLFileManager.Tables.metadata, JSHTMLFileManager.Tables.data]);
314
330
  transaction.addCompletion(completion, target);
315
331
  var parent = url.removingLastPathComponent();
316
332
  var manager = this;
@@ -318,7 +334,6 @@ JSClass("JSHTMLFileManager", JSFileManager, {
318
334
  var metadata = null;
319
335
  var create = function JSFileManager_createFile_create(parentExists){
320
336
  if (parentExists){
321
- logger.debug("writing file data");
322
337
  var dataRequest;
323
338
  if (metadata === null){
324
339
  dataRequest = transaction.data.add(data);
@@ -354,16 +369,13 @@ JSClass("JSHTMLFileManager", JSFileManager, {
354
369
  };
355
370
  manager._metadataInTransactionAtURL(transaction, url, function JSFileManager_createFile_metadata(existingMetadata){
356
371
  if (existingMetadata !== null){
357
- logger.debug("overwriting file");
358
372
  metadata = existingMetadata;
359
373
  create(true);
360
374
  }else{
361
- logger.debug("new file, checking for parent");
362
375
  manager._metadataInTransactionAtURL(transaction, parent, function JSFileManager_createFile_parent_metadata(parentMetadata){
363
376
  if (parentMetadata !== null){
364
377
  create(parentMetadata.itemType == JSFileManager.ItemType.directory);
365
378
  }else{
366
- logger.debug("creating parent");
367
379
  manager._createDirectoryInTransactionAtURL(transaction, parent, create);
368
380
  }
369
381
  });
@@ -402,7 +414,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
402
414
  if (url.path == toURL.path){
403
415
  throw new Error("JSFileManager.moveItemAtURL target and destination are the same");
404
416
  }
405
- var transaction = this.begin(JSFileManager.Permission.readwrite, JSFileManager.Tables.metadata);
417
+ var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, JSHTMLFileManager.Tables.metadata);
406
418
  transaction.addCompletion(completion, target);
407
419
  var parent = url.removingLastPathComponent();
408
420
  var toParent = toURL.removingLastPathComponent();
@@ -414,18 +426,15 @@ JSClass("JSHTMLFileManager", JSFileManager, {
414
426
  }else{
415
427
  var move = function JSFileManager_moveItem_move(toParentExists){
416
428
  if (toParentExists){
417
- var toMetadata = JSCopy(metadata);
418
- toMetadata.parent = toParent.path;
419
- toMetadata.name = toURL.lastPathComponent;
420
- var request = transaction.metadata.put(toMetadata);
421
- request.onsuccess = function JSFileManager_moveItem_onsuccess(){
429
+ manager._moveItemInTransactionAtURL(transaction, url, toURL, toParent, metadata);
430
+ transaction.indexedDBTransaction.addEventListener("complete", function(){
422
431
  try{
423
432
  manager.postNotificationForURL(parent, JSFileManager.Notification.directoryDidRemoveItem, {url: url, name: metadata.name, itemType: metadata.itemType});
424
- manager.postNotificationForURL(toParent, JSFileManager.Notification.directoryDidAddItem, {url: toURL, name: toMetadata.name, itemType: toMetadata.itemType});
433
+ manager.postNotificationForURL(toParent, JSFileManager.Notification.directoryDidAddItem, {url: toURL, name: toURL.lastPathComponent, itemType: metadata.itemType});
425
434
  }catch (e){
426
435
  logger.error("Error posting notification: %{error}", e);
427
436
  }
428
- };
437
+ });
429
438
  }else{
430
439
  logger.info("could not create parent directory, aborting move transaction");
431
440
  transaction.abort();
@@ -443,6 +452,59 @@ JSClass("JSHTMLFileManager", JSFileManager, {
443
452
  return completion.promise;
444
453
  },
445
454
 
455
+ _moveItemInTransactionAtURL: function(transaction, url, toURL, toParent, metadata){
456
+ switch (metadata.itemType){
457
+ case JSFileManager.ItemType.directory:
458
+ this._moveDirectoryInTransactionAtURL(transaction, url, toURL, toParent, metadata);
459
+ break;
460
+ case JSFileManager.ItemType.file:
461
+ this._moveMetadataInTransactionAtURL(transaction, url, toURL, toParent, metadata);
462
+ break;
463
+ case JSFileManager.ItemType.symbolicLink:
464
+ this._moveMetadataInTransactionAtURL(transaction, url, toURL, toParent, metadata);
465
+ break;
466
+ }
467
+ },
468
+
469
+ _moveMetadataInTransactionAtURL: function(transaction, url, toURL, toParent, metadata){
470
+ var manager = this;
471
+ var copiedMetadata = JSCopy(metadata);
472
+ copiedMetadata.parent = toParent.path;
473
+ copiedMetadata.name = toURL.lastPathComponent;
474
+ transaction.metadata.put(copiedMetadata);
475
+ var lookup = [url.removingLastPathComponent().path, url.lastPathComponent];
476
+ var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataPath);
477
+ var keyRequest = index.getKey(lookup);
478
+ keyRequest.onsuccess = function JSFileManager_removeMetadata_onsuccess(e){
479
+ var key = e.target.result;
480
+ if (key !== undefined){
481
+ transaction.metadata.delete(key);
482
+ }
483
+ };
484
+ },
485
+
486
+ _moveDirectoryInTransactionAtURL: function(transaction, url, toURL, toParent, metadata){
487
+ this._moveMetadataInTransactionAtURL(transaction, url, toURL, toParent, metadata);
488
+ var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataParent);
489
+ var lookup = url.path;
490
+ var request = index.getAll(lookup);
491
+ var manager = this;
492
+ request.onsuccess = function JSFileManager_removeDirectory_onsuccess(e){
493
+ var results = e.target.result;
494
+ if (results){
495
+ var child;
496
+ var childURL;
497
+ var childToURL;
498
+ for (var i = 0, l = results.length; i < l; ++i){
499
+ child = results[i];
500
+ childURL = url.appendingPathComponent(child.name, child.itemType == JSFileManager.ItemType.directory);
501
+ childToURL = toURL.appendingPathComponent(child.name, child.itemType == JSFileManager.ItemType.directory);
502
+ manager._moveItemInTransactionAtURL(transaction, childURL, childToURL, toURL, child);
503
+ }
504
+ }
505
+ };
506
+ },
507
+
446
508
  copyItemAtURL: function(url, toURL, completion, target){
447
509
  if (!completion){
448
510
  completion = Promise.completion(Promise.resolveTrue);
@@ -470,7 +532,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
470
532
  if (url.path == toURL.path){
471
533
  throw new Error("JSFileManager.copyItemAtURL target and destination are the same");
472
534
  }
473
- var transaction = this.begin(JSFileManager.Permission.readwrite, [JSFileManager.Tables.metadata, JSFileManager.Tables.data]);
535
+ var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, [JSHTMLFileManager.Tables.metadata, JSHTMLFileManager.Tables.data]);
474
536
  transaction.addCompletion(completion, target);
475
537
  var toParent = toURL.removingLastPathComponent();
476
538
  var manager = this;
@@ -539,6 +601,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
539
601
  var manager = this;
540
602
  var copiedMetadata = JSCopy(metadata);
541
603
  copiedMetadata.parent = toParent.path;
604
+ copiedMetadata.name = toURL.lastPathComponent;
542
605
  var request = transaction.metadata.put(copiedMetadata);
543
606
  request.onsuccess = function JSFileManager_copyMetadata_onsuccess(){
544
607
  try{
@@ -551,7 +614,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
551
614
 
552
615
  _copyDirectoryInTransactionAtURL: function(transaction, url, toURL, toParent, metadata){
553
616
  this._copyMetadataInTransactionAtURL(transaction, url, toURL, toParent, metadata);
554
- var index = transaction.metadata.index(JSFileManager.Indexes.metadataParent);
617
+ var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataParent);
555
618
  var lookup = url.path;
556
619
  var request = index.getAll(lookup);
557
620
  var manager = this;
@@ -589,9 +652,9 @@ JSClass("JSHTMLFileManager", JSFileManager, {
589
652
  throw new Error("JSFileManager.removeItemAtURL cannot remove root path");
590
653
  }
591
654
  var parent = url.removingLastPathComponent();
592
- var transaction = this.begin(JSFileManager.Permission.readwrite, [JSFileManager.Tables.metadata, JSFileManager.Tables.data]);
655
+ var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, [JSHTMLFileManager.Tables.metadata, JSHTMLFileManager.Tables.data]);
593
656
  transaction.addCompletion(completion, target);
594
- var index = transaction.metadata.index(JSFileManager.Indexes.metadataPath);
657
+ var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataPath);
595
658
  var manager = this;
596
659
  this._metadataInTransactionAtURL(transaction, url, function JSFileManager_removeItem_metadata(metadata){
597
660
  if (metadata !== null){
@@ -626,7 +689,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
626
689
  _removeMetadataInTransactionAtURL: function(transaction, url, parent, metadata){
627
690
  var manager = this;
628
691
  var lookup = [parent.path, url.lastPathComponent];
629
- var index = transaction.metadata.index(JSFileManager.Indexes.metadataPath);
692
+ var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataPath);
630
693
  var keyRequest = index.getKey(lookup);
631
694
  keyRequest.onsuccess = function JSFileManager_removeMetadata_onsuccess(e){
632
695
  var key = e.target.result;
@@ -645,7 +708,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
645
708
 
646
709
  _removeDirectoryInTransactionAtURL: function(transaction, url, parent, metadata){
647
710
  this._removeMetadataInTransactionAtURL(transaction, url, parent, metadata);
648
- var index = transaction.metadata.index(JSFileManager.Indexes.metadataParent);
711
+ var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataParent);
649
712
  var lookup = url.path;
650
713
  var request = index.getAll(lookup);
651
714
  var manager = this;
@@ -677,7 +740,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
677
740
  if (url.scheme != JSFileManager.Scheme.jskitfile){
678
741
  throw new Error("JSFileManager.contentsAtURL unsupported scheme: %s".sprintf(url.scheme));
679
742
  }
680
- var transaction = this.begin(JSFileManager.Permission.readonly, [JSFileManager.Tables.metadata, JSFileManager.Tables.data]);
743
+ var transaction = this.begin(JSHTMLFileManager.Permission.readonly, [JSHTMLFileManager.Tables.metadata, JSHTMLFileManager.Tables.data]);
681
744
  var contents = null;
682
745
  var visitedURLSet = {};
683
746
  transaction.addCompletion(function JSFileManager_contents_completion(success){
@@ -737,9 +800,9 @@ JSClass("JSHTMLFileManager", JSFileManager, {
737
800
  if (url.scheme != JSFileManager.Scheme.jskitfile){
738
801
  throw new Error("JSFileManager.removeItemAtURL unsupported scheme: %s".sprintf(url.scheme));
739
802
  }
740
- var transaction = this.begin(JSFileManager.Permission.readwrite, [JSFileManager.Tables.metadata]);
803
+ var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, [JSHTMLFileManager.Tables.metadata]);
741
804
  transaction.addCompletion(completion, target);
742
- var index = transaction.metadata.index(JSFileManager.Indexes.metadataParent);
805
+ var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataParent);
743
806
  var lookup = url.path;
744
807
  var request = index.getAll(lookup);
745
808
  var manager = this;
@@ -792,7 +855,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
792
855
  if (url.isEqual(absoluteToURL)){
793
856
  throw new Error("JSFileManager.createSymbolicLinkAtURL target and destination are the same");
794
857
  }
795
- var transaction = this.begin(JSFileManager.Permission.readwrite, JSFileManager.Tables.metadata);
858
+ var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, JSHTMLFileManager.Tables.metadata);
796
859
  transaction.addCompletion(completion, target);
797
860
  var parent = url.removingLastPathComponent();
798
861
  var manager = this;
@@ -836,7 +899,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
836
899
  throw new Error("JSFileManager.attributesOfItemAtURL unsupported scheme: %s".sprintf(url.scheme));
837
900
  }
838
901
  var link = null;
839
- var transaction = this.begin(JSFileManager.Permission.read, JSFileManager.Tables.metadata);
902
+ var transaction = this.begin(JSHTMLFileManager.Permission.read, JSHTMLFileManager.Tables.metadata);
840
903
  transaction.addCompletion(function JSFileManager_destinationOfSymbolicLink_completion(success){
841
904
  completion.call(target, link);
842
905
  });
@@ -895,11 +958,11 @@ JSClass("JSHTMLFileManager", JSFileManager, {
895
958
  },
896
959
 
897
960
  _createCurrentVersion: function(){
898
- var metadata = this._db.createObjectStore(JSFileManager.Tables.metadata, {autoIncrement: true, keyPath: "id"});
961
+ var metadata = this._db.createObjectStore(JSHTMLFileManager.Tables.metadata, {autoIncrement: true, keyPath: "id"});
899
962
  var transaction = metadata.transaction;
900
- var pathIndex = metadata.createIndex(JSFileManager.Indexes.metadataPath, ["parent", "name"], {unique: true});
901
- var parentIndex = metadata.createIndex(JSFileManager.Indexes.metadataParent, "parent", {unique: false});
902
- var data = this._db.createObjectStore(JSFileManager.Tables.data, {autoIncrement: true});
963
+ var pathIndex = metadata.createIndex(JSHTMLFileManager.Indexes.metadataPath, ["parent", "name"], {unique: true});
964
+ var parentIndex = metadata.createIndex(JSHTMLFileManager.Indexes.metadataParent, "parent", {unique: false});
965
+ var data = this._db.createObjectStore(JSHTMLFileManager.Tables.data, {autoIncrement: true});
903
966
  var t = this.timestamp;
904
967
  var root = {parent: '', name: '/', itemType: JSFileManager.ItemType.directory, created: t, updated: t, added: t, size: 0};
905
968
  metadata.add(root);
@@ -911,9 +974,9 @@ JSClass("JSHTMLFileManager", JSFileManager, {
911
974
  });
912
975
 
913
976
 
914
- var JSFileManagerTransaction = function(db, storeName, permission){
977
+ var JSHTMLFileManagerTransaction = function(db, storeName, permission){
915
978
  if (this === undefined){
916
- return new JSFileManagerTransaction(db, storeName, permission);
979
+ return new JSHTMLFileManagerTransaction(db, storeName, permission);
917
980
  }
918
981
  this.indexedDBTransaction = db.transaction(storeName, permission);
919
982
  this.indexedDBTransaction.addEventListener('abort', this);
@@ -929,7 +992,7 @@ var JSFileManagerTransaction = function(db, storeName, permission){
929
992
  }
930
993
  };
931
994
 
932
- JSFileManagerTransaction.prototype = {
995
+ JSHTMLFileManagerTransaction.prototype = {
933
996
 
934
997
  addCompletion: function(completion, target){
935
998
  this.completion = completion;
@@ -991,21 +1054,21 @@ if (self){
991
1054
  indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
992
1055
  }
993
1056
 
994
- var CURRENT_DATABASE_VERSION = 1;
1057
+ var CURRENT_DATABASE_VERSION = 2;
995
1058
 
996
- JSFileManager.Tables = {
1059
+ JSHTMLFileManager.Tables = {
997
1060
  // {parent: "/some/path", name: "filename.txt", itemType: 1, created: 1234, modified: 1234, added: 1234, dataKey: 1234}
998
1061
  metadata: "metadata",
999
1062
  // Blob
1000
1063
  data: "data"
1001
1064
  };
1002
1065
 
1003
- JSFileManager.Indexes = {
1066
+ JSHTMLFileManager.Indexes = {
1004
1067
  metadataPath: "path",
1005
1068
  metadataParent: "parent"
1006
1069
  };
1007
1070
 
1008
- JSFileManager.Permission = {
1071
+ JSHTMLFileManager.Permission = {
1009
1072
  readonly: "readonly",
1010
1073
  readwrite: "readwrite"
1011
1074
  };
@@ -60,6 +60,13 @@ JSClass("JSNodeFileManager", JSFileManager, {
60
60
  });
61
61
  }
62
62
  this._rootURL = this.urlForPath(pathLib.join(process.cwd(), this._identifier), true);
63
+ var v1Path = this.pathForURL(this._rootURL.appendingPathComponent(this._identifier, true));
64
+ var v1Exists = fs.existsSync();
65
+ if (v1Exists){
66
+ var v2Path = this.pathForURL(this.persistentContainerURL);
67
+ logger.info("Moving persistentContainerURL from %{public} to %{public}", v1Path, v2Path);
68
+ fs.renameSync(v1Path, v2Path);
69
+ }
63
70
  completion.call(target, JSFileManager.State.success);
64
71
  return completion.promise;
65
72
  },
@@ -115,7 +122,7 @@ JSClass("JSNodeFileManager", JSFileManager, {
115
122
  },
116
123
 
117
124
  _getPersistentContainerURL: function(){
118
- return this._rootURL.appendingPathComponent(this._identifier, true);
125
+ return this._rootURL.appendingPathComponents(["Containers", JSBundle.mainBundleIdentifier], true);
119
126
  },
120
127
 
121
128
  // --------------------------------------------------------------------
@@ -194,7 +194,6 @@ JSClass("JSUserDefaults", JSObject, {
194
194
  }
195
195
  }else{
196
196
  var data = JSON.stringify(this._values).utf8();
197
- logger.info("saving user defaults");
198
197
  this._fileManager.createFileAtURL(this._url, data, function JSUserDefaults_persist_createFile(success){
199
198
  if (!success){
200
199
  logger.error("failed to write user defaults");
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ImageKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.MediaKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.MediaKitUI
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.NotificationKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2021 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.PDFKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.QRKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.SearchKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.SecurityKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ServerKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ServerKitTesting
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.TestKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.UIKit
3
- JSBundleVersion: 2023.11.0
3
+ JSBundleVersion: 2023.12.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -234,7 +234,8 @@ UIAccessibility.Notification = {
234
234
  rowCollapsed: "UIAccessibility.Notification.rowCollapsed",
235
235
  selectedChildrenChanged: "UIAccessibility.Notification.selectedChildrenChanged",
236
236
  selectedTextChanged: "UIAccessibility.Notification.selectedTextChanged",
237
- titleChanged: "UIAccessibility.Notification.titleChanged",
237
+ labelChanged: "UIAccessibility.Notification.labelChanged",
238
+ titleChanged: "UIAccessibility.Notification.labelChanged",
238
239
  valueChanged: "UIAccessibility.Notification.valueChanged",
239
240
  visibilityChanged: "UIAccessibility.Notification.visibilityChanged",
240
241
  enabledChanged: "UIAccessibility.Notification.enabledChanged",