featurebase-node 0.10.0 → 0.12.0

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 (115) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/package.json +1 -1
  3. package/resources/feedback/feedback.d.mts +2 -2
  4. package/resources/feedback/feedback.d.mts.map +1 -1
  5. package/resources/feedback/feedback.d.ts +2 -2
  6. package/resources/feedback/feedback.d.ts.map +1 -1
  7. package/resources/feedback/feedback.js.map +1 -1
  8. package/resources/feedback/feedback.mjs.map +1 -1
  9. package/resources/feedback/index.d.mts +1 -1
  10. package/resources/feedback/index.d.mts.map +1 -1
  11. package/resources/feedback/index.d.ts +1 -1
  12. package/resources/feedback/index.d.ts.map +1 -1
  13. package/resources/feedback/index.js.map +1 -1
  14. package/resources/feedback/index.mjs.map +1 -1
  15. package/resources/feedback/posts/index.d.mts +1 -1
  16. package/resources/feedback/posts/index.d.mts.map +1 -1
  17. package/resources/feedback/posts/index.d.ts +1 -1
  18. package/resources/feedback/posts/index.d.ts.map +1 -1
  19. package/resources/feedback/posts/index.js.map +1 -1
  20. package/resources/feedback/posts/index.mjs.map +1 -1
  21. package/resources/feedback/posts/posts.d.mts +520 -1
  22. package/resources/feedback/posts/posts.d.mts.map +1 -1
  23. package/resources/feedback/posts/posts.d.ts +520 -1
  24. package/resources/feedback/posts/posts.d.ts.map +1 -1
  25. package/resources/feedback/posts/posts.js +155 -0
  26. package/resources/feedback/posts/posts.js.map +1 -1
  27. package/resources/feedback/posts/posts.mjs +155 -0
  28. package/resources/feedback/posts/posts.mjs.map +1 -1
  29. package/resources/help-center/articles.d.mts +407 -1
  30. package/resources/help-center/articles.d.mts.map +1 -1
  31. package/resources/help-center/articles.d.ts +407 -1
  32. package/resources/help-center/articles.d.ts.map +1 -1
  33. package/resources/help-center/articles.js +130 -0
  34. package/resources/help-center/articles.js.map +1 -1
  35. package/resources/help-center/articles.mjs +130 -0
  36. package/resources/help-center/articles.mjs.map +1 -1
  37. package/resources/help-center/help-center.d.mts +2 -2
  38. package/resources/help-center/help-center.d.mts.map +1 -1
  39. package/resources/help-center/help-center.d.ts +2 -2
  40. package/resources/help-center/help-center.d.ts.map +1 -1
  41. package/resources/help-center/help-center.js.map +1 -1
  42. package/resources/help-center/help-center.mjs.map +1 -1
  43. package/resources/help-center/index.d.mts +1 -1
  44. package/resources/help-center/index.d.mts.map +1 -1
  45. package/resources/help-center/index.d.ts +1 -1
  46. package/resources/help-center/index.d.ts.map +1 -1
  47. package/resources/help-center/index.js.map +1 -1
  48. package/resources/help-center/index.mjs.map +1 -1
  49. package/resources/support/conversations/conversations.d.mts +14 -10
  50. package/resources/support/conversations/conversations.d.mts.map +1 -1
  51. package/resources/support/conversations/conversations.d.ts +14 -10
  52. package/resources/support/conversations/conversations.d.ts.map +1 -1
  53. package/resources/support/conversations/conversations.js +3 -1
  54. package/resources/support/conversations/conversations.js.map +1 -1
  55. package/resources/support/conversations/conversations.mjs +3 -1
  56. package/resources/support/conversations/conversations.mjs.map +1 -1
  57. package/resources/users/companies/companies.d.mts +237 -1
  58. package/resources/users/companies/companies.d.mts.map +1 -1
  59. package/resources/users/companies/companies.d.ts +237 -1
  60. package/resources/users/companies/companies.d.ts.map +1 -1
  61. package/resources/users/companies/companies.js +94 -0
  62. package/resources/users/companies/companies.js.map +1 -1
  63. package/resources/users/companies/companies.mjs +94 -0
  64. package/resources/users/companies/companies.mjs.map +1 -1
  65. package/resources/users/companies/index.d.mts +1 -1
  66. package/resources/users/companies/index.d.mts.map +1 -1
  67. package/resources/users/companies/index.d.ts +1 -1
  68. package/resources/users/companies/index.d.ts.map +1 -1
  69. package/resources/users/companies/index.js.map +1 -1
  70. package/resources/users/companies/index.mjs.map +1 -1
  71. package/resources/users/contacts/contacts.d.mts +261 -1
  72. package/resources/users/contacts/contacts.d.mts.map +1 -1
  73. package/resources/users/contacts/contacts.d.ts +261 -1
  74. package/resources/users/contacts/contacts.d.ts.map +1 -1
  75. package/resources/users/contacts/contacts.js +99 -0
  76. package/resources/users/contacts/contacts.js.map +1 -1
  77. package/resources/users/contacts/contacts.mjs +99 -0
  78. package/resources/users/contacts/contacts.mjs.map +1 -1
  79. package/resources/users/contacts/index.d.mts +1 -1
  80. package/resources/users/contacts/index.d.mts.map +1 -1
  81. package/resources/users/contacts/index.d.ts +1 -1
  82. package/resources/users/contacts/index.d.ts.map +1 -1
  83. package/resources/users/contacts/index.js.map +1 -1
  84. package/resources/users/contacts/index.mjs.map +1 -1
  85. package/resources/users/index.d.mts +2 -2
  86. package/resources/users/index.d.mts.map +1 -1
  87. package/resources/users/index.d.ts +2 -2
  88. package/resources/users/index.d.ts.map +1 -1
  89. package/resources/users/index.js.map +1 -1
  90. package/resources/users/index.mjs.map +1 -1
  91. package/resources/users/users.d.mts +4 -4
  92. package/resources/users/users.d.mts.map +1 -1
  93. package/resources/users/users.d.ts +4 -4
  94. package/resources/users/users.d.ts.map +1 -1
  95. package/resources/users/users.js.map +1 -1
  96. package/resources/users/users.mjs.map +1 -1
  97. package/src/resources/feedback/feedback.ts +4 -0
  98. package/src/resources/feedback/index.ts +2 -0
  99. package/src/resources/feedback/posts/index.ts +2 -0
  100. package/src/resources/feedback/posts/posts.ts +636 -0
  101. package/src/resources/help-center/articles.ts +686 -0
  102. package/src/resources/help-center/help-center.ts +4 -0
  103. package/src/resources/help-center/index.ts +2 -0
  104. package/src/resources/support/conversations/conversations.ts +14 -12
  105. package/src/resources/users/companies/companies.ts +289 -0
  106. package/src/resources/users/companies/index.ts +2 -0
  107. package/src/resources/users/contacts/contacts.ts +320 -0
  108. package/src/resources/users/contacts/index.ts +2 -0
  109. package/src/resources/users/index.ts +4 -0
  110. package/src/resources/users/users.ts +8 -0
  111. package/src/version.ts +1 -1
  112. package/version.d.mts +1 -1
  113. package/version.d.ts +1 -1
  114. package/version.js +1 -1
  115. package/version.mjs +1 -1
