headroom-cms 0.1.9 → 0.1.11

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 (154) hide show
  1. package/README.md +11 -6
  2. package/admin/assets/{AdminsPage-Bt_ekZen.js → AdminsPage-BnzH9TL3.js} +1 -1
  3. package/admin/assets/AllContentPage-BtObN6oy.js +1 -0
  4. package/admin/assets/{ApiKeysPage-BfWCxGhC.js → ApiKeysPage-DEAa8eyC.js} +1 -1
  5. package/admin/assets/AuditPage-BN9yNsxh.js +1 -0
  6. package/admin/assets/BlockEditor-3wnisTOZ.js +176 -0
  7. package/admin/assets/BlockEditor-CQpF8tYb.css +1 -0
  8. package/admin/assets/BlockTypeEditPage-C2evAESK.js +1 -0
  9. package/admin/assets/BlockTypesPage-Dhkho6T_.js +1 -0
  10. package/admin/assets/{BulkActionBar-TRiXXLQd.js → BulkActionBar-BxdfUSrN.js} +1 -1
  11. package/admin/assets/CollectionEditPage-lOb4hEZy.js +1 -0
  12. package/admin/assets/{CollectionsPage-ClplrxNn.js → CollectionsPage-CgtOloa1.js} +1 -1
  13. package/admin/assets/{ContentCreatePage-DfYcEH1u.js → ContentCreatePage-LeQjahp_.js} +1 -1
  14. package/admin/assets/ContentEditPage-xczr4d_h.js +1 -0
  15. package/admin/assets/ContentField-pilCbdnA.js +1 -0
  16. package/admin/assets/ContentListPage-BAKDn1Xy.js +1 -0
  17. package/admin/assets/CustomBlockPreview-DNnTFM0z.js +479 -0
  18. package/admin/assets/FieldRenderer-DiOKvkWV.js +2 -0
  19. package/admin/assets/FilterBar-BZoa63zh.js +1 -0
  20. package/admin/assets/FloatingComposerController-D4uLQfUX-BMIvFCoE.js +1 -0
  21. package/admin/assets/IconPicker-CpIgiQTC.js +3 -0
  22. package/admin/assets/{LoginPage-DutieANA.js → LoginPage-D9ZsGLIi.js} +1 -1
  23. package/admin/assets/MediaField-CxccCFGQ.js +1 -0
  24. package/admin/assets/MediaPage-QvMaH2YJ.js +1 -0
  25. package/admin/assets/Pagination-Df9nQ7Z0.js +1 -0
  26. package/admin/assets/RelationshipPicker-B3Ftmqxp.js +1 -0
  27. package/admin/assets/{SiteSettingsPage-BtCC3RKc.js → SiteSettingsPage-6NvH7CiQ.js} +1 -1
  28. package/admin/assets/{SiteUserEditPage-ClHmp0T-.js → SiteUserEditPage-D5VaQ1Xq.js} +1 -1
  29. package/admin/assets/SiteUsersPage-BYVduiqs.js +1 -0
  30. package/admin/assets/{SitesPage-Bw_WBN6v.js → SitesPage-rfWWE0yK.js} +1 -1
  31. package/admin/assets/{SubmissionDetailPage-DS08LGxd.js → SubmissionDetailPage-BSUR685F.js} +1 -1
  32. package/admin/assets/SubmissionEditPage-DjLXHjWU.js +1 -0
  33. package/admin/assets/SubmissionListPage-DBxNEvde.js +1 -0
  34. package/admin/assets/{TagInput-BILCaC9b.js → TagInput-57c4DG1w.js} +1 -1
  35. package/admin/assets/{TagsPage-DdeZokow.js → TagsPage-BEO5AwCv.js} +1 -1
  36. package/admin/assets/{UsersPage-B0vLxjrg.js → UsersPage-BpIRorJ1.js} +1 -1
  37. package/admin/assets/{WebhookEditPage-SlJE4d3z.js → WebhookEditPage-D5xgi56h.js} +1 -1
  38. package/admin/assets/{WebhooksPage-C6lGZLpr.js → WebhooksPage-BY7AaiGr.js} +1 -1
  39. package/admin/assets/{card-hXVtlM0q.js → card-C9hfyHXf.js} +1 -1
  40. package/admin/assets/checkbox-DVJcwUt1.js +1 -0
  41. package/admin/assets/{collapsible-B414SspL.js → collapsible-D3d29uJp.js} +1 -1
  42. package/admin/assets/{command-fvBFHye4.js → command-Bfmj0MEL.js} +1 -1
  43. package/admin/assets/contentStatus-CkPi9Dh6.js +1 -0
  44. package/admin/assets/{core.esm-B_kcYf6n.js → core.esm-DdQHdRkd.js} +2 -2
  45. package/admin/assets/index-BB9Syqw2.css +1 -0
  46. package/admin/assets/index-Ce5pmRMj.js +18 -0
  47. package/admin/assets/media-url-DdCoIedP.js +1 -0
  48. package/admin/assets/popover-CzaQYEEP.js +1 -0
  49. package/admin/assets/radix-C5ZmWuuL.js +51 -0
  50. package/admin/assets/select-CrRhFGIi.js +1 -0
  51. package/admin/assets/serializeToText-2VrsuRUh.js +2 -0
  52. package/admin/assets/{sortable.esm-QyXA6fio.js → sortable.esm-qVEMoaTg.js} +1 -1
  53. package/admin/assets/{table-DLoIbCQ5.js → table-_3bMY0_z.js} +1 -1
  54. package/admin/assets/{textarea-vSXNxwTe.js → textarea-6fq0R6VV.js} +1 -1
  55. package/admin/assets/useAdminResolver-BJNPz3OG.js +1 -0
  56. package/admin/assets/useContent-Bs7nel7C.js +1 -0
  57. package/admin/assets/useContentSearch-B3aTjuCu.js +1 -0
  58. package/admin/assets/{useMedia-e3sqWm_t.js → useMedia-ae3s_ajC.js} +1 -1
  59. package/admin/assets/usePageTitle-C1r1-C00.js +1 -0
  60. package/admin/assets/useSiteUsers-DIaqgNSp.js +1 -0
  61. package/admin/assets/{useTags-f7AVSLuj.js → useTags-B-HgMVwo.js} +1 -1
  62. package/admin/assets/{useWebhooks-BH_r8-Mo.js → useWebhooks-BvZjUJkJ.js} +1 -1
  63. package/admin/assets/yjs-tXBm_srz.js +5 -0
  64. package/admin/favicon-16x16.png +0 -0
  65. package/admin/favicon-32x32.png +0 -0
  66. package/admin/icons/icon-180x180.png +0 -0
  67. package/admin/icons/icon-192x192.png +0 -0
  68. package/admin/icons/icon-512x512.png +0 -0
  69. package/admin/icons/maskable-icon-512x512.png +0 -0
  70. package/admin/index.html +3 -3
  71. package/admin/sw.js +1 -1
  72. package/dist/admin-site.d.ts +16 -2
  73. package/dist/admin-site.d.ts.map +1 -1
  74. package/dist/admin-site.js +10 -3
  75. package/dist/admin-site.js.map +1 -1
  76. package/dist/api.d.ts +7 -0
  77. package/dist/api.d.ts.map +1 -1
  78. package/dist/api.js +8 -1
  79. package/dist/api.js.map +1 -1
  80. package/dist/cdn-api.d.ts +25 -0
  81. package/dist/cdn-api.d.ts.map +1 -0
  82. package/dist/{cdn.js → cdn-api.js} +7 -139
  83. package/dist/cdn-api.js.map +1 -0
  84. package/dist/cdn-media.d.ts +26 -0
  85. package/dist/cdn-media.d.ts.map +1 -0
  86. package/dist/cdn-media.js +202 -0
  87. package/dist/cdn-media.js.map +1 -0
  88. package/dist/collaboration.d.ts +55 -0
  89. package/dist/collaboration.d.ts.map +1 -0
  90. package/dist/collaboration.js +141 -0
  91. package/dist/collaboration.js.map +1 -0
  92. package/dist/index.d.ts +27 -3
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +47 -12
  95. package/dist/index.js.map +1 -1
  96. package/dist/storage.d.ts +2 -0
  97. package/dist/storage.d.ts.map +1 -1
  98. package/dist/storage.js +33 -0
  99. package/dist/storage.js.map +1 -1
  100. package/lambda/api/bootstrap +0 -0
  101. package/lambda/image-lambda/node_modules/.package-lock.json +3 -3
  102. package/lambda/image-lambda/node_modules/semver/README.md +19 -4
  103. package/lambda/image-lambda/node_modules/semver/bin/semver.js +14 -10
  104. package/lambda/image-lambda/node_modules/semver/functions/truncate.js +48 -0
  105. package/lambda/image-lambda/node_modules/semver/index.js +2 -0
  106. package/lambda/image-lambda/node_modules/semver/internal/re.js +1 -1
  107. package/lambda/image-lambda/node_modules/semver/package.json +3 -3
  108. package/lambda/image-lambda/node_modules/semver/range.bnf +5 -4
  109. package/lambda/webhook-worker/bootstrap +0 -0
  110. package/package.json +1 -1
  111. package/src/admin-site.ts +26 -5
  112. package/src/api.ts +15 -1
  113. package/src/{cdn.ts → cdn-api.ts} +8 -161
  114. package/src/cdn-media.ts +250 -0
  115. package/src/collaboration.ts +187 -0
  116. package/src/index.ts +77 -14
  117. package/src/sst-env.d.ts +28 -0
  118. package/src/storage.ts +35 -0
  119. package/admin/assets/AllContentPage-CFqEMAl9.js +0 -1
  120. package/admin/assets/AuditPage-BE0XIUl2.js +0 -1
  121. package/admin/assets/BlockEditor-6wqsThJ7.js +0 -179
  122. package/admin/assets/BlockEditor-Cp_wZ2xN.css +0 -1
  123. package/admin/assets/BlockTypeEditPage-CuNJfZw0.js +0 -1
  124. package/admin/assets/BlockTypesPage-BIMBVxBs.js +0 -1
  125. package/admin/assets/CollectionEditPage-BqX_0cC2.js +0 -1
  126. package/admin/assets/ContentEditPage-D3Rvlktk.js +0 -2
  127. package/admin/assets/ContentListPage-zmO8Is4d.js +0 -1
  128. package/admin/assets/CustomBlockPreview-C6HqS4xv.js +0 -479
  129. package/admin/assets/FieldBuilder-36tfpSyM.js +0 -3
  130. package/admin/assets/FilterBar-DhRwTqFv.js +0 -1
  131. package/admin/assets/MediaField-J2TLG_fu.js +0 -1
  132. package/admin/assets/MediaPage-DZZKMGF4.js +0 -1
  133. package/admin/assets/RelationshipPicker-CDFs4TMW.js +0 -1
  134. package/admin/assets/SiteUsersPage-AyJvcVM7.js +0 -1
  135. package/admin/assets/SubmissionEditPage-Brf-DK2X.js +0 -1
  136. package/admin/assets/SubmissionListPage-DNMzQZHS.js +0 -1
  137. package/admin/assets/checkbox-WGrS3sUr.js +0 -1
  138. package/admin/assets/contentStatus-BmaiYVOm.js +0 -1
  139. package/admin/assets/index-Cir9tY_P.js +0 -18
  140. package/admin/assets/index-DACBYsKM.css +0 -1
  141. package/admin/assets/media-url-DIg_vSyf.js +0 -1
  142. package/admin/assets/popover-D5_HjjUC.js +0 -1
  143. package/admin/assets/radix-C1kb_NqW.js +0 -51
  144. package/admin/assets/select-_uJYxzeZ.js +0 -1
  145. package/admin/assets/serializeToText-DR_WnxiI.js +0 -2
  146. package/admin/assets/useAdminResolver-D-LlmquD.js +0 -1
  147. package/admin/assets/useContent-e8beBIuq.js +0 -1
  148. package/admin/assets/useContentSearch-DOjveB9t.js +0 -1
  149. package/admin/assets/useDebouncedValue-C-cQUcLG.js +0 -1
  150. package/admin/assets/usePageTitle-BNSba9_L.js +0 -1
  151. package/admin/assets/useSiteUsers-BdnvuM2E.js +0 -1
  152. package/dist/cdn.d.ts +0 -27
  153. package/dist/cdn.d.ts.map +0 -1
  154. package/dist/cdn.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration.js","sourceRoot":"","sources":["../src/collaboration.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,8 +9,10 @@ export type { AuthResources } from "./auth.js";
