issue-sticker 0.7.0 → 0.8.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  npm 패키지 `issue-sticker`의 변경 이력입니다. 설치·업그레이드에 영향을 주는 변경만 기록합니다.
4
4
 
5
+ ## 0.8.0 - 2026-09-14
6
+
7
+ ### 추가
8
+
9
+ - 멤버로 로그인하면 위젯 더보기 메뉴의 스티커 필터에서 날짜·커스텀 필드·Jira·Notion 조건으로 스티커를 필터링할 수 있습니다. 항목을 바꾸는 즉시 적용됩니다.
10
+ - 게스트에게는 스티커 필터 항목이 표시되지 않고, 필터도 적용되지 않습니다.
11
+ - 필터 값은 페이지 안에서만 유지되며 새로고침하면 초기화됩니다.
12
+
13
+ ### 개선
14
+
15
+ - 가이드에서 「건너뛰기」를 클릭하면 확인 없이 바로 닫힙니다.
16
+ - 백엔드 1.7.0부터 SDK가 동작하는 도메인을 워크스페이스에 등록된 호스트와 그 하위 도메인 기준으로 판정합니다. 포트·프로토콜은 구분하지 않습니다. SDK 코드 변경 없이 적용되며, 도메인 등록은 관리자 콘솔의 도메인 연결 메뉴에서 합니다.
17
+
5
18
  ## 0.7.0 - 2026-09-13
6
19
 
7
20
  ### 호환성이 깨지는 변경
@@ -4967,6 +4967,182 @@ function buildJiraCreateFields(exposedFields, fieldDefinitions = [], values = {}
4967
4967
  includeReadonly: false
4968
4968
  }).filter((field) => knownFieldIds.has(normalizeJiraFieldId(field.id))).filter((field) => !CREATE_UNSUPPORTED_FIELD_IDS.has(normalizeJiraFieldId(field.id)));
4969
4969
  }