@@ -289,6 +289,161 @@ class Posts extends resource_1.APIResource {
289
289
  ]),
290
290
  });
291
291
  }
292
+ /**
293
+ * Search feedback posts with a structured filter AST, full-text search, sorting,
294
+ * and cursor pagination.
295
+ *
296
+ * ### Two modes (combinable)
297
+ *
298
+ * - **Filter mode** — pass a structured `query` AST (and/or `sort`) and the
299
+ * endpoint returns posts matching the filter, ordered by `sort` (default
300
+ * `created_at:desc`). Same shape as `/v2/conversations/search`,
301
+ * `/v2/companies/search`, `/v2/contacts/search`.
302
+ * - **Search mode** — pass a top-level `search` string and the endpoint runs a
303
+ * hybrid full-text + vector search (BM25 + embeddings, semanticRatio 0.5) over
304
+ * post `title` and `content`, returning matches ranked by relevance. Optional:
305
+ * combine with `query` to constrain the search to a board / status / time
306
+ * window, and/or `sort` to override relevance ranking with chronological order.
307
+ *
308
+ * ```json
309
+ * {
310
+ * "search": "mobile dark mode",
311
+ * "query": {
312
+ * "operator": "AND",
313
+ * "value": [
314
+ * {
315
+ * "field": "board_id",
316
+ * "operator": "IN",
317
+ * "value": ["507f1f77bcf86cd799439011"]
318
+ * }
319
+ * ]
320
+ * },
321
+ * "limit": 20
322
+ * }
323
+ * ```
324
+ *
325
+ * `search` is server-managed: no operators, no field selection, no special syntax
326
+ * — same plain-text contract as `/v2/conversations/search`. The string must be
327
+ * 1–500 characters; up to ~1024 BM25-tokenizer characters are forwarded to
328
+ * Turbopuffer (longer queries are truncated at a word boundary).
329
+ *
330
+ * ### Structured query AST
331
+ *
332
+ * Each clause has the shape `{ field, operator, value }`. You can pass a single
333
+ * clause or wrap up to 15 in a top-level `AND` group:
334
+ *
335
+ * ```json
336
+ * {
337
+ * "query": {
338
+ * "operator": "AND",
339
+ * "value": [
340
+ * {
341
+ * "field": "board_id",
342
+ * "operator": "IN",
343
+ * "value": ["507f1f77bcf86cd799439011"]
344
+ * },
345
+ * { "field": "upvotes", "operator": ">", "value": 10 }
346
+ * ]
347
+ * },
348
+ * "sort": "upvotes:desc",
349
+ * "limit": 20
350
+ * }
351
+ * ```
352
+ *
353
+ * Top-level `OR` groups and nested groups are not supported in this version.
354
+ *
355
+ * ### Supported fields and operators
356
+ *
357
+ * | Field | Type | Operators |
358
+ * | ----------------------------------------------------------------- | ---------------------------- | -------------------------------------------------- |
359
+ * | `board_id` | id (categoryId) | `=`, `!=`, `IN`, `NIN` |
360
+ * | `status_id` | id (postStatus) | `=`, `!=`, `IN`, `NIN` |
361
+ * | `tag_id` | id (postTags) | `=`, `!=`, `IN`, `NIN` |
362
+ * | `author_id` | string (user id) | `=`, `!=`, `IN`, `NIN` |
363
+ * | `assignee_id` | id or null (admin) | `=`, `!=`, `IN`, `NIN` (use `null` for unassigned) |
364
+ * | `company_id` | string (external company id) | `=`, `!=`, `IN`, `NIN` |
365
+ * | `created_at`, `updated_at`, `eta` | unix seconds | `=`, `!=`, `>`, `<`, `>=`, `<=` |
366
+ * | `upvotes`, `comment_count`, `monthly_spend`, `opportunity_amount` | number | `=`, `!=`, `>`, `<`, `>=`, `<=` |
367
+ * | `in_review`, `is_pinned` | boolean | `=`, `!=` |
368
+ *
369
+ * Use the top-level `search` field for full-text search across `title` and
370
+ * `content` (see "Search mode" above). The clause-level operators `~`, `!~`, `^`,
371
+ * `$` are reserved for future use and currently return `400`.
372
+ *
373
+ * A filter-mode query (no `search`) consisting only of `!=` or `NIN` clauses on
374
+ * unbounded fields is rejected with `query_too_broad` to prevent full-org scans.
375
+ * Combine the negation with at least one positive clause (`=`, `IN`, `>`, `<`)
376
+ * instead. Boolean fields (`in_review`, `is_pinned`) are bounded so a standalone
377
+ * negation on them is allowed. Search mode (with `search` set) relaxes this — the
378
+ * FTS query itself acts as the positive constraint.
379
+ *
380
+ * ### Sort
381
+ *
382
+ * Allowed values:
383
+ *
384
+ * - `created_at:desc` (default), `created_at:asc`
385
+ * - `updated_at:desc`, `updated_at:asc`
386
+ * - `upvotes:desc`, `upvotes:asc`
387
+ * - `eta:desc`, `eta:asc`
388
+ * - `trending_score:desc`, `trending_score:asc`
389
+ * - `monthly_spend:desc`, `monthly_spend:asc` (sum of upvoters' monthly spend)
390
+ * - `opportunity_amount:desc`, `opportunity_amount:asc` (linked HubSpot/Salesforce
391
+ * value)
392
+ * - `comment_count:desc`, `comment_count:asc`
393
+ *
394
+ * When `search` is set, results are ranked by relevance unless `sort` is also set,
395
+ * in which case the matching posts are returned in the requested order. The chosen
396
+ * sort axis (or relevance) is encoded in the cursor; switching `sort` (or toggling
397
+ * `search` on/off) mid-pagination returns `400 invalid_cursor`. Restart pagination
398
+ * without a cursor when changing the sort or search shape.
399
+ *
400
+ * ### Pagination
401
+ *
402
+ * Cursor-based, `limit` between 1 and 100 (default 10). In filter mode,
403
+ * `totalCount` is approximate and capped at 5000; `totalCountCapped` is `true`
404
+ * when the real count may be higher. In search mode, `totalCount` reflects the
405
+ * matching survivor set after the AST filter and is capped at 200 (the Turbopuffer
406
+ * top-K).
407
+ *
408
+ * ### Server-side guards
409
+ *
410
+ * These exclusions are always applied and CANNOT be disabled via the AST:
411
+ *
412
+ * - Spam posts (`isSpam: true`) are excluded.
413
+ * - Merged posts (those rolled into another post) are excluded — the canonical row
414
+ * is what's returned.
415
+ * - Support-board (ticket) categories are excluded — tickets have their own
416
+ * `/v2/tickets` surface.
417
+ *
418
+ * ### Response
419
+ *
420
+ * Returns a standard list envelope with post rows identical to
421
+ * `GET /v2/posts/{id}`.
422
+ *
423
+ * ### Version Availability
424
+ *
425
+ * This endpoint is only available in API version 2026-01-01.nova and newer.
426
+ *
427
+ * @example
428
+ * ```ts
429
+ * const response = await client.feedback.posts.search();
430
+ * ```
431
+ */
432
+ search(params, options) {
433
+ const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
434
+ return this._client.post('/v2/posts/search', {
435
+ body,
436
+ ...options,
437
+ headers: (0, headers_1.buildHeaders)([
438
+ {
439
+ ...(featurebaseVersion?.toString() != null ?
440
+ { 'Featurebase-Version': featurebaseVersion?.toString() }
441
+ : undefined),
442
+ },
443
+ options?.headers,
444
+ ]),
445
+ });
446
+ }
292
447
  }