9
9
  export type { WebhookResources } from "./webhooks.js";
10
10
  export type { ImageResources } from "./image.js";
11
11
  export type { ApiResources } from "./api.js";
12
- export type { CdnResources } from "./cdn.js";
12
+ export type { ApiCdnResources } from "./cdn-api.js";
13
+ export type { MediaCdnResources } from "./cdn-media.js";
13
14
  export type { SchedulerResources } from "./scheduler.js";
15
+ export type { CollaborationResources } from "./collaboration.js";
14
16
  export type { AdminSiteResources } from "./admin-site.js";
15
17
  export interface HeadroomCMSArgs {
16
18
  /**
@@ -20,7 +22,7 @@ export interface HeadroomCMSArgs {
20
22
  */
21
23
  senderEmail: string;
22
24
  /**
23
- * Custom domain for the CDN (API endpoint).
25
+ * Custom domain for the API CDN (`/v1/*` and `/health`).
24
26
  * If not provided, uses the default CloudFront domain.
25
27
  */
26
28
  domain?: {
@@ -28,6 +30,16 @@ export interface HeadroomCMSArgs {
28
30
  /** ACM certificate ARN (must be in us-east-1 for CloudFront) */
29
31
  certificateArn: string;
30
32
  };
33
+ /**
34
+ * Custom domain for the media CDN (S3 + image-Lambda origin, serves
35
+ * `/media/*` and `/img/*`). If not provided, uses the default CloudFront
36
+ * domain. The certificate must be in us-east-1, same as `domain`.
37
+ */
38
+ mediaDomain?: {
39
+ name: string;
40
+ /** ACM certificate ARN (must be in us-east-1 for CloudFront) */
41
+ certificateArn: string;
42
+ };
31
43
  /**
32
44
  * Custom domain for the admin UI.
33
45
  * If not provided, uses the default CloudFront domain.
@@ -74,14 +86,26 @@ export interface HeadroomCMSArgs {
74
86
  adminPath: string;
75
87
  /** Go source path for scheduler Lambda, e.g. "packages/scheduler" */
76
88
  schedulerHandler?: string;
89
+ /** SST handler for collab Lambda, e.g. "packages/collab/src/index.handler" */
90
+ collabHandler?: string;
77
91
  };
92
+ /**
93
+ * Build-time toggle for the collaboration feature in the admin UI.
94
+ * Defaults to `true`. Set `false` to keep the WebSocket / Collab table
95
+ * deployed but hide the "Collaborate" / "Request collaboration" buttons
96
+ * and refuse to open WebSockets — a kill-switch without teardown. Used
97
+ * to ship the feature to a stage before turning it on for editors.
98
+ */
99
+ collabEnabled?: boolean;
78
100
  }
