@happyvertical/smrt-events 0.55.6 → 0.55.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.
@@ -3,12 +3,12 @@
3
3
  "sensitiveFieldsExcluded": true,
4
4
  "generatedAt": "1970-01-01T00:00:00.000Z",
5
5
  "packageName": "@happyvertical/smrt-events",
6
- "packageVersion": "0.55.6",
6
+ "packageVersion": "0.55.8",
7
7
  "sourceManifestPath": "dist/manifest.json",
8
8
  "agentDocPath": "AGENTS.md",
9
9
  "sourceHashes": {
10
- "manifest": "227f731505a41fa6038dbe1b314e58665166266e46463538f502247704dd8f0d",
11
- "packageJson": "55a0204a7f4311901d6a3e2b2b1faf75c12b33748efd5926d1132e721975d47d",
10
+ "manifest": "52a6a3c16c1e1011a0b63607b416cb93113b33d228240f8c649a42d46814d7bb",
11
+ "packageJson": "fca5791ba7c76ce146aa777eceaf3c482234cdb6a0283f22567a81f2320a911c",
12
12
  "agents": "fd92563513c75d3b1f4107a239a7030bbcb8ac45e0e13e87afdbbebc84b0d4be"
13
13
  },
14
14
  "exports": [
@@ -1667,53 +1667,61 @@
1667
1667
  "type": "text",
1668
1668
  "required": false,
1669
1669
  "columnType": "TEXT",
1670
- "default": ""
1670
+ "default": "",
1671
+ "description": "What the event is called."
1671
1672
  },
1672
1673
  {
1673
1674
  "name": "seriesId",
1674
1675
  "type": "foreignKey",
1675
1676
  "required": false,
1676
1677
  "related": "EventSeries",
1677
- "columnType": "UUID"
1678
+ "columnType": "UUID",
1679
+ "description": "The series this event is part of, if any."
1678
1680
  },
1679
1681
  {
1680
1682
  "name": "typeId",
1681
1683
  "type": "foreignKey",
1682
1684
  "required": false,
1683
1685
  "related": "EventType",
1684
- "columnType": "UUID"
1686
+ "columnType": "UUID",
1687
+ "description": "The kind of event."
1685
1688
  },
1686
1689
  {
1687
1690
  "name": "placeId",
1688
1691
  "type": "crossPackageRef",
1689
1692
  "required": false,
1690
1693
  "related": "@happyvertical/smrt-places:Place",
1691
- "columnType": "UUID"
1694
+ "columnType": "UUID",
1695
+ "description": "Where it takes place."
1692
1696
  },
1693
1697
  {
1694
1698
  "name": "description",
1695
1699
  "type": "text",
1696
1700
  "required": false,
1697
- "columnType": "TEXT"
1701
+ "columnType": "TEXT",
1702
+ "description": "What the event is about."
1698
1703
  },
1699
1704
  {
1700
1705
  "name": "startDate",
1701
1706
  "type": "datetime",
1702
1707
  "required": false,
1703
- "columnType": "TIMESTAMP"
1708
+ "columnType": "TIMESTAMP",
1709
+ "description": "When it starts."
1704
1710
  },
1705
1711
  {
1706
1712
  "name": "endDate",
1707
1713
  "type": "datetime",
1708
1714
  "required": false,
1709
- "columnType": "TIMESTAMP"
1715
+ "columnType": "TIMESTAMP",
1716
+ "description": "When it ends."
1710
1717
  },
1711
1718
  {
1712
1719
  "name": "allDay",
1713
1720
  "type": "boolean",
1714
1721
  "required": false,
1715
1722
  "columnType": "BOOLEAN",
1716
- "default": false
1723
+ "default": false,
1724
+ "description": "Whether the event lasts all day."
1717
1725
  },
1718
1726
  {
1719
1727
  "name": "timeZone",
@@ -1726,7 +1734,8 @@
1726
1734
  "type": "text",
1727
1735
  "required": false,
1728
1736
  "columnType": "TEXT",
1729
- "default": "scheduled"
1737
+ "default": "scheduled",
1738
+ "description": "scheduled, in progress, completed, cancelled or postponed."
1730
1739
  },
