@harperfast/harper 5.2.0-beta.1 → 5.2.0-beta.2

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 (137) hide show
  1. package/bin/cliOperations.ts +76 -12
  2. package/bin/run.ts +10 -0
  3. package/bin/status.ts +1 -1
  4. package/components/Application.ts +146 -83
  5. package/components/Scope.ts +4 -0
  6. package/components/componentLoader.ts +7 -0
  7. package/components/operations.js +21 -1
  8. package/config/configUtils.ts +139 -5
  9. package/config-app.schema.json +70 -0
  10. package/dist/bin/cliOperations.js +76 -12
  11. package/dist/bin/cliOperations.js.map +1 -1
  12. package/dist/bin/run.js +9 -0
  13. package/dist/bin/run.js.map +1 -1
  14. package/dist/bin/status.js +1 -1
  15. package/dist/bin/status.js.map +1 -1
  16. package/dist/components/Application.d.ts +12 -5
  17. package/dist/components/Application.js +121 -60
  18. package/dist/components/Application.js.map +1 -1
  19. package/dist/components/Scope.d.ts +1 -0
  20. package/dist/components/Scope.js +4 -0
  21. package/dist/components/Scope.js.map +1 -1
  22. package/dist/components/componentLoader.js +7 -0
  23. package/dist/components/componentLoader.js.map +1 -1
  24. package/dist/components/operations.js +20 -1
  25. package/dist/components/operations.js.map +1 -1
  26. package/dist/config/configUtils.d.ts +31 -0
  27. package/dist/config/configUtils.js +127 -5
  28. package/dist/config/configUtils.js.map +1 -1
  29. package/dist/resources/DatabaseTransaction.d.ts +12 -0
  30. package/dist/resources/DatabaseTransaction.js +97 -0
  31. package/dist/resources/DatabaseTransaction.js.map +1 -1
  32. package/dist/resources/RequestTarget.js +13 -3
  33. package/dist/resources/RequestTarget.js.map +1 -1
  34. package/dist/resources/Resource.js +16 -0
  35. package/dist/resources/Resource.js.map +1 -1
  36. package/dist/resources/Table.js +35 -2
  37. package/dist/resources/Table.js.map +1 -1
  38. package/dist/resources/analytics/metadata.d.ts +3 -0
  39. package/dist/resources/analytics/metadata.js +3 -0
  40. package/dist/resources/analytics/metadata.js.map +1 -1
  41. package/dist/resources/analytics/write.js +22 -0
  42. package/dist/resources/analytics/write.js.map +1 -1
  43. package/dist/resources/defineResource.js +20 -7
  44. package/dist/resources/defineResource.js.map +1 -1
  45. package/dist/resources/jsResource.d.ts +24 -0
  46. package/dist/resources/jsResource.js +58 -2
  47. package/dist/resources/jsResource.js.map +1 -1
  48. package/dist/resources/openApi.js +45 -20
  49. package/dist/resources/openApi.js.map +1 -1
  50. package/dist/resources/scheduler/CronExpression.d.ts +71 -0
  51. package/dist/resources/scheduler/CronExpression.js +367 -0
  52. package/dist/resources/scheduler/CronExpression.js.map +1 -0
  53. package/dist/resources/scheduler/engine.d.ts +91 -0
  54. package/dist/resources/scheduler/engine.js +767 -0
  55. package/dist/resources/scheduler/engine.js.map +1 -0
  56. package/dist/resources/scheduler/scheduler.d.ts +33 -0
  57. package/dist/resources/scheduler/scheduler.js +200 -0
  58. package/dist/resources/scheduler/scheduler.js.map +1 -0
  59. package/dist/security/auth.js +1 -0
  60. package/dist/security/auth.js.map +1 -1
  61. package/dist/security/jsLoader.js +8 -0
  62. package/dist/security/jsLoader.js.map +1 -1
  63. package/dist/security/keys.d.ts +32 -0
  64. package/dist/security/keys.js +147 -0
  65. package/dist/security/keys.js.map +1 -1
  66. package/dist/server/REST.js +67 -1
  67. package/dist/server/REST.js.map +1 -1
  68. package/dist/server/Server.d.ts +6 -0
  69. package/dist/server/Server.js.map +1 -1
  70. package/dist/server/http.d.ts +2 -0
  71. package/dist/server/http.js +139 -14
  72. package/dist/server/http.js.map +1 -1
  73. package/dist/server/operationsServer.js +3 -3
  74. package/dist/server/operationsServer.js.map +1 -1
  75. package/dist/server/serverHelpers/progressEmitter.js +5 -1
  76. package/dist/server/serverHelpers/progressEmitter.js.map +1 -1
  77. package/dist/server/threads/threadServer.js +9 -5
  78. package/dist/server/threads/threadServer.js.map +1 -1
  79. package/dist/utility/common_utils.js +25 -0
  80. package/dist/utility/common_utils.js.map +1 -1
  81. package/dist/utility/install/installer.d.ts +9 -1
  82. package/dist/utility/install/installer.js +21 -0
  83. package/dist/utility/install/installer.js.map +1 -1
  84. package/dist/validation/configValidator.js +3 -0
  85. package/dist/validation/configValidator.js.map +1 -1
  86. package/npm-shrinkwrap.json +272 -230
  87. package/package.json +3 -3
  88. package/resources/DESIGN.md +1 -1
  89. package/resources/DatabaseTransaction.ts +95 -0
  90. package/resources/RequestTarget.ts +12 -3
  91. package/resources/Resource.ts +18 -0
  92. package/resources/Table.ts +34 -3
  93. package/resources/analytics/metadata.ts +3 -0
  94. package/resources/analytics/write.ts +23 -0
  95. package/resources/defineResource.ts +17 -4
  96. package/resources/jsResource.ts +61 -2
  97. package/resources/openApi.ts +44 -19
  98. package/resources/scheduler/CronExpression.ts +394 -0
  99. package/resources/scheduler/engine.ts +812 -0
  100. package/resources/scheduler/scheduler.ts +236 -0
  101. package/security/auth.ts +1 -0
  102. package/security/jsLoader.ts +8 -0
  103. package/security/keys.ts +152 -0
  104. package/server/REST.ts +70 -1
  105. package/server/Server.ts +6 -0
  106. package/server/http.ts +122 -15
  107. package/server/operationsServer.ts +5 -3
  108. package/server/serverHelpers/progressEmitter.ts +5 -1
  109. package/server/threads/threadServer.js +9 -5
  110. package/studio/web/assets/{Chat-BZks8dVF.js → Chat-DHP4XpID.js} +2 -2
  111. package/studio/web/assets/{Chat-BZks8dVF.js.map → Chat-DHP4XpID.js.map} +1 -1
  112. package/studio/web/assets/{FloatingChat-Dic8paVO.js → FloatingChat-CJ7PssCv.js} +4 -4
  113. package/studio/web/assets/{FloatingChat-Dic8paVO.js.map → FloatingChat-CJ7PssCv.js.map} +1 -1
  114. package/studio/web/assets/{applications-uOXkeUIN.js → applications-DxXiGpsR.js} +2 -2
  115. package/studio/web/assets/{applications-uOXkeUIN.js.map → applications-DxXiGpsR.js.map} +1 -1
  116. package/studio/web/assets/{index-i-2wrKhv.js → index-BdbBanDP.js} +6 -6
  117. package/studio/web/assets/{index-i-2wrKhv.js.map → index-BdbBanDP.js.map} +1 -1
  118. package/studio/web/assets/{index.lazy-Csk8eCoB.js → index.lazy-B2eH28zD.js} +4 -4
  119. package/studio/web/assets/{index.lazy-Csk8eCoB.js.map → index.lazy-B2eH28zD.js.map} +1 -1
  120. package/studio/web/assets/{profile-Sb3mGDl6.js → profile-DK5hgucv.js} +2 -2
  121. package/studio/web/assets/{profile-Sb3mGDl6.js.map → profile-DK5hgucv.js.map} +1 -1
  122. package/studio/web/assets/{setComponentFile-BgZcaPJ2.js → setComponentFile-BVDWRYxx.js} +2 -2
  123. package/studio/web/assets/{setComponentFile-BgZcaPJ2.js.map → setComponentFile-BVDWRYxx.js.map} +1 -1
  124. package/studio/web/assets/{setup-DKtlLgmT.js → setup-DJ9BInoK.js} +2 -2
  125. package/studio/web/assets/{setup-DKtlLgmT.js.map → setup-DJ9BInoK.js.map} +1 -1
  126. package/studio/web/assets/{status-B45iLeug.js → status-B_qzmgfD.js} +2 -2
  127. package/studio/web/assets/{status-B45iLeug.js.map → status-B_qzmgfD.js.map} +1 -1
  128. package/studio/web/assets/{swagger-ui-react-Csu4026e.js → swagger-ui-react-DOL5jCqg.js} +2 -2
  129. package/studio/web/assets/{swagger-ui-react-Csu4026e.js.map → swagger-ui-react-DOL5jCqg.js.map} +1 -1
  130. package/studio/web/assets/{tsMode-DVgxUr_l.js → tsMode-DpxUxfTW.js} +2 -2
  131. package/studio/web/assets/{tsMode-DVgxUr_l.js.map → tsMode-DpxUxfTW.js.map} +1 -1
  132. package/studio/web/assets/{useEntityRestURL-yfDQMV1f.js → useEntityRestURL-CU_lY6XW.js} +2 -2
  133. package/studio/web/assets/{useEntityRestURL-yfDQMV1f.js.map → useEntityRestURL-CU_lY6XW.js.map} +1 -1
  134. package/studio/web/index.html +1 -1
  135. package/utility/common_utils.ts +26 -0
  136. package/utility/install/installer.ts +26 -1
  137. package/validation/configValidator.ts +3 -0