4970
+ const JIRA_FILTERABLE_FIELD_IDS = /* @__PURE__ */ new Set([
4971
+ "status",
4972
+ "priority",
4973
+ "assignee",
4974
+ "reporter",
4975
+ "fixVersions",
4976
+ "issuetype",
4977
+ "project_key",
4978
+ "sprint_id",
4979
+ "sprint_name",
4980
+ "epic_link",
4981
+ "story_points"
4982
+ ]);
4983
+ const NOTION_FILTERABLE_FIELD_TYPES = /* @__PURE__ */ new Set(["select", "multi_select", "status", "checkbox"]);
4984
+ function getJiraConfig(integration) {
4985
+ if (integration.service_type !== "JIRA") return null;
4986
+ return integration.config ?? null;
4987
+ }
4988
+ function getNotionConfig(integration) {
4989
+ if (integration.service_type !== "NOTION") return null;
4990
+ return integration.config ?? null;
4991
+ }
4992
+ function getExposedFields(config) {
4993
+ if (!(config == null ? void 0 : config.exposed_fields)) return [];
4994
+ return normalizeExposedJiraFields(
4995
+ Array.isArray(config.exposed_fields) ? config.exposed_fields : void 0
4996
+ );
4997
+ }
4998
+ function getLastKnownJiraFields(config) {
4999
+ const fields = config == null ? void 0 : config.last_known_fields;
5000
+ if (!Array.isArray(fields)) return [];
5001
+ return fields.filter(
5002
+ (field) => Boolean(field) && typeof field === "object" && typeof field.id === "string" && typeof field.name === "string"
5003
+ );
5004
+ }
5005
+ function getSelectedNotionFields(config) {
5006
+ const fields = config == null ? void 0 : config.selected_fields;
5007
+ if (!Array.isArray(fields)) return [];
5008
+ return fields.filter((field) => typeof field === "string");
5009
+ }
5010
+ function getLastKnownNotionFields(config) {
5011
+ const fields = config == null ? void 0 : config.last_known_fields;
5012
+ if (!Array.isArray(fields)) return [];
5013
+ return fields.filter(
5014
+ (field) => Boolean(field) && typeof field === "object" && typeof field.id === "string" && typeof field.name === "string" && typeof field.type === "string"
5015
+ );
5016
+ }
5017
+ const OPTION_CUSTOM_FIELD_TYPES = /* @__PURE__ */ new Set(["select", "multi_select"]);
5018
+ function getSelectableCustomFieldOptions(field) {
5019
+ var _a;
5020
+ if (!OPTION_CUSTOM_FIELD_TYPES.has(field.field_type)) return [];
5021
+ const rawOptions = (_a = field.field_config) == null ? void 0 : _a.options;
5022
+ if (!Array.isArray(rawOptions)) return [];
5023
+ return rawOptions.filter((option) => typeof option === "string" && option.trim().length > 0).map((option) => ({ label: option, value: option }));
5024
+ }
5025
+ function getJiraOptionValue(option) {
5026
+ return option.id;
5027
+ }
5028
+ function getJiraFieldFilterOptions(field) {
5029
+ const options = field.options ?? [];
5030
+ if (!options.length) return [];
5031
+ return options.map((option) => ({
5032
+ label: option.name || option.value || option.id,
5033
+ value: getJiraOptionValue(option)
5034
+ })).filter((option) => option.value.length > 0);
5035
+ }
5036
+ function getNotionFieldFilterOptions(field) {
5037
+ if (field.type === "checkbox") {
5038
+ return [
5039
+ { label: "체크됨", value: "true" },
5040
+ { label: "체크 안 됨", value: "false" }
5041
+ ];
5042
+ }
5043
+ const options = field.options ?? [];
5044
+ if (!options.length) return [];
5045
+ return options.map((option) => ({
5046
+ label: option.name,
5047
+ value: option.name
5048
+ })).filter((option) => option.value.length > 0);
5049
+ }
5050
+ function mergeOptions(current, next) {
5051
+ const byValue = new Map(current.map((option) => [option.value, option]));
5052
+ for (const option of next) {
5053
+ if (!byValue.has(option.value)) {
5054
+ byValue.set(option.value, option);
5055
+ }
5056
+ }
5057
+ return Array.from(byValue.values()).sort((a2, b) => a2.label.localeCompare(b.label));
5058
+ }
5059
+ function upsertFilterGroup(groups, group) {
5060
+ const existing = groups.get(group.id);
5061
+ if (!existing) {
5062
+ groups.set(group.id, {
5063
+ ...group,
5064
+ options: mergeOptions([], group.options)
5065
+ });
5066
+ return;
5067
+ }
5068
+ groups.set(group.id, {
5069
+ ...existing,
5070
+ options: mergeOptions(existing.options, group.options)
5071
+ });
5072
+ }
5073
+ function appendCustomFieldFilterGroups(groups, customFields) {
5074
+ for (const field of customFields) {
5075
+ const options = getSelectableCustomFieldOptions(field);
5076
+ if (!options.length) continue;
5077
+ upsertFilterGroup(groups, {
5078
+ kind: "custom",
5079
+ id: `custom:${field.id}`,
5080
+ fieldDefinitionId: field.id,
5081
+ label: field.field_name,
5082
+ options
5083
+ });
5084
+ }
5085
+ }
5086
+ function appendJiraFieldFilterGroups(groups, exposedFieldIds, fields) {
5087
+ for (const field of fields) {
5088
+ const normalizedFieldId = normalizeJiraFieldId(field.id);
5089
+ if (!exposedFieldIds.has(normalizedFieldId) || !JIRA_FILTERABLE_FIELD_IDS.has(normalizedFieldId)) {
5090
+ continue;
5091
+ }
5092
+ const options = getJiraFieldFilterOptions(field);
5093
+ if (!options.length) continue;
5094
+ upsertFilterGroup(groups, {
5095
+ kind: "jira",
5096
+ id: `jira:${normalizedFieldId}`,
5097
+ fieldName: normalizedFieldId,
5098
+ label: field.name,
5099
+ options
5100
+ });
5101
+ }
5102
+ }
5103
+ function appendNotionFieldFilterGroups(groups, selectedFields, fields) {
5104
+ for (const field of fields) {
5105
+ if (!selectedFields.has(field.id) && !selectedFields.has(field.name)) continue;
5106
+ if (!NOTION_FILTERABLE_FIELD_TYPES.has(field.type)) continue;
5107
+ const options = getNotionFieldFilterOptions(field);
5108
+ if (!options.length) continue;
5109
+ upsertFilterGroup(groups, {
5110
+ kind: "notion",
5111
+ id: `notion:${field.id}`,
5112
+ fieldName: field.name,
5113
+ label: field.name,
5114
+ options
5115
+ });
5116
+ }
5117
+ }
5118
+ function composeIssueFilterGroups(integrations, customFields) {
5119
+ const groups = /* @__PURE__ */ new Map();
5120
+ const jiraIntegration = integrations.find((integration) => {
5121
+ const config = getJiraConfig(integration);
5122
+ return integration.is_active !== false && config;
5123
+ });
5124
+ appendCustomFieldFilterGroups(groups, customFields);
5125
+ const jiraConfig = jiraIntegration ? getJiraConfig(jiraIntegration) : null;
5126
+ const configExposedFields = getExposedFields(jiraConfig);
5127
+ if (configExposedFields.length) {
5128
+ appendJiraFieldFilterGroups(
5129
+ groups,
5130
+ new Set(configExposedFields),
5131
+ getLastKnownJiraFields(jiraConfig)
5132
+ );
5133
+ }
5134
+ for (const integration of integrations) {
5135
+ if (integration.is_active === false) continue;
5136
+ const notionConfig = getNotionConfig(integration);
5137
+ if (!notionConfig) continue;
5138
+ appendNotionFieldFilterGroups(
5139
+ groups,
5140
+ new Set(getSelectedNotionFields(notionConfig)),
5141
+ getLastKnownNotionFields(notionConfig)
5142
+ );
5143
+ }
5144
+ return Array.from(groups.values()).sort((a2, b) => a2.label.localeCompare(b.label));
5145
+ }
4970
5146
  const STABLE_ATTR_KEYS = [
4971
5147
  "data-testid",
4972
5148
  "data-test",
@@ -6486,7 +6662,7 @@ var Popover$1 = (props) => {
6486
6662
  };
6487
6663
  Popover$1.displayName = POPOVER_NAME;
6488
6664
  var ANCHOR_NAME = "PopoverAnchor";
6489
- var PopoverAnchor = React.forwardRef(
6665
+ var PopoverAnchor$1 = React.forwardRef(
6490
6666
  (props, forwardedRef) => {
6491
6667
  const { __scopePopover, ...anchorProps } = props;
6492
6668
  const context = usePopoverContext(ANCHOR_NAME, __scopePopover);
@@ -6499,7 +6675,7 @@ var PopoverAnchor = React.forwardRef(
6499
6675
  return /* @__PURE__ */ jsx(Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });
6500
6676
  }
6501
6677
  );
6502
- PopoverAnchor.displayName = ANCHOR_NAME;
6678
+ PopoverAnchor$1.displayName = ANCHOR_NAME;
6503
6679
  var TRIGGER_NAME$1 = "PopoverTrigger";
6504
6680
  var PopoverTrigger$1 = React.forwardRef(
6505
6681
  (props, forwardedRef) => {
@@ -6722,11 +6898,13 @@ function getState(open) {
6722
6898
  return open ? "open" : "closed";
6723
6899
  }
6724
6900
  var Root2 = Popover$1;
6901
+ var Anchor2 = PopoverAnchor$1;
6725
6902
  var Trigger = PopoverTrigger$1;
6726
6903
  var Portal = PopoverPortal;
6727
6904
  var Content2 = PopoverContent$1;
6728
6905
  const Popover = Root2;
6729
6906
  const PopoverTrigger = Trigger;
6907
+ const PopoverAnchor = Anchor2;
6730
6908
  const PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 6, onEscapeKeyDown, ...props }, ref) => {
6731
6909
  const portalContainer = usePortalContainer();
6732
6910
  return /* @__PURE__ */ jsx(Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
@@ -12786,12 +12964,6 @@ const DEFAULT_LABELS = {
12786
12964
  badge: "가이드",
12787
12965
  close: "가이드 닫기",
12788
12966
  skip: "건너뛰기",
12789
- skipConfirmTitle: "가이드를 건너뛸까요?",
12790
- // 채널마다 진입점이 다르다(admin=헤더 아이콘, extension=더보기 메뉴, sdk=FAB 메뉴).
12791
- // 위치를 특정하면 어느 한쪽에서는 틀린 안내가 되므로 라벨만 가리킨다.
12792
- skipConfirmBody: "'가이드 다시 보기'를 클릭하면 언제든 다시 열 수 있습니다.",
12793
- skipConfirmCancel: "계속 보기",
12794
- skipConfirmConfirm: "건너뛰기",
12795
12967
  previous: "이전",
12796
12968
  next: "다음",
12797
12969
  done: "완료",
@@ -13048,64 +13220,10 @@ function OnboardingPopoverContent({
13048
13220
  canGoPrevious,
13049
13221
  isLast,
13050
13222
  isVisible,
13051
- isSkipConfirmOpen,
13052
- onRequestSkip,
13053
- onCancelSkip,
13054
- onConfirmSkip,
13223
+ onSkip,
13055
13224
  onNext,
13056
13225
  onPrevious
13057
13226
  }) {
13058
- if (isSkipConfirmOpen) {
13059
- return /* @__PURE__ */ jsxs(
13060
- "div",
13061
- {
13062
- role: "alertdialog",
13063
- "aria-modal": "false",
13064
- "aria-labelledby": "issue-sticker-onboarding-skip-title",
13065
- "aria-describedby": "issue-sticker-onboarding-skip-desc",
13066
- children: [
13067
- /* @__PURE__ */ jsx(
13068
- "h2",
13069
- {
13070
- id: "issue-sticker-onboarding-skip-title",
13071
- className: "text-sm font-semibold leading-5 text-text-primary",
13072
- children: labels.skipConfirmTitle
13073
- }
13074
- ),
13075
- /* @__PURE__ */ jsx(
13076
- "p",
13077
- {
13078
- id: "issue-sticker-onboarding-skip-desc",
13079
- className: "mt-2 whitespace-pre-line text-sm leading-5 text-text-secondary",
13080
- children: labels.skipConfirmBody
13081
- }
13082
- ),
13083
- /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center justify-end gap-2", children: [
13084
- /* @__PURE__ */ jsx(
13085
- "button",
13086
- {
13087
- type: "button",
13088
- onClick: onCancelSkip,
13089
- disabled: !isVisible,
13090
- className: "inline-flex h-[30px] items-center justify-center rounded-md border border-line-subtle px-2.5 text-xs font-semibold text-text-secondary transition-colors hover:bg-surface-2 hover:text-text-primary focus-visible:outline-none focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50",
13091
- children: labels.skipConfirmCancel
13092
- }
13093
- ),
13094
- /* @__PURE__ */ jsx(
13095
- "button",
13096
- {
13097
- type: "button",
13098
- onClick: onConfirmSkip,
13099
- disabled: !isVisible,
13100
- className: "inline-flex h-[30px] items-center justify-center rounded-md border border-line-subtle px-2.5 text-xs font-semibold text-text-primary transition-colors hover:bg-surface-2 focus-visible:outline-none focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50",
13101
- children: labels.skipConfirmConfirm
13102
- }
13103
- )
13104
- ] })
13105
- ]
13106
- }
13107
- );
13108
- }
13109
13227
  const hasNextButton = shouldRenderNextButton(step);
13110
13228
  return /* @__PURE__ */ jsxs("div", { children: [
13111
13229
  /* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold leading-5 text-text-primary", children: step.title }),
@@ -13134,7 +13252,7 @@ function OnboardingPopoverContent({
13134
13252
  "button",
13135
13253
  {
13136
13254
  type: "button",
13137
- onClick: onRequestSkip,
13255
+ onClick: onSkip,
13138
13256
  disabled: !isVisible,
13139
13257
  className: LINK_BUTTON_CLASS,
13140
13258
  children: labels.skip
@@ -13145,7 +13263,7 @@ function OnboardingPopoverContent({
13145
13263
  {
13146
13264
  type: "button",
13147
13265
  onClick: onPrevious,
13148
- disabled: !isVisible || isSkipConfirmOpen,
13266
+ disabled: !isVisible,
13149
13267
  className: LINK_BUTTON_CLASS,
13150
13268
  children: labels.previous
13151
13269
  }
@@ -13157,7 +13275,7 @@ function OnboardingPopoverContent({
13157
13275
  {
13158
13276
  type: "button",
13159
13277
  onClick: onPrevious,
13160
- disabled: !isVisible || isSkipConfirmOpen,
13278
+ disabled: !isVisible,
13161
13279
  className: "inline-flex h-[30px] items-center justify-center rounded-md border border-line-subtle px-2.5 text-xs font-semibold text-text-secondary transition-colors hover:bg-surface-2 hover:text-text-primary focus-visible:outline-none focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50",
13162
13280
  children: labels.previous
13163
13281
  }
@@ -13167,7 +13285,7 @@ function OnboardingPopoverContent({
13167
13285
  {
13168
13286
  type: "button",
13169
13287
  onClick: onNext,
13170
- disabled: !isVisible || isSkipConfirmOpen,
13288
+ disabled: !isVisible,
13171
13289
  className: "inline-flex h-[30px] items-center justify-center rounded-md border border-line-subtle px-2.5 text-xs font-semibold text-text-primary transition-colors hover:bg-surface-2 focus-visible:outline-none focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50",
13172
13290
  children: isLast ? labels.done : step.nextLabel ?? labels.next
13173
13291
  }
@@ -13194,7 +13312,6 @@ function OnboardingOverlay({
13194
13312
  }) {
13195
13313
  const maskId = React.useId().replace(/:/g, "");
13196
13314
  const renderHighlight = (node) => elevateHighlight && typeof document !== "undefined" ? ReactDOM.createPortal(node, document.body) : node;
13197
- const [isSkipConfirmOpen, setIsSkipConfirmOpen] = React.useState(false);
13198
13315
  const cutoutRect = targetRect ? padRect(targetRect, MASK_PADDING) : null;
13199
13316
  const cutoutRadius = cutoutRect ? Math.min(
13200
13317
  targetRadius === null || targetRadius === void 0 ? CUTOUT_RADIUS : targetRadius + MASK_PADDING,
@@ -13219,7 +13336,7 @@ function OnboardingOverlay({
13219
13336
  const observer = new ResizeObserver(measure);
13220
13337
  observer.observe(element);
13221
13338
  return () => observer.disconnect();
13222
- }, [step.id, step.body, isSkipConfirmOpen]);
13339
+ }, [step.id, step.body]);
13223
13340
  const effectiveSize = popoverSize && popoverSize.width > 0 && popoverSize.height > 0 ? popoverSize : DEFAULT_POPOVER_SIZE;
13224
13341
  const placement = resolvePopoverPlacement(
13225
13342
  step.position ?? (cutoutRect ? "bottom" : "center"),
@@ -13233,9 +13350,6 @@ function OnboardingOverlay({
13233
13350
  const isPassthrough = !!step.advanceOn;
13234
13351
  const isTargetInteraction = isTargetInteractionStep(step);
13235
13352
  const clickHint = isTargetInteraction ? step.clickHint ?? labels.clickHint : null;
13236
- React.useEffect(() => {
13237
- setIsSkipConfirmOpen(false);
13238
- }, [step.id]);
13239
13353
  return /* @__PURE__ */ jsxs(
13240
13354
  "div",
13241
13355
  {
@@ -13378,7 +13492,6 @@ function OnboardingOverlay({
13378
13492
  }
13379
13493
  )
13380
13494
  ) : null,
13381
- isSkipConfirmOpen ? /* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: "fixed inset-0 pointer-events-auto" }) : null,
13382
13495
  renderHighlight(
13383
13496
  /* @__PURE__ */ jsx(
13384
13497
  "div",
@@ -13405,10 +13518,7 @@ function OnboardingOverlay({
13405
13518
  canGoPrevious,
13406
13519
  isLast,
13407
13520
  isVisible: isPopoverVisible,
13408
- isSkipConfirmOpen,
13409
- onRequestSkip: () => setIsSkipConfirmOpen(true),
13410
- onCancelSkip: () => setIsSkipConfirmOpen(false),
13411
- onConfirmSkip: onSkip,
13521
+ onSkip,
13412
13522
  onNext,
13413
13523
  onPrevious
13414
13524
  }
@@ -14073,49 +14183,49 @@ function buildExternalUserPayload(user) {
14073
14183
  };
14074
14184
  }
14075
14185
  export {
14076
- DatePicker as $,
14077
- createSafeLogBackup as A,
14078
- getLogBackupSessionId as B,
14186
+ getNotionPageMetadata as $,
14187
+ getLogBackupSessionId as A,
14188
+ createIndexedDbLogBackup as B,
14079
14189
  ConsoleCollector as C,
14080
- createIndexedDbLogBackup as D,
14081
- PopoverTrigger as E,
14082
- Input as F,
14083
- PopoverContent as G,
14084
- Select$1 as H,
14190
+ PopoverTrigger as D,
14191
+ Input as E,
14192
+ PopoverContent as F,
14193
+ Select$1 as G,
14194
+ SelectTrigger as H,
14085
14195
  ISSUE_STICKER_INTERNAL_LOG_PREFIX as I,
14086
- SelectTrigger as J,
14087
- SelectValue as K,
14196
+ SelectValue as J,
14197
+ SelectContent as K,
14088
14198
  Label as L,
14089
- SelectContent as M,
14199
+ SelectItem as M,
14090
14200
  NetworkCollector as N,
14091
- SelectItem as O,
14201
+ getJiraMetadata as O,
14092
14202
  Popover as P,
14093
- getJiraMetadata as Q,
14094
- buildJiraIssueFields as R,
14203
+ buildJiraIssueFields as Q,
14204
+ Button$1 as R,
14095
14205
  ScreenRecordingController as S,
14096
- Button$1 as T,
14097
- Root2 as U,
14098
- Trigger as V,
14099
- ChevronDown as W,
14100
- Portal as X,
14101
- Content2 as Y,
14102
- Check as Z,
14103
- X as _,
14206
+ Root2 as T,
14207
+ Trigger as U,
14208
+ ChevronDown as V,
14209
+ Portal as W,
14210
+ Content2 as X,
14211
+ Check as Y,
14212
+ X as Z,
14213
+ DatePicker as _,
14104
14214
  uploadSignedMediaWithApi as a,
14105
- getNotionPageMetadata as a0,
14106
- buildNotionFieldViews as a1,
14107
- DirectUploadError as a2,
14108
- toast as a3,
14109
- getSnapshot as a4,
14110
- subscribe as a5,
14111
- getRegisteredUploadId as a6,
14112
- ChevronRight as a7,
14113
- ReactRemoveScroll as a8,
14114
- hideOthers as a9,
14115
- useFocusGuards as aa,
14116
- FocusScope as ab,
14117
- getExposedJiraFields as ac,
14118
- isJiraFieldExposed as ad,
14215
+ buildNotionFieldViews as a0,
14216
+ DirectUploadError as a1,
14217
+ toast as a2,
14218
+ getSnapshot as a3,
14219
+ subscribe as a4,
14220
+ getRegisteredUploadId as a5,
14221
+ ChevronRight as a6,
14222
+ ReactRemoveScroll as a7,
14223
+ hideOthers as a8,
14224
+ useFocusGuards as a9,
14225
+ FocusScope as aa,
14226
+ getExposedJiraFields as ab,
14227
+ isJiraFieldExposed as ac,
14228
+ normalizeExposedJiraFields as ad,
14119
14229
  getPrimaryJiraMapping as ae,
14120
14230
  createCollection as af,
14121
14231
  useDirection as ag,
@@ -14126,29 +14236,30 @@ export {
14126
14236
  OnboardingProvider as al,
14127
14237
  useOnboardingTarget as am,
14128
14238
  useOnboardingFlow as an,
14129
- normalizeJiraFieldId as b,
14239
+ PopoverAnchor as ao,
14240
+ buildJiraCreateFields as b,
14130
14241
  captureWithModernScreenshot as c,
14131
14242
  directUploadToSignedUrl as d,
14132
- buildJiraCreateFields as e,
14133
- buildNotionCreateFields as f,
14243
+ buildNotionCreateFields as e,
14244
+ buildGuestOwnerQuery as f,
14134
14245
  getElementPosition as g,
14135
- buildGuestOwnerQuery as h,
14246
+ composeIssueFilterGroups as h,
14136
14247
  buildIssueIntegrationsPayload as i,
14137
14248
  devLogger as j,
14138
14249
  filterExcludeServiceRelatedLogs as k,
14139
14250
  filterExcludeServiceRelatedConsoleLogs as l,
14140
14251
  compactNetworkLogsForTransport as m,
14141
- normalizeExposedJiraFields as n,
14142
- CONSOLE_LOG_SUBMIT_LIMIT as o,
14252
+ CONSOLE_LOG_SUBMIT_LIMIT as n,
14253
+ buildExternalUserPayload as o,
14143
14254
  pristineFetch as p,
14144
- buildExternalUserPayload as q,
14145
- shrinkNetworkLogsToFit as r,
14255
+ shrinkNetworkLogsToFit as q,
14256
+ measureJsonBytes as r,
14146
14257
  selectNetworkLogsForSubmit as s,
14147
- measureJsonBytes as t,
14258
+ sanitizeString as t,
14148
14259
  uploadScreenshotDataUrls as u,
14149
- sanitizeString as v,
14150
- getCurrentPageUrl as w,
14151
- SessionReplayCaptureController as x,
14152
- preloadModernScreenshot as y,
14153
- trimLogBackupPayload as z
14260
+ getCurrentPageUrl as v,
14261
+ SessionReplayCaptureController as w,
14262
+ preloadModernScreenshot as x,
14263
+ trimLogBackupPayload as y,
14264
+ createSafeLogBackup as z
14154
14265
  };