79
101
  export declare class HeadroomCMS {
80
102
  readonly apiUrl: $util.Output<string>;
81
- readonly cdnUrl: $util.Output<string>;
103
+ readonly apiCdnUrl: $util.Output<string>;
104
+ readonly mediaCdnUrl: $util.Output<string>;
82
105
  readonly adminUrl: $util.Output<string>;
83
106
  readonly userPoolId: $util.Output<string>;
84
107
  readonly userPoolClientId: $util.Output<string>;
108
+ readonly collabWsUrl: $util.Output<string>;
85
109
  readonly outputs: Record<string, $util.Output<string>>;
86
110
  constructor(name: string, args: HeadroomCMSArgs);
87
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwCH,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,gEAAgE;QAChE,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,gEAAgE;QAChE,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF;;;OAGG;IACH,UAAU,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;IAEpE;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,CAAC;IAEF;;;OAGG;IACH,GAAG,CAAC,EAAE;QACJ,yDAAyD;QACzD,UAAU,EAAE,MAAM,CAAC;QACnB,wEAAwE;QACxE,oBAAoB,EAAE,MAAM,CAAC;QAC7B,gGAAgG;QAChG,oBAAoB,EAAE,MAAM,CAAC;QAC7B,+EAA+E;QAC/E,kBAAkB,EAAE,MAAM,CAAC;QAC3B,qDAAqD;QACrD,SAAS,EAAE,MAAM,CAAC;QAClB,qEAAqE;QACrE,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,qBAAa,WAAW;IACtB,SAAgB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,SAAgB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,SAAgB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,SAAgB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,SAAgB,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvD,SAAgB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBAElD,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe;CAgGhD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -11,8 +11,10 @@ import { createAuth } from "./auth.js";
11
11
  import { createWebhooks } from "./webhooks.js";
12
12
  import { createImage } from "./image.js";
13
13
  import { createApi } from "./api.js";
14
- import { createCdn } from "./cdn.js";
14
+ import { createApiCdn } from "./cdn-api.js";
15
+ import { createMediaCdn } from "./cdn-media.js";
15
16
  import { createScheduler } from "./scheduler.js";
17
+ import { createCollabTable, createCollabHandler } from "./collaboration.js";
16
18
  import { createAdminSite } from "./admin-site.js";
17
19
  /**
18
20
  * Resolve the headroom-cms package root directory.
@@ -40,10 +42,12 @@ function resolvePkgRoot() {
40
42
  }
41
43
  export class HeadroomCMS {
42
44
  apiUrl;
43
- cdnUrl;
45
+ apiCdnUrl;
46
+ mediaCdnUrl;
44
47
  adminUrl;
45
48
  userPoolId;
46
49
  userPoolClientId;
50
+ collabWsUrl;
47
51
  outputs;
48
52
  constructor(name, args) {
49
53
  // Only need pkgRoot for package mode (pre-built artifacts)
@@ -75,19 +79,38 @@ export class HeadroomCMS {
75
79
  ? { handler: args.dev.imageLambdaHandler }
76
80
  : undefined,
77
81
  });
78
- // 5. API Lambda (Go handler with access to all resources)
82
+ // 5a. Collaboration table (must exist before the API Lambda, which
83
+ // links it for ticket reads/writes).
84
+ const collabTable = createCollabTable(name);
85
+ // 6. API Lambda (Go handler with access to all resources)
79
86
  const api = createApi(name, {
80
87
  storage,
81
88
  auth,
82
89
  webhooks,
83
90
  image,
91
+ collab: collabTable,
84
92
  senderEmail: args.senderEmail,
85
93
  pkgRoot,
86
94
  dev: args.dev
87
95
  ? { handler: args.dev.apiHandler }
88
96
  : undefined,
89
97
  });
90
- // 6. Scheduler (EventBridge cron + Go Lambda + lock table)
98
+ // 5b. Collaboration WebSocket handler (must be created AFTER the API
99
+ // because its Lambda environment includes API_URL = api.api.url, which
100
+ // `snapshotToDraft` uses to PUT the disconnect snapshot back to the
101
+ // Go draft endpoint).
102
+ const collabHandler = createCollabHandler(name, {
103
+ storage,
104
+ auth,
105
+ api,
106
+ collabTable: collabTable.collabTable,
107
+ pkgRoot,
108
+ dev: args.dev?.collabHandler
109
+ ? { handler: args.dev.collabHandler }
110
+ : undefined,
111
+ });
112
+ const collab = { ...collabTable, ...collabHandler };
113
+ // 7. Scheduler (EventBridge cron + Go Lambda + lock table)
91
114
  const schedulerResources = createScheduler(name, {
92
115
  storage,
93
116
  api,
@@ -96,39 +119,51 @@ export class HeadroomCMS {
96
119
  ? { handler: args.dev.schedulerHandler }
97
120
  : undefined,
98
121
  });
99
- // 7. CDN (CloudFront distribution + edge functions)
100
- const cdn = createCdn(name, {
122
+ // 8a. API CDN (CloudFront distribution + edge auth, /v1/* and /health)
123
+ const apiCdn = createApiCdn(name, {
101
124
  api,
102
- image,
103
- contentBucket: storage.contentBucket,
104
125
  kvs: storage.kvs,
105
126
  priceClass: args.priceClass,
106
127
  apiCacheTtl: args.apiCacheTtl,
107
128
  domain: args.domain,
108
129
  });
109
- // 8. Admin UI (static site)
130
+ // 8b. Media CDN (CloudFront distribution, /media/* and /img/* only)
131
+ const mediaCdn = createMediaCdn(name, {
132
+ image,
133
+ contentBucket: storage.contentBucket,
134
+ priceClass: args.priceClass,
135
+ domain: args.mediaDomain,
136
+ });
137
+ // 9. Admin UI (static site)
110
138
  const admin = createAdminSite(name, {
111
139
  api,
112
- cdn,
140
+ apiCdn,
141
+ mediaCdn,
113
142
  auth,
143
+ collab,
114
144
  pkgRoot,
115
145
  dev: args.dev
116
146
  ? { adminPath: args.dev.adminPath }
117
147
  : undefined,
118
148
  domain: args.adminDomain,
149
+ collabEnabled: args.collabEnabled,
119
150
  });
120
151
  // Expose outputs
121
152
  this.apiUrl = api.api.url;
122
- this.cdnUrl = cdn.url;
153
+ this.apiCdnUrl = apiCdn.url;
154
+ this.mediaCdnUrl = mediaCdn.url;
123
155
  this.adminUrl = admin.url;
124
156
  this.userPoolId = auth.userPool.id;
125
157
  this.userPoolClientId = auth.userPoolClient.id;
158
+ this.collabWsUrl = collab.wsUrl;
126
159
  this.outputs = {
127
160
  api: api.api.url,
128
- cdn: cdn.url,
161
+ apiCdn: apiCdn.url,
162
+ mediaCdn: mediaCdn.url,
129
163
  admin: admin.url,
130
164
  userPoolId: auth.userPool.id,
131
165
  userPoolClientId: auth.userPoolClient.id,
166
+ collabWs: collab.wsUrl,
132
167
  };
133
168
  }
134
169
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/storage.d.ts CHANGED
@@ -16,7 +16,9 @@ export declare function createStorage(name: string): {
16
16
  relationships: sst.aws.Dynamo;
17
17
  siteUsers: sst.aws.Dynamo;
18
18
  contentBucket: sst.aws.Bucket;
19
+ collabStateBucket: sst.aws.Bucket;
19
20
  kvs: aws.cloudfront.KeyValueStore;
21
+ internalSecret: sst.Secret;
20
22
  };
21
23
  export type StorageResources = ReturnType<typeof createStorage>;
22
24
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM;;;;;;;;;;;;;EAiJzC;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;EAoLzC;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
package/dist/storage.js CHANGED
@@ -119,10 +119,41 @@ export function createStorage(name) {
119
119
  },
120
120
  },
121
121
  });
122
+ // Phase 7.1 "Large documents": YJS room state that exceeds DynamoDB's 400KB
123
+ // per-item cap is uploaded here instead of being inlined on the Collab
124
+ // item. Dedicated bucket (vs reusing `contentBucket`) for two reasons:
125
+ // 1. `contentBucket` is `access: "cloudfront"` for media delivery; YJS
126
+ // state must NOT be CDN-fronted (it's per-collaboration-session
127
+ // transient state, never publicly addressable).
128
+ // 2. Lifecycle expiration is much shorter — these objects are recovery
129
+ // fallback for an active collaboration session; the matching Collab
130
+ // table item carries a 24h DynamoDB TTL, so the S3 lifecycle rule
131
+ // cleans up overflow objects on a similar timeline.
132
+ const collabStateBucket = new sst.aws.Bucket(`${name}CollabStateBucket`, {
133
+ transform: {
134
+ bucket: (args) => {
135
+ args.lifecycleRules = [
136
+ {
137
+ id: "expire-collab-state",
138
+ enabled: true,
139
+ expiration: { days: 7 },
140
+ // Keep the matching Collab DynamoDB TTL (24h) as the primary
141
+ // cleanup mechanism; this is a long-stop safety net so orphaned
142
+ // S3 objects don't accumulate forever.
143
+ },
144
+ ];
145
+ },
146
+ },
147
+ });
122
148
  const kvs = new aws.cloudfront.KeyValueStore(`${name}KVS`, {
123
149
  name: $interpolate `${$app.name}-${$app.stage}-kvs`,
124
150
  comment: "Headroom CMS edge data: API keys and site versions",
125
151
  });
152
+ // Shared secret for internal service-to-service auth between the collab
153
+ // Lambda and the Go API (`X-Headroom-Internal` header). Both Lambdas read
154
+ // this from their `INTERNAL_SECRET` environment variable. Set the value via
155
+ // `sst secret set HeadroomInternalSecret <value>` (or the namespaced equivalent).
156
+ const internalSecret = new sst.Secret(`${name}InternalSecret`);
126
157
  return {
127
158
  sites,
128
159
  content,
@@ -135,7 +166,9 @@ export function createStorage(name) {
135
166
  relationships,
136
167
  siteUsers,
137
168
  contentBucket,
169
+ collabStateBucket,
138
170
  kvs,
171
+ internalSecret,
139
172
  };
140
173
  }
141
174
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
Binary file
@@ -97,9 +97,9 @@
97
97
  "license": "MIT"
98
98
  },
99
99
  "node_modules/semver": {
100
- "version": "7.7.4",
101
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
102
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
100
+ "version": "7.8.0",
101
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
102
+ "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
103
103
  "license": "ISC",
104
104
  "bin": {
105
105
  "semver": "bin/semver.js"
@@ -56,6 +56,7 @@ const semverCompareLoose = require('semver/functions/compare-loose')
56
56
  const semverCompareBuild = require('semver/functions/compare-build')
57
57
  const semverSort = require('semver/functions/sort')
58
58
  const semverRsort = require('semver/functions/rsort')
59
+ const semverTruncate = require('semver/functions/truncate')
59
60
 
60
61
  // low-level comparators between versions
61
62
  const semverGt = require('semver/functions/gt')
@@ -399,12 +400,19 @@ nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
399
400
  tilde ::= '~' partial
400
401
  caret ::= '^' partial
401
402
  qualifier ::= ( '-' pre )? ( '+' build )?
402
- pre ::= parts
403
- build ::= parts
404
- parts ::= part ( '.' part ) *
405
- part ::= nr | [-0-9A-Za-z]+
403
+ pre ::= prepart ( '.' prepart ) *
404
+ prepart ::= nr | alphanumid
405
+ build ::= buildid ( '.' buildid ) *
406
+ alphanumid ::= ( ['0'-'9'] ) * [-A-Za-z] [-0-9A-Za-z] *
407
+ buildid ::= [-0-9A-Za-z]+
406
408
  ```
407
409
 
410
+ Note: Prerelease identifiers (`pre`) use `nr` for numeric parts, which
411
+ disallows leading zeros (e.g., `1.2.3-00` is invalid). Build metadata
412
+ identifiers (`build`) allow any alphanumeric string including leading
413
+ zeros (e.g., `1.2.3+00` is valid). This matches the
414
+ [SemVer 2.0.0 specification](https://semver.org/#spec-item-9).
415
+
408
416
  ## Functions
409
417
 
410
418
  All methods and classes take a final `options` object argument. All
@@ -449,6 +457,12 @@ strings that they parse.
449
457
  or comparators intersect.
450
458
  * `parse(v)`: Attempt to parse a string as a semantic version, returning either
451
459
  a `SemVer` object or `null`.
460
+ * `truncate(v, releaseType)`: Return the version with components _lower_
461
+ than `releaseType` dropped off, e.g.:
462
+ * `major` removes build & prerelease info and sets minor & patch to 0.
463
+ * `minor` removes build & prerelease info, and sets patch to 0
464
+ * `patch` removes build & prerelease info
465
+ * All prerelease types remove build info only
452
466
 
453
467
  ### Comparison
454
468
 
@@ -650,6 +664,7 @@ The following modules are available:
650
664
  * `require('semver/functions/rsort')`
651
665
  * `require('semver/functions/satisfies')`
652
666
  * `require('semver/functions/sort')`
667
+ * `require('semver/functions/truncate')`
653
668
  * `require('semver/functions/valid')`
654
669
  * `require('semver/ranges/gtr')`
655
670
  * `require('semver/ranges/intersects')`
@@ -46,6 +46,7 @@ const main = () => {
46
46
  a = a.slice(0, indexOfEqualSign)
47
47
  argv.unshift(value)
48
48
  }
49
+
49
50
  switch (a) {
50
51
  case '-rv': case '-rev': case '--rev': case '--reverse':
51
52
  reverse = true
@@ -60,15 +61,10 @@ const main = () => {
60
61
  versions.push(argv.shift())
61
62
  break
62
63
  case '-i': case '--inc': case '--increment':
63
- switch (argv[0]) {
64
- case 'major': case 'minor': case 'patch': case 'prerelease':
65
- case 'premajor': case 'preminor': case 'prepatch':
66
- case 'release':
67
- inc = argv.shift()
68
- break
69
- default:
70
- inc = 'patch'
71
- break
64
+ if (semver.RELEASE_TYPES.includes(argv[0]) || (argv[0] === 'release')) {
65
+ inc = { value: argv.shift(), maybeErrantValue: null, option: a }
66
+ } else {
67
+ inc = { value: 'patch', maybeErrantValue: argv[0], option: a }
72
68
  }
73
69
  break
74
70
  case '--preid':
@@ -102,6 +98,14 @@ const main = () => {
102
98
 
103
99
  options = parseOptions({ loose, includePrerelease, rtl })
104
100
 
101
+ if (
102
+ inc &&
103
+ versions.includes(inc.maybeErrantValue) &&
104
+ !semver.valid(inc.maybeErrantValue, options)
105
+ ) {
106
+ console.warn(`Invalid value for ${inc.option}; defaulting to 'patch'. This may become a failure in future major versions.`)
107
+ }
108
+
105
109
  versions = versions.map((v) => {
106
110
  return coerce ? (semver.coerce(v, options) || { version: v }).version : v
107
111
  }).filter((v) => {
@@ -125,7 +129,7 @@ const main = () => {
125
129
  versions
126
130
  .sort((a, b) => semver[reverse ? 'rcompare' : 'compare'](a, b, options))
127
131
  .map(v => semver.clean(v, options))
128
- .map(v => inc ? semver.inc(v, inc, options, identifier, identifierBase) : v)
132
+ .map(v => inc ? semver.inc(v, inc.value, options, identifier, identifierBase) : v)
129
133
  .forEach(v => console.log(v))
130
134
  }
131
135
 
@@ -0,0 +1,48 @@
1
+ 'use strict'
2
+
3
+ const parse = require('./parse')
4
+ const constants = require('../internal/constants')
5
+ const SemVer = require('../classes/semver')
6
+
7
+ const truncate = (version, truncation, options) => {
8
+ if (!constants.RELEASE_TYPES.includes(truncation)) {
9
+ return null
10
+ }
11
+
12
+ const clonedVersion = cloneInputVersion(version, options)
13
+ return clonedVersion && doTruncation(clonedVersion, truncation)
14
+ }
15
+
16
+ const cloneInputVersion = (version, options) => {
17
+ const versionStringToParse = (
18
+ version instanceof SemVer ? version.version : version
19
+ )
20
+
21
+ return parse(versionStringToParse, options)
22
+ }
23
+
24
+ const doTruncation = (version, truncation) => {
25
+ if (isPrerelease(truncation)) {
26
+ return version.version
27
+ }
28
+
29
+ version.prerelease = []
30
+
31
+ switch (truncation) {
32
+ case 'major':
33
+ version.minor = 0
34
+ version.patch = 0
35
+ break
36
+ case 'minor':
37
+ version.patch = 0
38
+ break
39
+ }
40
+
41
+ return version.format()
42
+ }
43
+
44
+ const isPrerelease = (type) => {
45
+ return type.startsWith('pre')
46
+ }
47
+
48
+ module.exports = truncate
@@ -28,6 +28,7 @@ const gte = require('./functions/gte')
28
28
  const lte = require('./functions/lte')
29
29
  const cmp = require('./functions/cmp')
30
30
  const coerce = require('./functions/coerce')
31
+ const truncate = require('./functions/truncate')
31
32
  const Comparator = require('./classes/comparator')
32
33
  const Range = require('./classes/range')
33
34
  const satisfies = require('./functions/satisfies')
@@ -66,6 +67,7 @@ module.exports = {
66
67
  lte,
67
68
  cmp,
68
69
  coerce,
70
+ truncate,
69
71
  Comparator,
70
72
  Range,
71
73
  satisfies,
@@ -136,7 +136,7 @@ createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)
136
136
  createToken('GTLT', '((?:<|>)?=?)')
137
137
 
138
138
  // Something like "2.*" or "1.2.x".
139
- // Note that "x.x" is a valid xRange identifer, meaning "any version"
139
+ // Note that "x.x" is a valid xRange identifier, meaning "any version"
140
140
  // Only the first item is strictly required.
141
141
  createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`)
142
142
  createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "semver",
3
- "version": "7.7.4",
3
+ "version": "7.8.0",
4
4
  "description": "The semantic version parser used by npm.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "devDependencies": {
17
17
  "@npmcli/eslint-config": "^6.0.0",
18
- "@npmcli/template-oss": "4.29.0",
18
+ "@npmcli/template-oss": "5.0.0",
19
19
  "benchmark": "^2.1.4",
20
20
  "tap": "^16.0.0"
21
21
  },
@@ -52,7 +52,7 @@
52
52
  "author": "GitHub Inc.",
53
53
  "templateOSS": {
54
54
  "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
55
- "version": "4.29.0",
55
+ "version": "5.0.0",
56
56
  "engines": ">=10",
57
57
  "distPaths": [
58
58
  "classes/",
@@ -10,7 +10,8 @@ nr ::= '0' | [1-9] ( [0-9] ) *
10
10
  tilde ::= '~' partial
11
11
  caret ::= '^' partial
12
12
  qualifier ::= ( '-' pre )? ( '+' build )?
13
- pre ::= parts
14
- build ::= parts
15
- parts ::= part ( '.' part ) *
16
- part ::= nr | [-0-9A-Za-z]+
13
+ pre ::= prepart ( '.' prepart ) *
14
+ prepart ::= nr | alphanumid
15
+ build ::= buildid ( '.' buildid ) *
16
+ alphanumid ::= ( [0-9] ) * [A-Za-z-] [-0-9A-Za-z] *
17
+ buildid ::= [-0-9A-Za-z]+
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "headroom-cms",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Headroom CMS — Serverless headless CMS for AWS, deployed with SST",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/admin-site.ts CHANGED
@@ -9,13 +9,17 @@
9
9
  import fs from "fs";
10
10
  import path from "path";
11
11
  import type { ApiResources } from "./api.js";
12
- import type { CdnResources } from "./cdn.js";
12
+ import type { ApiCdnResources } from "./cdn-api.js";
13
+ import type { MediaCdnResources } from "./cdn-media.js";
13
14
  import type { AuthResources } from "./auth.js";
15
+ import type { CollaborationResources } from "./collaboration.js";
14
16
 
15
17
  export interface AdminSiteArgs {
16
18
  api: ApiResources;
17
- cdn: CdnResources;
19
+ apiCdn: ApiCdnResources;
20
+ mediaCdn: MediaCdnResources;
18
21
  auth: AuthResources;
22
+ collab: CollaborationResources;
19
23
  pkgRoot: string;
20
24
  dev?: {
21
25
  /** Path to admin UI source, e.g. "packages/admin" */
@@ -25,10 +29,23 @@ export interface AdminSiteArgs {
25
29
  name: string;
26
30
  certificateArn: string;
27
31
  };
32
+ /**
33
+ * Build-time toggle for the entire collaboration UI. Defaults to `true`
34
+ * (collab is on whenever the WS infra is deployed). Set to `false` from
35
+ * the consuming SST config to keep the WebSocket / Collab DynamoDB table
36
+ * deployed but hide the "Collaborate" / "Request collaboration" buttons
37
+ * and refuse to open WebSockets — useful as a kill-switch without a full
38
+ * teardown. Plumbs to `VITE_COLLAB_ENABLED` in the admin Vite env; see
39
+ * `packages/admin/src/collab/featureFlag.ts` for the consumer.
40
+ */
41
+ collabEnabled?: boolean;
28
42
  }