1731
1740
  {
1732
1741
  "name": "round",
@@ -2414,21 +2423,24 @@
2414
2423
  "type": "foreignKey",
2415
2424
  "required": false,
2416
2425
  "related": "Event",
2417
- "columnType": "UUID"
2426
+ "columnType": "UUID",
2427
+ "description": "The event the person takes part in."
2418
2428
  },
2419
2429
  {
2420
2430
  "name": "profileId",
2421
2431
  "type": "crossPackageRef",
2422
2432
  "required": false,
2423
2433
  "related": "@happyvertical/smrt-profiles:Profile",
2424
- "columnType": "UUID"
2434
+ "columnType": "UUID",
2435
+ "description": "The person taking part."
2425
2436
  },
2426
2437
  {
2427
2438
  "name": "role",
2428
2439
  "type": "text",
2429
2440
  "required": false,
2430
2441
  "columnType": "TEXT",
2431
- "default": ""
2442
+ "default": "",
2443
+ "description": "What they do there, for example speaker or attendee."
2432
2444
  },
2433
2445
  {
2434
2446
  "name": "placement",
@@ -2794,45 +2806,52 @@
2794
2806
  "type": "text",
2795
2807
  "required": false,
2796
2808
  "columnType": "TEXT",
2797
- "default": ""
2809
+ "default": "",
2810
+ "description": "What the series is called."
2798
2811
  },
2799
2812
  {
2800
2813
  "name": "typeId",
2801
2814
  "type": "foreignKey",
2802
2815
  "required": false,
2803
2816
  "related": "EventType",
2804
- "columnType": "UUID"
2817
+ "columnType": "UUID",
2818
+ "description": "The kind of event in this series."
2805
2819
  },
2806
2820
  {
2807
2821
  "name": "organizerId",
2808
2822
  "type": "crossPackageRef",
2809
2823
  "required": false,
2810
2824
  "related": "@happyvertical/smrt-profiles:Profile",
2811
- "columnType": "UUID"
2825
+ "columnType": "UUID",
2826
+ "description": "Who runs the series."
2812
2827
  },
2813
2828
  {
2814
2829
  "name": "description",
2815
2830
  "type": "text",
2816
2831
  "required": false,
2817
- "columnType": "TEXT"
2832
+ "columnType": "TEXT",
2833
+ "description": "What the series is about."
2818
2834
  },
2819
2835
  {
2820
2836
  "name": "startDate",
2821
2837
  "type": "datetime",
2822
2838
  "required": false,
2823
- "columnType": "TIMESTAMP"
2839
+ "columnType": "TIMESTAMP",
2840
+ "description": "When the series begins."
2824
2841
  },
2825
2842
  {
2826
2843
  "name": "endDate",
2827
2844
  "type": "datetime",
2828
2845
  "required": false,
2829
- "columnType": "TIMESTAMP"
2846
+ "columnType": "TIMESTAMP",
2847
+ "description": "When the series ends."
2830
2848
  },
2831
2849
  {
2832
2850
  "name": "recurrence",
2833
2851
  "type": "text",
2834
2852
  "required": false,
2835
- "columnType": "TEXT"
2853
+ "columnType": "TEXT",
2854
+ "description": "How often it repeats."
2836
2855
  },
2837
2856
  {
2838
2857
  "name": "metadata",
@@ -3232,14 +3251,16 @@
3232
3251
  "type": "text",
3233
3252
  "required": true,
3234
3253
  "columnType": "TEXT",
3235
- "default": ""
3254
+ "default": "",
3255
+ "description": "What this kind of event is called, for example workshop."
3236
3256
  },
3237
3257
  {
3238
3258
  "name": "description",
3239
3259
  "type": "text",
3240
3260
  "required": false,
3241
3261
  "columnType": "TEXT",
3242
- "default": ""
3262
+ "default": "",
3263
+ "description": "What this kind of event is for."
3243
3264
  },
3244
3265
  {
3245
3266
  "name": "schema",
@@ -5024,5 +5045,161 @@
5024
5045
  "polymorphicAssociations": 0,
5025
5046
  "uuidColumns": 40
5026
5047
  },