@@ -1168,7 +1168,7 @@ function makeTable(options) {
1168
1168
  // go back to the static search method so it gets a chance to override
1169
1169
  return constructor.search(target, this.getContext());
1170
1170
  }
1171
- if (target && target.id === undefined && !target.toString()) {
1171
+ if (target && target.id == null && !target.toString()) {
1172
1172
  const description = {
1173
1173
  // basically a describe call
1174
1174
  records: './', // an href to the records themselves
@@ -1986,7 +1986,10 @@ function makeTable(options) {
1986
1986
  let residencyId;
1987
1987
  if (options?.residencyId != undefined)
1988
1988
  residencyId = options.residencyId;
1989
- const expiresAt = options?.expiresAt ?? context?.expiresAt ?? (expirationMs ? expirationMs + Date.now() : -1);
1989
+ // options/context expiresAt are the most specific overrides; a record @expiresAt field
1990
+ // (resolved below, once recordToStore is merged) overrides the table default in both
1991
+ // directions; the table default is the final fallback. -1 means no expiration.
1992
+ let expiresAt = options?.expiresAt ?? context?.expiresAt;
1990
1993
  const additionalAuditRefs = []; // track additional audit refs to store
1991
1994
  // Bulk base-copy snapshot apply: store current-state directly with no audit/transaction-log entry
1992
1995
  // and no out-of-order resequencing/dedup (the source of the O(n) keyed-lookup spin in
@@ -2354,6 +2357,36 @@ function makeTable(options) {
2354
2357
  }
2355
2358
  residencyId = getResidencyId(residency);
2356
2359
  }
2360
+ if (expiresAt == undefined) {
2361
+ // A schema @expiresAt attribute makes the record field authoritative over the table
2362
+ // default, in both directions: stamp it into the stored expiry metadata that governs
2363
+ // read-hiding and the cleanup sweep, not just the separate index-pruning sweep (which
2364
+ // only removes already-past records and so can never extend past the table default).
2365
+ // Read from recordToStore so the metadata matches exactly what the pruning sweep later
2366
+ // reads back. Falls back to the table default when the field is unset or not a timestamp.
2367
+ const fieldExpiresAt = expiresAtProperty ? recordToStore?.[expiresAtProperty.name] : undefined;
2368
+ // Coerce only genuine timestamp shapes: a number/bigint epoch, a Date, or a numeric/ISO
2369
+ // string. Booleans, empty/whitespace strings, and null/undefined fall through to NaN so a
2370
+ // nonsensical field value uses the table default rather than expiring the record at epoch 0.
2371
+ let fieldExpiresAtMs = NaN;
2372
+ if (typeof fieldExpiresAt === 'number' || typeof fieldExpiresAt === 'bigint')
2373
+ fieldExpiresAtMs = Number(fieldExpiresAt);
2374
+ else if (fieldExpiresAt instanceof Date)
2375
+ fieldExpiresAtMs = fieldExpiresAt.getTime();
2376
+ else if (typeof fieldExpiresAt === 'string' && fieldExpiresAt.trim() !== '') {
2377
+ const numeric = Number(fieldExpiresAt);
2378
+ fieldExpiresAtMs = Number.isFinite(numeric) ? numeric : Date.parse(fieldExpiresAt);
2379
+ }
2380
+ // Only a finite, non-negative epoch counts: negatives collide with the -1 "no expiration"
2381
+ // sentinel (the encoder omits HAS_EXPIRATION for <0, but the field sweep would still evict a
2382
+ // negative field value), so treat a negative/NaN field as unset and use the table default.
2383
+ expiresAt =
2384
+ Number.isFinite(fieldExpiresAtMs) && fieldExpiresAtMs >= 0
2385
+ ? fieldExpiresAtMs
2386
+ : expirationMs
2387
+ ? expirationMs + Date.now()
2388
+ : -1;
2389
+ }
2357
2390
  if (!fullUpdate) {
2358
2391
  // we use our own data as the basis for the audit record, which will include information about the incremental updates, even if it was overwritten by CRDT resolution
2359
2392
  auditRecordToStore = recordUpdate;