@positronic/cloudflare 0.0.24 → 0.0.25

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.
package/dist/src/api.js CHANGED
@@ -1660,6 +1660,14 @@ app.post('/webhooks/:slug', function(context) {
1660
1660
  });
1661
1661
  })();
1662
1662
  });
1663
+ /**
1664
+ * Generates a unique slug for pages that don't provide one.
1665
+ * Uses brainRunId prefix + random suffix for uniqueness.
1666
+ */ function generateUniqueSlug(brainRunId) {
1667
+ var shortId = brainRunId.slice(0, 8);
1668
+ var random = Math.random().toString(36).substring(2, 10);
1669
+ return "page-".concat(shortId, "-").concat(random);
1670
+ }
1663
1671
  // Create a new page
1664
1672
  app.post('/pages', function(context) {
1665
1673
  return _async_to_generator(function() {
@@ -1680,14 +1688,6 @@ app.post('/pages', function(context) {
1680
1688
  case 1:
1681
1689
  body = _state.sent();
1682
1690
  slug = body.slug, html = body.html, brainRunId = body.brainRunId, _body_persist = body.persist, persist = _body_persist === void 0 ? false : _body_persist, ttl = body.ttl;
1683
- if (!slug) {
1684
- return [
1685
- 2,
1686
- context.json({
1687
- error: 'Missing required field "slug"'
1688
- }, 400)
1689
- ];
1690
- }
1691
1691
  if (!html) {
1692
1692
  return [
1693
1693
  2,
@@ -1704,14 +1704,19 @@ app.post('/pages', function(context) {
1704
1704
  }, 400)
1705
1705
  ];
1706
1706
  }
1707
- // Validate slug format (alphanumeric, hyphens, underscores only)
1708
- if (!/^[a-zA-Z0-9_-]+$/.test(slug)) {
1709
- return [
1710
- 2,
1711
- context.json({
1712
- error: 'Slug must contain only alphanumeric characters, hyphens, and underscores'
1713
- }, 400)
1714
- ];
1707
+ // Generate slug if not provided
1708
+ if (!slug) {
1709
+ slug = generateUniqueSlug(brainRunId);
1710
+ } else {
1711
+ // Validate slug format (alphanumeric, hyphens, underscores only)
1712
+ if (!/^[a-zA-Z0-9_-]+$/.test(slug)) {
1713
+ return [
1714
+ 2,
1715
+ context.json({
1716
+ error: 'Slug must contain only alphanumeric characters, hyphens, and underscores'
1717
+ }, 400)
1718
+ ];
1719
+ }
1715
1720
  }
1716
1721
  bucket = context.env.RESOURCES_BUCKET;
1717
1722
  key = "pages/".concat(slug, ".html");
@@ -170,6 +170,14 @@ function _ts_generator(thisArg, body) {
170
170
  };
171
171
  }
172
172
  }
173
+ /**
174
+ * Generates a unique slug for pages that don't provide one.
175
+ * Uses brainRunId prefix + random suffix for uniqueness.
176
+ */ function generateUniqueSlug(brainRunId) {
177
+ var shortId = brainRunId.slice(0, 8);
178
+ var random = Math.random().toString(36).substring(2, 10);
179
+ return "page-".concat(shortId, "-").concat(random);
180
+ }
173
181
  /**
174
182
  * Creates a PagesService implementation that works directly with R2 and MonitorDO.
175
183
  *
@@ -178,60 +186,76 @@ function _ts_generator(thisArg, body) {
178
186
  * @param monitorStub - The MonitorDO stub for page registration
179
187
  * @param baseUrl - The base URL for page URLs (e.g., "https://myapp.workers.dev")
180
188
  */ export function createPagesService(brainRunId, bucket, monitorStub, baseUrl) {
181
- return {
182
- create: function create(slug, html, options) {
183
- return _async_to_generator(function() {
184
- var key, createdAt, _options_persist, persist, url;
185
- return _ts_generator(this, function(_state) {
186
- switch(_state.label){
187
- case 0:
188
- key = "pages/".concat(slug, ".html");
189
- createdAt = new Date().toISOString();
190
- persist = (_options_persist = options === null || options === void 0 ? void 0 : options.persist) !== null && _options_persist !== void 0 ? _options_persist : false;
191
- // Store HTML with metadata in R2
192
- return [
193
- 4,
194
- bucket.put(key, html, {
195
- httpMetadata: {
196
- contentType: 'text/html; charset=utf-8'
197
- },
198
- customMetadata: _object_spread({
199
- slug: slug,
200
- brainRunId: brainRunId,
201
- persist: persist ? 'true' : 'false',
202
- createdAt: createdAt
203
- }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
204
- ttl: String(options.ttl)
205
- })
206
- })
207
- ];
208
- case 1:
209
- _state.sent();
210
- // Register the page with MonitorDO for cleanup tracking
211
- return [
212
- 4,
213
- monitorStub.registerPage(slug, brainRunId, persist)
214
- ];
215
- case 2:
216
- _state.sent();
217
- url = "".concat(baseUrl, "/pages/").concat(slug);
218
- return [
219
- 2,
220
- _object_spread_props(_object_spread({
189
+ // Implementation function that handles both overloads
190
+ function createPage(slugOrHtml, htmlOrOptions, maybeOptions) {
191
+ return _async_to_generator(function() {
192
+ var slug, html, options, key, createdAt, _options_persist, persist, url;
193
+ return _ts_generator(this, function(_state) {
194
+ switch(_state.label){
195
+ case 0:
196
+ // Detect which overload was used:
197
+ // - create(html, options?) - htmlOrOptions is undefined or PageCreateOptions
198
+ // - create(slug, html, options?) - htmlOrOptions is string (the html)
199
+ if (typeof htmlOrOptions === 'string') {
200
+ // Called as create(slug, html, options?)
201
+ slug = slugOrHtml;
202
+ html = htmlOrOptions;
203
+ options = maybeOptions;
204
+ } else {
205
+ // Called as create(html, options?)
206
+ slug = generateUniqueSlug(brainRunId);
207
+ html = slugOrHtml;
208
+ options = htmlOrOptions;
209
+ }
210
+ key = "pages/".concat(slug, ".html");
211
+ createdAt = new Date().toISOString();
212
+ persist = (_options_persist = options === null || options === void 0 ? void 0 : options.persist) !== null && _options_persist !== void 0 ? _options_persist : false;
213
+ // Store HTML with metadata in R2
214
+ return [
215
+ 4,
216
+ bucket.put(key, html, {
217
+ httpMetadata: {
218
+ contentType: 'text/html; charset=utf-8'
219
+ },
220
+ customMetadata: _object_spread({
221
221
  slug: slug,
222
- url: url,
223
222
  brainRunId: brainRunId,
224
- persist: persist
225
- }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
226
- ttl: options.ttl
227
- }), {
223
+ persist: persist ? 'true' : 'false',
228
224
  createdAt: createdAt
225
+ }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
226
+ ttl: String(options.ttl)
229
227
  })
230
- ];
231
- }
232
- });
233
- })();
234
- },
228
+ })
229
+ ];
230
+ case 1:
231
+ _state.sent();
232
+ // Register the page with MonitorDO for cleanup tracking
233
+ return [
234
+ 4,
235
+ monitorStub.registerPage(slug, brainRunId, persist)
236
+ ];
237
+ case 2:
238
+ _state.sent();
239
+ url = "".concat(baseUrl, "/pages/").concat(slug);
240
+ return [
241
+ 2,
242
+ _object_spread_props(_object_spread({
243
+ slug: slug,
244
+ url: url,
245
+ brainRunId: brainRunId,
246
+ persist: persist
247
+ }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
248
+ ttl: options.ttl
249
+ }), {
250
+ createdAt: createdAt
251
+ })
252
+ ];
253
+ }
254
+ });
255
+ })();
256
+ }
257
+ return {
258
+ create: createPage,
235
259
  get: function get(slug) {
236
260
  return _async_to_generator(function() {
237
261
  var key, r2Object;
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAI1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,2BAA2B,CAAC;AAGpE,KAAK,QAAQ,GAAG;IACd,eAAe,EAAE,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACvD,UAAU,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC9C,WAAW,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAChD,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAmBF,QAAA,MAAM,GAAG;cAAwB,QAAQ;yCAAK,CAAC;AAojC/C,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAI1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,2BAA2B,CAAC;AAGpE,KAAK,QAAQ,GAAG;IACd,eAAe,EAAE,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACvD,UAAU,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC9C,WAAW,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAChD,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAmBF,QAAA,MAAM,GAAG;cAAwB,QAAQ;yCAAK,CAAC;AAgkC/C,eAAe,GAAG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pages-service.d.ts","sourceRoot":"","sources":["../../src/pages-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,QAAQ,EAChB,WAAW,EAAE,iBAAiB,CAAC,SAAS,CAAC,EACzC,OAAO,EAAE,MAAM,GACd,YAAY,CAyGd"}
1
+ {"version":3,"file":"pages-service.d.ts","sourceRoot":"","sources":["../../src/pages-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAYjD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,QAAQ,EAChB,WAAW,EAAE,iBAAiB,CAAC,SAAS,CAAC,EACzC,OAAO,EAAE,MAAM,GACd,YAAY,CA+Hd"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/cloudflare",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -31,9 +31,9 @@
31
31
  "clean": "rm -rf tsconfig.tsbuildinfo dist"
32
32
  },
33
33
  "dependencies": {
34
- "@positronic/core": "^0.0.24",
35
- "@positronic/spec": "^0.0.24",
36
- "@positronic/template-new-project": "^0.0.24",
34
+ "@positronic/core": "^0.0.25",
35
+ "@positronic/spec": "^0.0.25",
36
+ "@positronic/template-new-project": "^0.0.25",
37
37
  "aws4fetch": "^1.0.18",
38
38
  "caz": "^2.0.0",
39
39
  "cron-schedule": "^5.0.4",