5027
- "agentDoc": "# @happyvertical/smrt-events\n\nInfinite-nesting event hierarchy with series, types, participants, and role/placement management.\n\n## Models\n\n- **Event** (STI, extends `SmrtHierarchical`): self-referencing parent-child via `parentId` (UUID). Links to `seriesId`, `typeId`, `placeId`. Status: scheduled/in_progress/completed/cancelled/postponed. Hierarchy traversal (`getParent()`, `getChildren()`, `getAncestors()`, `getDescendants()`, `getHierarchy()`, `moveTo()`) is provided by `SmrtHierarchical`; `getRootEvent()` and `isRoot()` remain on `Event`.\n- **EventAsset**: dedicated owned-asset join in `event_assets` with `relationship` and `sortOrder`.\n- **EventType**: classification with JSON schema for custom fields per type.\n- **Event.allDay / Event.timeZone**: whole-day flag (`endDate` is the exclusive midnight after the last day) and IANA zone (empty = inherit). Manifest fields; consumers migrate with `db:migrate`.\n- **EventSeries**: recurrence patterns (daily/weekly/monthly/yearly). `expandRecurrence()` (`src/recurrence.ts`) / `EventSeries.getOccurrences()` expand them into instants, keeping the start's wall-clock time in the zone. Do all date math on calendar dates and convert through `Intl` at the end — never `Date#setDate`/`getDay` on host-local time (tests pin `TZ=UTC`, so host leaks only show in production).\n- **EventParticipant**: junction with `role` (home/away/speaker/panelist/etc.), `placement` (numeric — team ordering and rankings), `groupId` (team grouping within event). `conflictColumns: ['event_id', 'profile_id', 'role']`.\n\n## Gotchas\n\n- **No depth limit** on event hierarchy — deep nesting can cause N+1 queries\n- **Placement is numeric**: used for both team ordering (0=home, 1=away) and rankings — context-dependent\n- **GroupId not enforced at DB level**: for logical grouping only (e.g., team members in a game)\n- **Optional tenancy** with nullable tenantId\n- **Event physical foreign keys**: `parentId`, `seriesId`, and `typeId` retain\n PostgreSQL/SQLite constraints. DuckDB/JSON omit only those explicitly scoped\n physical constraints because DuckDB cannot enforce Event's self-reference or\n generated `ON UPDATE CASCADE`; UUID fields, indexes, relationship loading,\n and application-side delete enforcement remain active on every engine.\n- **Metadata stored as JSON string** with get/set/update helpers\n- **Owned asset helpers**: use `Event.getAssets()` / `addAsset()` / `removeAsset()` or the matching `EventCollection` wrappers instead of generic `AssetAssociation`\n"
5048
+ "agentDoc": "# @happyvertical/smrt-events\n\nInfinite-nesting event hierarchy with series, types, participants, and role/placement management.\n\n## Models\n\n- **Event** (STI, extends `SmrtHierarchical`): self-referencing parent-child via `parentId` (UUID). Links to `seriesId`, `typeId`, `placeId`. Status: scheduled/in_progress/completed/cancelled/postponed. Hierarchy traversal (`getParent()`, `getChildren()`, `getAncestors()`, `getDescendants()`, `getHierarchy()`, `moveTo()`) is provided by `SmrtHierarchical`; `getRootEvent()` and `isRoot()` remain on `Event`.\n- **EventAsset**: dedicated owned-asset join in `event_assets` with `relationship` and `sortOrder`.\n- **EventType**: classification with JSON schema for custom fields per type.\n- **Event.allDay / Event.timeZone**: whole-day flag (`endDate` is the exclusive midnight after the last day) and IANA zone (empty = inherit). Manifest fields; consumers migrate with `db:migrate`.\n- **EventSeries**: recurrence patterns (daily/weekly/monthly/yearly). `expandRecurrence()` (`src/recurrence.ts`) / `EventSeries.getOccurrences()` expand them into instants, keeping the start's wall-clock time in the zone. Do all date math on calendar dates and convert through `Intl` at the end — never `Date#setDate`/`getDay` on host-local time (tests pin `TZ=UTC`, so host leaks only show in production).\n- **EventParticipant**: junction with `role` (home/away/speaker/panelist/etc.), `placement` (numeric — team ordering and rankings), `groupId` (team grouping within event). `conflictColumns: ['event_id', 'profile_id', 'role']`.\n\n## Gotchas\n\n- **No depth limit** on event hierarchy — deep nesting can cause N+1 queries\n- **Placement is numeric**: used for both team ordering (0=home, 1=away) and rankings — context-dependent\n- **GroupId not enforced at DB level**: for logical grouping only (e.g., team members in a game)\n- **Optional tenancy** with nullable tenantId\n- **Event physical foreign keys**: `parentId`, `seriesId`, and `typeId` retain\n PostgreSQL/SQLite constraints. DuckDB/JSON omit only those explicitly scoped\n physical constraints because DuckDB cannot enforce Event's self-reference or\n generated `ON UPDATE CASCADE`; UUID fields, indexes, relationship loading,\n and application-side delete enforcement remain active on every engine.\n- **Metadata stored as JSON string** with get/set/update helpers\n- **Owned asset helpers**: use `Event.getAssets()` / `addAsset()` / `removeAsset()` or the matching `EventCollection` wrappers instead of generic `AssetAssociation`\n",
5049
+ "recipes": [
5050
+ {
5051
+ "id": "events.calendar",
5052
+ "className": "CalendarRecipe",
5053
+ "label": "Events",
5054
+ "summary": "Schedule events, group them in series and track who takes part.",
5055
+ "synonyms": [
5056
+ "calendar",
5057
+ "schedule",
5058
+ "meetings",
5059
+ "bookings",
5060
+ "attendees"
5061
+ ],
5062
+ "models": [
5063
+ "@happyvertical/smrt-events:Event",
5064
+ "@happyvertical/smrt-events:EventType",
5065
+ "@happyvertical/smrt-events:EventSeries",
5066
+ "@happyvertical/smrt-events:EventParticipant"
5067
+ ],
5068
+ "nav": [
5069
+ {
5070
+ "label": "Events",
5071
+ "model": "@happyvertical/smrt-events:Event",
5072
+ "icon": "calendar",
5073
+ "description": "Everything on your calendar, with who and when."
5074
+ },
5075
+ {
5076
+ "label": "Event types",
5077
+ "model": "@happyvertical/smrt-events:EventType",
5078
+ "icon": "tag",
5079
+ "description": "The kinds of events you run, such as workshops or classes."
5080
+ },
5081
+ {
5082
+ "label": "Event series",
5083
+ "model": "@happyvertical/smrt-events:EventSeries",
5084
+ "icon": "repeat",
5085
+ "description": "Repeating schedules, like a class every Tuesday evening."
5086
+ }
5087
+ ],
5088
+ "requires": [],
5089
+ "section": {
5090
+ "id": "calendar",
5091
+ "label": "Calendar",
5092
+ "icon": "calendar",
5093
+ "description": "Events and what is scheduled when."
5094
+ },
5095
+ "options": {
5096
+ "@happyvertical/smrt-events:Event": {
5097
+ "fields": {
5098
+ "parentId": {
5099
+ "visibility": "hidden"
5100
+ },
5101
+ "round": {
5102
+ "visibility": "hidden"
5103
+ },
5104
+ "metadata": {
5105
+ "visibility": "hidden"
5106
+ },
5107
+ "externalId": {
5108
+ "visibility": "hidden"
5109
+ },
5110
+ "source": {
5111
+ "visibility": "hidden"
5112
+ },
5113
+ "timeZone": {
5114
+ "visibility": "hidden"
5115
+ }
5116
+ }
5117
+ },
5118
+ "@happyvertical/smrt-events:EventType": {
5119
+ "fields": {
5120
+ "schema": {
5121
+ "visibility": "hidden"
5122
+ },
5123
+ "participantSchema": {
5124
+ "visibility": "hidden"
5125
+ }
5126
+ }
5127
+ },
5128
+ "@happyvertical/smrt-events:EventSeries": {
5129
+ "fields": {
5130
+ "metadata": {
5131
+ "visibility": "hidden"
5132
+ },
5133
+ "externalId": {
5134
+ "visibility": "hidden"
5135
+ },
5136
+ "source": {
5137
+ "visibility": "hidden"
5138
+ }
5139
+ }
5140
+ },
5141
+ "@happyvertical/smrt-events:EventParticipant": {
5142
+ "fields": {
5143
+ "groupId": {
5144
+ "visibility": "hidden"
5145
+ },
5146
+ "placement": {
5147
+ "visibility": "hidden"
5148
+ },
5149
+ "metadata": {
5150
+ "visibility": "hidden"
5151
+ },
5152
+ "externalId": {
5153
+ "visibility": "hidden"
5154
+ },
5155
+ "source": {
5156
+ "visibility": "hidden"
5157
+ }
5158
+ }
5159
+ }
5160
+ },
5161
+ "help": {
5162
+ "markdown": "## Overview\n\nEvents is your calendar. Each event has a time and a type, can belong to a\nseries, and lists who takes part.\n\n## Tasks\n\n### Schedule an event\n\n1. Create a new event.\n2. Enter the **{field:name}**, the **{field:startDate}** and the\n **{field:endDate}**.\n3. Pick the **{field:typeId}**, and the **{field:seriesId}** if it repeats.\n4. Add the people taking part with their **{field:role}**.\n\n### Keep it current\n\n1. Update **{field:status}** as the event goes ahead, finishes or is postponed.\n",
5163
+ "fieldRefs": [
5164
+ "endDate",
5165
+ "name",
5166
+ "role",
5167
+ "seriesId",
5168
+ "startDate",
5169
+ "status",
5170
+ "typeId"
5171
+ ]
5172
+ },
5173
+ "surfaces": [
5174
+ {
5175
+ "kind": "route",
5176
+ "path": "/events/meeting",
5177
+ "export": "@happyvertical/smrt-events/svelte#MeetingView",
5178
+ "label": "Meeting view"
5179
+ }
5180
+ ],
5181
+ "runtime": "both",
5182
+ "demo": {
5183
+ "mode": "server",
5184
+ "reasons": [
5185
+ "Needs a server because its package does not build for a browser: node:crypto; and its package depends on @happyvertical/smrt-places, @happyvertical/smrt-profiles, @happyvertical/smrt-tenancy, which do not build for a browser (#3617, #3624, #3626, #3627)."
5186
+ ]
5187
+ }
5188
+ }
5189
+ ],
5190
+ "browser": {
5191
+ "status": "server-only",
5192
+ "issues": [
5193
+ "#3617",
5194
+ "#3624",
5195
+ "#3626",
5196
+ "#3627"
5197
+ ],
5198
+ "reason": "node:crypto",
5199
+ "via": [
5200
+ "@happyvertical/smrt-places",
5201
+ "@happyvertical/smrt-profiles",
5202
+ "@happyvertical/smrt-tenancy"
5203
+ ]
5204
+ }
5028
5205
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-events",
3
- "version": "0.55.6",
3
+ "version": "0.55.8",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Hierarchical event management with participant tracking and SMRT framework support",
6
6
  "type": "module",