293
448
  exports.Posts = Posts;
294
449
  Posts.Voters = voters_1.Voters;
@@ -1 +1 @@
1
- {"version":3,"file":"posts.js","sourceRoot":"","sources":["../../../src/resources/feedback/posts/posts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"posts.js","sourceRoot":"","sources":["../../../src/resources/feedback/posts/posts.ts"],"names":[],"mappings":"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"}
@@ -285,6 +285,161 @@ export class Posts extends APIResource {
285
285
  ]),
286
286
  });
287
287
  }
288
+ /**
289
+ * Search feedback posts with a structured filter AST, full-text search, sorting,
290
+ * and cursor pagination.
291
+ *
292
+ * ### Two modes (combinable)
293
+ *
294
+ * - **Filter mode** — pass a structured `query` AST (and/or `sort`) and the
295
+ * endpoint returns posts matching the filter, ordered by `sort` (default
296
+ * `created_at:desc`). Same shape as `/v2/conversations/search`,
297
+ * `/v2/companies/search`, `/v2/contacts/search`.
298
+ * - **Search mode** — pass a top-level `search` string and the endpoint runs a
299
+ * hybrid full-text + vector search (BM25 + embeddings, semanticRatio 0.5) over
300
+ * post `title` and `content`, returning matches ranked by relevance. Optional:
301
+ * combine with `query` to constrain the search to a board / status / time
302
+ * window, and/or `sort` to override relevance ranking with chronological order.
303
+ *
304
+ * ```json
305
+ * {
306
+ * "search": "mobile dark mode",
307
+ * "query": {
308
+ * "operator": "AND",
309
+ * "value": [
310
+ * {
311
+ * "field": "board_id",
312
+ * "operator": "IN",
313
+ * "value": ["507f1f77bcf86cd799439011"]
314
+ * }
315
+ * ]
316
+ * },
317
+ * "limit": 20
318
+ * }
319
+ * ```
320
+ *
321
+ * `search` is server-managed: no operators, no field selection, no special syntax
322
+ * — same plain-text contract as `/v2/conversations/search`. The string must be
323
+ * 1–500 characters; up to ~1024 BM25-tokenizer characters are forwarded to
324
+ * Turbopuffer (longer queries are truncated at a word boundary).
325
+ *
326
+ * ### Structured query AST
327
+ *
328
+ * Each clause has the shape `{ field, operator, value }`. You can pass a single
329
+ * clause or wrap up to 15 in a top-level `AND` group:
330
+ *
331
+ * ```json
332
+ * {
333
+ * "query": {
334
+ * "operator": "AND",
335
+ * "value": [
336
+ * {
337
+ * "field": "board_id",
338
+ * "operator": "IN",
339
+ * "value": ["507f1f77bcf86cd799439011"]
340
+ * },
341
+ * { "field": "upvotes", "operator": ">", "value": 10 }
342
+ * ]
343
+ * },
344
+ * "sort": "upvotes:desc",
345
+ * "limit": 20
346
+ * }
347
+ * ```
348
+ *
349
+ * Top-level `OR` groups and nested groups are not supported in this version.
350
+ *
351
+ * ### Supported fields and operators
352
+ *
353
+ * | Field | Type | Operators |
354
+ * | ----------------------------------------------------------------- | ---------------------------- | -------------------------------------------------- |
355
+ * | `board_id` | id (categoryId) | `=`, `!=`, `IN`, `NIN` |
356
+ * | `status_id` | id (postStatus) | `=`, `!=`, `IN`, `NIN` |
357
+ * | `tag_id` | id (postTags) | `=`, `!=`, `IN`, `NIN` |
358
+ * | `author_id` | string (user id) | `=`, `!=`, `IN`, `NIN` |
359
+ * | `assignee_id` | id or null (admin) | `=`, `!=`, `IN`, `NIN` (use `null` for unassigned) |
360
+ * | `company_id` | string (external company id) | `=`, `!=`, `IN`, `NIN` |
361
+ * | `created_at`, `updated_at`, `eta` | unix seconds | `=`, `!=`, `>`, `<`, `>=`, `<=` |
362
+ * | `upvotes`, `comment_count`, `monthly_spend`, `opportunity_amount` | number | `=`, `!=`, `>`, `<`, `>=`, `<=` |
363
+ * | `in_review`, `is_pinned` | boolean | `=`, `!=` |
364
+ *
365
+ * Use the top-level `search` field for full-text search across `title` and
366
+ * `content` (see "Search mode" above). The clause-level operators `~`, `!~`, `^`,
367
+ * `$` are reserved for future use and currently return `400`.
368
+ *
369
+ * A filter-mode query (no `search`) consisting only of `!=` or `NIN` clauses on
370
+ * unbounded fields is rejected with `query_too_broad` to prevent full-org scans.
371
+ * Combine the negation with at least one positive clause (`=`, `IN`, `>`, `<`)
372
+ * instead. Boolean fields (`in_review`, `is_pinned`) are bounded so a standalone
373
+ * negation on them is allowed. Search mode (with `search` set) relaxes this — the
374
+ * FTS query itself acts as the positive constraint.
375
+ *
376
+ * ### Sort
377
+ *
378
+ * Allowed values:
379
+ *
380
+ * - `created_at:desc` (default), `created_at:asc`
381
+ * - `updated_at:desc`, `updated_at:asc`
382
+ * - `upvotes:desc`, `upvotes:asc`
383
+ * - `eta:desc`, `eta:asc`
384
+ * - `trending_score:desc`, `trending_score:asc`
385
+ * - `monthly_spend:desc`, `monthly_spend:asc` (sum of upvoters' monthly spend)
386
+ * - `opportunity_amount:desc`, `opportunity_amount:asc` (linked HubSpot/Salesforce
387
+ * value)
388
+ * - `comment_count:desc`, `comment_count:asc`
389
+ *
390
+ * When `search` is set, results are ranked by relevance unless `sort` is also set,
391
+ * in which case the matching posts are returned in the requested order. The chosen
392
+ * sort axis (or relevance) is encoded in the cursor; switching `sort` (or toggling
393
+ * `search` on/off) mid-pagination returns `400 invalid_cursor`. Restart pagination
394
+ * without a cursor when changing the sort or search shape.
395
+ *
396
+ * ### Pagination
397
+ *
398
+ * Cursor-based, `limit` between 1 and 100 (default 10). In filter mode,
399
+ * `totalCount` is approximate and capped at 5000; `totalCountCapped` is `true`
400
+ * when the real count may be higher. In search mode, `totalCount` reflects the
401
+ * matching survivor set after the AST filter and is capped at 200 (the Turbopuffer
402
+ * top-K).
403
+ *
404
+ * ### Server-side guards
405
+ *
406
+ * These exclusions are always applied and CANNOT be disabled via the AST:
407
+ *
408
+ * - Spam posts (`isSpam: true`) are excluded.
409
+ * - Merged posts (those rolled into another post) are excluded — the canonical row
410
+ * is what's returned.
411
+ * - Support-board (ticket) categories are excluded — tickets have their own
412
+ * `/v2/tickets` surface.
413
+ *
414
+ * ### Response
415
+ *
416
+ * Returns a standard list envelope with post rows identical to
417
+ * `GET /v2/posts/{id}`.
418
+ *
419
+ * ### Version Availability
420
+ *
421
+ * This endpoint is only available in API version 2026-01-01.nova and newer.
422
+ *
423
+ * @example
424
+ * ```ts
425
+ * const response = await client.feedback.posts.search();
426
+ * ```
427
+ */
428
+ search(params, options) {
429
+ const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
430
+ return this._client.post('/v2/posts/search', {
431
+ body,
432
+ ...options,
433
+ headers: buildHeaders([
434
+ {
435
+ ...(featurebaseVersion?.toString() != null ?
436
+ { 'Featurebase-Version': featurebaseVersion?.toString() }
437
+ : undefined),
438
+ },
439
+ options?.headers,
440
+ ]),
441
+ });
442
+ }
288
443
  }
