velocious 1.0.470 → 1.0.472

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 (83) hide show
  1. package/README.md +5 -3
  2. package/build/configuration-types.js +1 -0
  3. package/build/configuration.js +27 -1
  4. package/build/controller.js +13 -1
  5. package/build/database/datetime-storage.js +49 -5
  6. package/build/database/record/index.js +14 -4
  7. package/build/environment-handlers/base.js +46 -0
  8. package/build/environment-handlers/node/cli/commands/generate/base-models.js +4 -1
  9. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +368 -43
  10. package/build/environment-handlers/node/cli/commands/generate/generated-file-banner.js +15 -0
  11. package/build/environment-handlers/node.js +84 -8
  12. package/build/frontend-model-controller.js +7 -7
  13. package/build/frontend-models/base.js +75 -9
  14. package/build/frontend-models/transport-serialization.js +41 -8
  15. package/build/frontend-models/websocket-channel.js +18 -1
  16. package/build/frontend-models/websocket-publishers.js +12 -1
  17. package/build/http-server/client/request-runner.js +13 -1
  18. package/build/src/configuration-types.d.ts +5 -0
  19. package/build/src/configuration-types.d.ts.map +1 -1
  20. package/build/src/configuration-types.js +2 -1
  21. package/build/src/configuration.d.ts +14 -1
  22. package/build/src/configuration.d.ts.map +1 -1
  23. package/build/src/configuration.js +25 -2
  24. package/build/src/controller.d.ts +5 -0
  25. package/build/src/controller.d.ts.map +1 -1
  26. package/build/src/controller.js +12 -2
  27. package/build/src/database/datetime-storage.d.ts +12 -4
  28. package/build/src/database/datetime-storage.d.ts.map +1 -1
  29. package/build/src/database/datetime-storage.js +48 -6
  30. package/build/src/database/record/index.d.ts +5 -0
  31. package/build/src/database/record/index.d.ts.map +1 -1
  32. package/build/src/database/record/index.js +13 -5
  33. package/build/src/environment-handlers/base.d.ts +19 -0
  34. package/build/src/environment-handlers/base.d.ts.map +1 -1
  35. package/build/src/environment-handlers/base.js +41 -1
  36. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  37. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +4 -2
  38. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +219 -40
  39. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  40. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +317 -43
  41. package/build/src/environment-handlers/node/cli/commands/generate/generated-file-banner.d.ts +9 -0
  42. package/build/src/environment-handlers/node/cli/commands/generate/generated-file-banner.d.ts.map +1 -0
  43. package/build/src/environment-handlers/node/cli/commands/generate/generated-file-banner.js +13 -0
  44. package/build/src/environment-handlers/node.d.ts +1 -0
  45. package/build/src/environment-handlers/node.d.ts.map +1 -1
  46. package/build/src/environment-handlers/node.js +76 -9
  47. package/build/src/frontend-model-controller.js +8 -8
  48. package/build/src/frontend-models/base.d.ts +4 -0
  49. package/build/src/frontend-models/base.d.ts.map +1 -1
  50. package/build/src/frontend-models/base.js +64 -9
  51. package/build/src/frontend-models/transport-serialization.d.ts +30 -1
  52. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  53. package/build/src/frontend-models/transport-serialization.js +34 -9
  54. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  55. package/build/src/frontend-models/websocket-channel.js +16 -2
  56. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  57. package/build/src/frontend-models/websocket-publishers.js +12 -2
  58. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  59. package/build/src/http-server/client/request-runner.js +13 -2
  60. package/build/src/time-zone.d.ts +16 -0
  61. package/build/src/time-zone.d.ts.map +1 -0
  62. package/build/src/time-zone.js +56 -0
  63. package/build/time-zone.js +65 -0
  64. package/build/tsconfig.tsbuildinfo +1 -1
  65. package/package.json +2 -1
  66. package/scripts/test-browser.js +1 -0
  67. package/src/configuration-types.js +1 -0
  68. package/src/configuration.js +27 -1
  69. package/src/controller.js +13 -1
  70. package/src/database/datetime-storage.js +49 -5
  71. package/src/database/record/index.js +14 -4
  72. package/src/environment-handlers/base.js +46 -0
  73. package/src/environment-handlers/node/cli/commands/generate/base-models.js +4 -1
  74. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +368 -43
  75. package/src/environment-handlers/node/cli/commands/generate/generated-file-banner.js +15 -0
  76. package/src/environment-handlers/node.js +84 -8
  77. package/src/frontend-model-controller.js +7 -7
  78. package/src/frontend-models/base.js +75 -9
  79. package/src/frontend-models/transport-serialization.js +41 -8
  80. package/src/frontend-models/websocket-channel.js +18 -1
  81. package/src/frontend-models/websocket-publishers.js +12 -1
  82. package/src/http-server/client/request-runner.js +13 -1
  83. package/src/time-zone.js +65 -0
@@ -0,0 +1,65 @@
1
+ // @ts-check
2
+
3
+ import {Temporal} from "@js-temporal/polyfill"
4
+
5
+ export const REQUEST_TIME_ZONE_HEADER = "X-Velocious-Time-Zone"
6
+
7
+ const timezoneOffsetPattern = /^[+-]\d{2}:\d{2}$/
8
+
9
+ /**
10
+ * Validates a configured or client-provided IANA timezone.
11
+ * @param {string} timeZone - Timezone identifier.
12
+ * @param {string} label - Error label.
13
+ * @returns {string} - Normalized timezone identifier.
14
+ */
15
+ export function validateTimeZone(timeZone, label = "timeZone") {
16
+ if (typeof timeZone !== "string") {
17
+ throw new Error(`Expected ${label} to be a timezone string`)
18
+ }
19
+
20
+ const normalizedTimeZone = timeZone.trim()
21
+
22
+ if (!normalizedTimeZone) {
23
+ throw new Error(`Expected ${label} to be a timezone string`)
24
+ }
25
+
26
+ if (timezoneOffsetPattern.test(normalizedTimeZone)) {
27
+ throw new Error(`Expected ${label} to be an IANA timezone string, not offset "${normalizedTimeZone}"`)
28
+ }
29
+
30
+ try {
31
+ Temporal.ZonedDateTime.from({
32
+ day: 1,
33
+ hour: 0,
34
+ microsecond: 0,
35
+ millisecond: 0,
36
+ minute: 0,
37
+ month: 1,
38
+ nanosecond: 0,
39
+ second: 0,
40
+ timeZone: normalizedTimeZone,
41
+ year: 2000
42
+ })
43
+ } catch (error) {
44
+ throw new Error(`Invalid timezone "${normalizedTimeZone}" for ${label}`, {cause: error})
45
+ }
46
+
47
+ return normalizedTimeZone
48
+ }
49
+
50
+ /**
51
+ * Formats a Date as an ISO timestamp in the given timezone.
52
+ * @param {Date} value - Date instant.
53
+ * @param {string} timeZone - IANA timezone identifier.
54
+ * @returns {string} - ISO timestamp carrying the timezone's offset for the instant.
55
+ */
56
+ export function formatDateInTimeZone(value, timeZone) {
57
+ const normalizedTimeZone = validateTimeZone(timeZone, "timeZone")
58
+ const instant = Temporal.Instant.fromEpochMilliseconds(value.getTime())
59
+ const zonedDateTime = instant.toZonedDateTimeISO(normalizedTimeZone)
60
+
61
+ return zonedDateTime.toString({
62
+ fractionalSecondDigits: 3,
63
+ timeZoneName: "never"
64
+ })
65
+ }