@@ -45,22 +45,22 @@
45
45
  }
46
46
  },
47
47
  "dependencies": {
48
- "@happyvertical/ai": "^0.102.4",
49
- "@happyvertical/files": "^0.102.4",
48
+ "@happyvertical/ai": "^0.103.1",
49
+ "@happyvertical/files": "^0.103.1",
50
50
  "@happyvertical/icalendar": "^0.100.2",
51
- "@happyvertical/logger": "^0.102.4",
52
- "@happyvertical/smrt-assets": "0.55.6",
53
- "@happyvertical/smrt-core": "0.55.6",
54
- "@happyvertical/smrt-places": "0.55.6",
55
- "@happyvertical/smrt-profiles": "0.55.6",
56
- "@happyvertical/smrt-tenancy": "0.55.6",
57
- "@happyvertical/smrt-types": "0.55.6",
58
- "@happyvertical/smrt-ui": "0.55.6",
59
- "@happyvertical/sql": "^0.102.4",
60
- "@happyvertical/utils": "^0.102.4"
51
+ "@happyvertical/logger": "^0.103.1",
52
+ "@happyvertical/smrt-assets": "0.55.8",
53
+ "@happyvertical/smrt-core": "0.55.8",
54
+ "@happyvertical/smrt-places": "0.55.8",
55
+ "@happyvertical/smrt-profiles": "0.55.8",
56
+ "@happyvertical/smrt-tenancy": "0.55.8",
57
+ "@happyvertical/smrt-types": "0.55.8",
58
+ "@happyvertical/smrt-ui": "0.55.8",
59
+ "@happyvertical/sql": "^0.103.1",
60
+ "@happyvertical/utils": "^0.103.1"
61
61
  },
62
62
  "devDependencies": {
63
- "@happyvertical/smrt-vitest": "0.55.6",
63
+ "@happyvertical/smrt-vitest": "0.55.8",
64
64
  "@sveltejs/package": "^2.5.8",
65
65
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
66
66
  "@types/node": "24.13.6",