289
444
  Posts.Voters = Voters;
290
445
  //# sourceMappingURL=posts.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"posts.mjs","sourceRoot":"","sources":["../../../src/resources/feedback/posts/posts.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAE/E,EAAE,WAAW,EAAE;OAEf,KAAK,SAAS;OACd,EAQL,MAAM,GACP;OAGM,EAAE,UAAU,EAAsC;OAClD,EAAE,YAAY,EAAE;OAEhB,EAAE,IAAI,EAAE;AAEf;;GAEG;AACH,MAAM,OAAO,KAAM,SAAQ,WAAW;IAAtC;;QACE,WAAM,GAAqB,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAiShE,CAAC;IA/RC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkDG;IACH,MAAM,CAAC,MAAwB,EAAE,OAAwB;QACvD,MAAM,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QACtE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE;YACpC,IAAI;YACJ,GAAG,OAAO;YACV,OAAO,EAAE,YAAY,CAAC;gBACpB;oBACE,GAAG,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;wBAC1C,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE;wBAC3D,CAAC,CAAC,SAAS,CAAC;iBACb;gBACD,OAAO,EAAE,OAAO;aACjB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CACN,EAAU,EACV,SAAgD,EAAE,EAClD,OAAwB;QAExB,MAAM,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,aAAa,EAAE,EAAE,EAAE;YAC7C,GAAG,OAAO;YACV,OAAO,EAAE,YAAY,CAAC;gBACpB;oBACE,GAAG,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;wBAC1C,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE;wBAC3D,CAAC,CAAC,SAAS,CAAC;iBACb;gBACD,OAAO,EAAE,OAAO;aACjB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACH,MAAM,CAAC,EAAU,EAAE,MAAwB,EAAE,OAAwB;QACnE,MAAM,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QACtE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA,aAAa,EAAE,EAAE,EAAE;YAC/C,IAAI;YACJ,GAAG,OAAO;YACV,OAAO,EAAE,YAAY,CAAC;gBACpB;oBACE,GAAG,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;wBAC1C,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE;wBAC3D,CAAC,CAAC,SAAS,CAAC;iBACb;gBACD,OAAO,EAAE,OAAO;aACjB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2DG;IACH,IAAI,CACF,SAA4C,EAAE,EAC9C,OAAwB;QAExB,MAAM,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC7E,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAA,UAAgB,CAAA,EAAE;YAC5D,KAAK;YACL,GAAG,OAAO;YACV,OAAO,EAAE,YAAY,CAAC;gBACpB;oBACE,GAAG,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;wBAC1C,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE;wBAC3D,CAAC,CAAC,SAAS,CAAC;iBACb;gBACD,OAAO,EAAE,OAAO;aACjB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,MAAM,CACJ,EAAU,EACV,SAA8C,EAAE,EAChD,OAAwB;QAExB,MAAM,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAA,aAAa,EAAE,EAAE,EAAE;YAChD,GAAG,OAAO;YACV,OAAO,EAAE,YAAY,CAAC;gBACpB;oBACE,GAAG,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;wBAC1C,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE;wBAC3D,CAAC,CAAC,SAAS,CAAC;iBACb;gBACD,OAAO,EAAE,OAAO;aACjB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;CACF;AAuoBD,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"posts.mjs","sourceRoot":"","sources":["../../../src/resources/feedback/posts/posts.ts"],"names":[],"mappings":"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"}