29
43
 
30
44
  export function createAdminSite(name: string, args: AdminSiteArgs) {
31
- const { api, cdn, auth } = args;
45
+ const { api, mediaCdn, auth, collab } = args;
46
+ // Default ON for backward compat — only emit "false" when explicitly
47
+ // disabled so existing stages without the flag set don't change behaviour.
48
+ const collabEnabledStr = args.collabEnabled === false ? "false" : "true";
32
49
 
33
50
  const domainConfig = args.domain
34
51
  ? {
@@ -50,10 +67,12 @@ export function createAdminSite(name: string, args: AdminSiteArgs) {
50
67
  },
51
68
  environment: {
52
69
  VITE_API_URL: api.api.url,
53
- VITE_CDN_URL: cdn.url,
70
+ VITE_MEDIA_URL: mediaCdn.url,
54
71
  VITE_USER_POOL_ID: auth.userPool.id,
55
72
  VITE_USER_POOL_CLIENT_ID: auth.userPoolClient.id,
56
73
  VITE_AWS_REGION: aws.getRegionOutput().name,
74
+ VITE_COLLAB_WS_URL: collab.wsUrl,
75
+ VITE_COLLAB_ENABLED: collabEnabledStr,
57
76
  },
58
77
  domain: domainConfig,
59
78
  });
@@ -80,10 +99,12 @@ export function createAdminSite(name: string, args: AdminSiteArgs) {
80
99
  const path = require('path');
81
100
  const replacements = {
82
101
  '__HEADROOM_API_URL__': '${api.api.url}',
83
- '__HEADROOM_CDN_URL__': '${cdn.url}',
102
+ '__HEADROOM_MEDIA_URL__': '${mediaCdn.url}',
84
103
  '__HEADROOM_USER_POOL_ID__': '${auth.userPool.id}',
85
104
  '__HEADROOM_USER_POOL_CLIENT_ID__': '${auth.userPoolClient.id}',
86
105
  '__HEADROOM_AWS_REGION__': '${aws.getRegionOutput().name}',
106
+ '__HEADROOM_COLLAB_WS_URL__': '${collab.wsUrl}',
107
+ '__HEADROOM_COLLAB_ENABLED__': '${collabEnabledStr}',
87
108
  };
88
109
  function walk(d) {
89
110
  for (const f of fs.readdirSync(d)) {