@bridge-ds/core 0.20.0 → 0.22.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.
@@ -613,7 +613,7 @@ function previewComment(input) {
613
613
  const sha7 = input.sha.slice(0, 7);
614
614
  const lines = [PREVIEW_COMMENT_MARKER, input.exploration ? "## Try this exploration in your product" : "## Try this DS branch in your product", ""];
615
615
  lines.push(`Snapshot of \`${sha7}\` on \`${input.branch}\`. Install it in a product branch that deploys to staging; production keeps the released version.`, "");
616
- if (input.exploration) lines.push("This is an exploration: it is never merged as is. Use it for a prototype, a user test, a demo or an A/B idea, then promote it to review or close it.", "");
616
+ if (input.exploration) lines.push("This is an exploration: it is never merged as is. Use it for a prototype, a user test, a demo or an A/B idea, then say it is done exploring: developers take it from there, and it stays open so this preview keeps working.", "");
617
617
  if (input.packages.length) {
618
618
  lines.push("```sh", installCommand(input.packages.map((p) => input.exploration ? `${p.name}@${p.url}` : p.url)), "```", "");
619
619
  lines.push("| Package | Install this package only |", "| --- | --- |");
@@ -717,7 +717,7 @@ const STATE_OF = {
717
717
  deployed: "ready",
718
718
  ready: "ready",
719
719
  ignored: "ready",
720
- // Vercel skipped the build (nothing changed for this app): the branch alias serves the last one.
720
+ // Vercel skipped the build: nothing to wait for. BranchPreview.skipped says the branch has no build of its own.
721
721
  pending: "building",
722
722
  queued: "building",
723
723
  in_progress: "building",
@@ -729,13 +729,15 @@ const STATE_OF = {
729
729
  canceled: "failed"
730
730
  };
731
731
  const stateOf = (s) => STATE_OF[(s ?? "").toLowerCase()] ?? "unknown";
732
+ const IGNORED_BUILD = /ignored build step/i;
732
733
  const isInspectorUrl = (u) => /^https:\/\/(?:www\.)?vercel\.com\//i.test(u);
733
734
  function resolveBranchPreviews(apps, ctx, sources = {}) {
734
735
  const seen = /* @__PURE__ */ new Map();
735
736
  const at = (app) => seen.get(app) ?? (seen.set(app, {}), seen.get(app));
736
- const offer = (app, url, urlSource, state, stateRank) => {
737
+ const offer = (app, url, urlSource, state, stateRank, skipped) => {
737
738
  if (!app) return;
738
739
  const s = at(app);
740
+ if (skipped !== void 0 && (s.skipRank === void 0 || stateRank < s.skipRank)) Object.assign(s, { skipped, skipRank: stateRank });
739
741
  if (url && !s.url) Object.assign(s, { url, urlSource });
740
742
  if (state !== "unknown" && (s.stateRank === void 0 || stateRank < s.stateRank)) Object.assign(s, { state, stateRank });
741
743
  };
@@ -746,7 +748,7 @@ function resolveBranchPreviews(apps, ctx, sources = {}) {
746
748
  const project = projectOfLabel(st.context);
747
749
  if (!project) continue;
748
750
  const url = httpsUrl(st.target_url);
749
- offer(appForProject(project, apps), url && !isInspectorUrl(url) ? url : null, "status", stateOf(st.state), 0);
751
+ offer(appForProject(project, apps), url && !isInspectorUrl(url) ? url : null, "status", stateOf(st.state), 0, IGNORED_BUILD.test(st.description ?? ""));
750
752
  }
751
753
  for (const d of sources.deployments ?? []) {
752
754
  const project = projectOfLabel(d.environment);
@@ -758,18 +760,18 @@ function resolveBranchPreviews(apps, ctx, sources = {}) {
758
760
  const state = stateOf(d.state);
759
761
  if (state !== "unknown" && (s.stateRank === void 0 || 1 < s.stateRank)) Object.assign(s, { state, stateRank: 1 });
760
762
  }
761
- for (const p of parseVercelComment(findVercelComment(sources.comments ?? [])?.body) ?? []) offer(appForProject(p.name, apps), p.previewUrl, "vercel-comment", stateOf(p.status), 2);
763
+ for (const p of parseVercelComment(findVercelComment(sources.comments ?? [])?.body) ?? []) offer(appForProject(p.name, apps), p.previewUrl, "vercel-comment", stateOf(p.status), 2, p.status ? p.status.toUpperCase() === "IGNORED" : void 0);
762
764
  const out = [];
763
765
  for (const app of Object.keys(PREVIEW_APP_LABELS)) {
764
766
  if (!apps[app]) continue;
765
767
  const s = seen.get(app) ?? {};
766
768
  const url = s.url ?? previewUrl(apps[app], ctx);
767
769
  const source = s.url ? s.urlSource : url ? "template" : null;
768
- out.push({ app, label: PREVIEW_APP_LABELS[app], url, state: s.state ?? "unknown", source });
770
+ out.push({ app, label: PREVIEW_APP_LABELS[app], url, state: s.state ?? "unknown", source, ...s.skipped ? { skipped: true } : {} });
769
771
  }
770
772
  return out;
771
773
  }
772
- const previewLinksOf = (previews) => previews.filter((p) => !!p.url).map((p) => ({ app: p.app, label: p.label, url: p.url }));
774
+ const previewLinksOf = (previews) => previews.filter((p) => !!p.url && !p.skipped).map((p) => ({ app: p.app, label: p.label, url: p.url }));
773
775
  const previewsSettled = (previews) => previews.every((p) => p.state === "failed" || !!p.url && p.state === "ready");
774
776
  const LOGIN = /^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$/;
775
777
  const SLUG = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
@@ -1165,9 +1167,30 @@ function productForPlace(products, place) {
1165
1167
  }
1166
1168
  return { product: defaultProduct(products), how: "default" };
1167
1169
  }
1170
+ function productRepoOf(p, designSystemRepo) {
1171
+ const repo = p?.repo?.trim();
1172
+ if (!repo || !REPO.test(repo)) return null;
1173
+ return repo.toLowerCase() === (designSystemRepo ?? "").trim().toLowerCase() ? null : repo;
1174
+ }
1175
+ function productRepos(products, designSystemRepo) {
1176
+ const seen = /* @__PURE__ */ new Set();
1177
+ const out = [];
1178
+ for (const p of products) {
1179
+ const repo = productRepoOf(p, designSystemRepo);
1180
+ if (!repo || seen.has(repo.toLowerCase())) continue;
1181
+ seen.add(repo.toLowerCase());
1182
+ out.push({ product: p, repo });
1183
+ }
1184
+ return out;
1185
+ }
1186
+ function productOfRepo(products, repo, designSystemRepo) {
1187
+ const r = (repo ?? "").trim().toLowerCase();
1188
+ if (!r) return void 0;
1189
+ return productRepos(products, designSystemRepo).find((x) => x.repo.toLowerCase() === r)?.product;
1190
+ }
1168
1191
  const KEY = /^[a-z0-9][a-z0-9-]*$/;
1169
1192
  const REPO = /^[\w.-]+\/[\w.-]+$/;
1170
- const FIELDS = ["key", "name", "repo", "path", "preview", "framework", "default"];
1193
+ const FIELDS = ["key", "name", "repo", "path", "preview", "production", "framework", "default"];
1171
1194
  function productProblems(raw) {
1172
1195
  if (raw === void 0) return [];
1173
1196
  if (!Array.isArray(raw)) return ['"products" must be a list of { "key", "name" } objects'];
@@ -1193,6 +1216,7 @@ function productProblems(raw) {
1193
1216
  if (bad) problems.push(`${at}.path" must be a folder relative to the repository root, without a leading "/" or "..", such as "apps/admin"`);
1194
1217
  }
1195
1218
  if (o.preview !== void 0 && (typeof o.preview !== "string" || !/^https?:\/\//.test(o.preview))) problems.push(`${at}.preview" must be an http(s) URL template, such as "https://app-git-{branch}.vercel.app"`);
1219
+ if (o.production !== void 0 && (typeof o.production !== "string" || !/^https?:\/\/[^{}\s]+$/.test(o.production))) problems.push(`${at}.production" must be the product's production URL, without placeholders, such as "https://shop.example.com"`);
1196
1220
  if (o.framework !== void 0 && (typeof o.framework !== "string" || !o.framework.trim())) problems.push(`${at}.framework" must be a name such as "react", "vue" or "other"`);
1197
1221
  if (o.default !== void 0 && typeof o.default !== "boolean") problems.push(`${at}.default" must be true or false`);
1198
1222
  if (o.default === true) defaults++;
@@ -2693,6 +2717,7 @@ ${body}
2693
2717
 
2694
2718
  ${footer}`;
2695
2719
  }
2720
+ const pieceValueField = (v) => `${v.property ?? v.category}${v.part ? ` (${v.part})` : ""}`;
2696
2721
  const PIECES_MARK = "bridge-pieces";
2697
2722
  const NEEDED_MARK = "bridge-needed-by";
2698
2723
  const SECTION = "### Missing from the library";
@@ -2718,7 +2743,7 @@ function piecesSection(r) {
2718
2743
  const link = (p) => r.links.find((l) => l.piece === p.id);
2719
2744
  const lines = r.pieces.length ? r.pieces.map((p) => {
2720
2745
  const l = link(p);
2721
- return `- **${p.title}**: ${p.summary}${l ? ` ${cap(KIND_WORD[l.kind])}: #${l.number}.` : " No library branch yet."}`;
2746
+ return `- **${p.title}**: ${p.summary}${l ? ` ${cap(KIND_WORD[l.kind])}: ${l.repo ?? ""}#${l.number}.` : " No library branch yet."}`;
2722
2747
  }) : ["- Nothing: every value and component comes from the library."];
2723
2748
  return [SECTION, "", `Checked ${r.checkedAt.slice(0, 10)}${r.headSha ? ` on ${r.headSha.slice(0, 7)}` : ""} by Bridge.`, "", ...lines, "", hiddenJson(PIECES_MARK, r)].join("\n");
2724
2749
  }
@@ -2744,10 +2769,12 @@ function mergePiecesRecord(prev, next) {
2744
2769
  function withLink(r, l) {
2745
2770
  return { ...r, links: [...r.links.filter((x) => x.piece !== l.piece), l] };
2746
2771
  }
2772
+ const prRef = (b) => `${b.repo ? b.repo : ""}#${b.pr}`;
2747
2773
  function neededBySection(n) {
2748
2774
  const who = n.author ? ` for @${n.author}` : "";
2749
- const near = n.nearest ? ` The closest the library has today is ${n.nearest}${n.nearestToken ? ` (\`${n.nearestToken}\`)` : ""}.` : "";
2750
- return [`**Needed by:** [${n.title}](${n.url}) (#${n.pr}) in ${n.productName}${who}.${near}`, "", hiddenJson(NEEDED_MARK, n)].join("\n");
2775
+ const detail = [n.nearestToken ? `\`${n.nearestToken}\`` : "", n.nearestValue ?? ""].filter(Boolean).join(", ");
2776
+ const near = n.nearest ? ` The closest the library has today is ${n.nearest}${detail ? ` (${detail})` : ""}.` : "";
2777
+ return [`**Needed by:** [${n.title}](${n.url}) (${prRef(n)}) in ${n.productName}${who}.${near}`, "", hiddenJson(NEEDED_MARK, n)].join("\n");
2751
2778
  }
2752
2779
  function parseNeededBy(body) {
2753
2780
  const n = readHidden(NEEDED_MARK, body);
@@ -2766,7 +2793,8 @@ function withNeededBy(body, n) {
2766
2793
  ${b}` : ""}`;
2767
2794
  }
2768
2795
  const cap = (s) => s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
2769
- const forLine = (b) => `${b.productName} needs it for "${b.title.replace(/"/g, "'")}" (#${b.pr})`;
2796
+ const withoutNear = (summary) => summary.replace(/\s*(?:It looks a lot like|The closest in the library is) .*?\.(?=\s|$)/, "").trim();
2797
+ const forLine = (b) => `${b.productName} needs it for "${b.title.replace(/"/g, "'")}" (${prRef(b)})`;
2770
2798
  function libraryBranchPlan(piece, branch, opts = {}) {
2771
2799
  const neededBy = {
2772
2800
  pr: branch.pr,
@@ -2778,9 +2806,10 @@ function libraryBranchPlan(piece, branch, opts = {}) {
2778
2806
  ...branch.author ? { author: branch.author } : {},
2779
2807
  piece: piece.id,
2780
2808
  pieceTitle: piece.title,
2781
- ...piece.nearest ? { nearest: piece.nearest.label, nearestToken: piece.nearest.token } : {}
2809
+ ...piece.nearest ? { nearest: piece.nearest.label, nearestToken: piece.nearest.token, nearestValue: piece.nearest.value } : {},
2810
+ ...branch.repo ? { repo: branch.repo } : {}
2782
2811
  };
2783
- const near = piece.nearest ? ` The closest the library has today is ${piece.nearest.label} (${piece.nearest.token}, ${piece.nearest.value}).` : "";
2812
+ const said = `${forLine(branch)}: ${withoutNear(piece.summary)}`;
2784
2813
  if (piece.kind === "token" && piece.token) {
2785
2814
  const t = piece.token;
2786
2815
  const files = t.files.length ? t.files : [void 0];
@@ -2792,34 +2821,39 @@ function libraryBranchPlan(piece, branch, opts = {}) {
2792
2821
  description: `${cap(piece.name)}: ${forLine(branch)}.${files.length > 1 ? " Same value in every theme: review it in each." : ""}`,
2793
2822
  ...file ? { file } : {}
2794
2823
  }));
2795
- return { kind: "token-change", title: `Add ${t.path}`, summary: `${forLine(branch)}: ${piece.summary}${near}`, edits, neededBy };
2824
+ return { kind: "token-change", title: `Add ${t.path}`, summary: said, edits, neededBy };
2796
2825
  }
2797
2826
  if (piece.kind === "variant" && piece.component && opts.mode === "suggest") {
2798
2827
  const request2 = {
2799
2828
  component: piece.component,
2800
2829
  kind: "new-variant",
2801
2830
  title: piece.title,
2802
- summary: `${forLine(branch)}: ${piece.summary}${near}`,
2803
- changes: piece.values.slice(0, 6).map((v) => ({ field: v.property ?? v.category, after: v.value })),
2831
+ summary: said,
2832
+ changes: piece.values.slice(0, 6).map((v) => ({ field: pieceValueField(v), after: v.value })),
2804
2833
  source: opts.source ?? "mcp",
2805
2834
  ...opts.requestedBy ? { requestedBy: opts.requestedBy } : {}
2806
2835
  };
2807
2836
  return { kind: "request", title: piece.title, request: request2, neededBy };
2808
2837
  }
2809
2838
  if (piece.kind === "variant" && piece.component) {
2810
- const values = piece.values.map((v) => `${v.property ?? v.category} ${v.value}`).join(", ");
2839
+ const values = piece.values.map((v) => `${pieceValueField(v)} ${v.value}`).join(", ");
2840
+ const r = piece.restyle;
2841
+ const what = r?.state ? `a look when ${r.state}` : `${/^[aeiou]/i.test(piece.name) ? "an" : "a"} ${piece.name} ${piece.aspect ?? "style"}`;
2811
2842
  const exploration = {
2812
2843
  name: piece.title,
2813
- purpose: `${forLine(branch)}: ${/^[aeiou]/i.test(piece.name) ? "an" : "a"} ${piece.name} ${piece.aspect ?? "style"} on ${piece.component} (${values}).${near}`,
2844
+ purpose: `${forLine(branch)}: ${what} on ${piece.component} (${values}).`,
2814
2845
  useCase: "terminal",
2815
2846
  experimental: [piece.title],
2816
2847
  source: opts.source === "figma" ? "figma" : opts.source ?? "mcp"
2817
2848
  };
2818
- const brief = [
2849
+ const brief = (r ? [
2850
+ `Add ${what} to ${piece.component} in the library, on this exploration branch.`,
2851
+ `The product branch restyles ${piece.component} from outside with tokens (\`${r.selector}\`: ${values}). Build it into the component (its own state style or a prop, on component tokens), add it to the docs and examples, and keep every existing ${piece.component} unchanged.`
2852
+ ] : [
2819
2853
  `Add the ${piece.name} ${piece.aspect ?? "style"} to ${piece.component} in the library, on this exploration branch.`,
2820
2854
  `The product branch writes it by hand: ${values}. Express it with tokens (a component or semantic token per value), add it to the component's props, docs and examples, and keep every existing ${piece.component} unchanged.`,
2821
2855
  piece.nearest ? `Say in the pull request why ${piece.nearest.label} is not enough, or recommend it instead.` : ""
2822
- ].filter(Boolean).join(" ");
2856
+ ]).filter(Boolean).join(" ");
2823
2857
  return { kind: "exploration", title: piece.title, exploration, neededBy, brief };
2824
2858
  }
2825
2859
  const name = piece.component ?? cap(piece.name);
@@ -2827,13 +2861,38 @@ function libraryBranchPlan(piece, branch, opts = {}) {
2827
2861
  component: name,
2828
2862
  kind: "new-component",
2829
2863
  title: `Add ${name}`,
2830
- summary: `${forLine(branch)}: ${piece.summary}${near}`,
2831
- changes: piece.values.slice(0, 6).map((v) => ({ field: v.property ?? v.category, after: v.value })),
2864
+ summary: said,
2865
+ changes: piece.values.slice(0, 6).map((v) => ({ field: pieceValueField(v), after: v.value })),
2832
2866
  source: opts.source ?? "mcp",
2833
2867
  ...opts.requestedBy ? { requestedBy: opts.requestedBy } : {}
2834
2868
  };
2835
2869
  return { kind: "request", title: `New component: ${name}`, request, neededBy };
2836
2870
  }
2871
+ function pieceRequest(piece, branch, opts = {}) {
2872
+ const plan = libraryBranchPlan(piece, branch, { ...opts.source ? { source: opts.source } : {}, ...opts.requestedBy ? { requestedBy: opts.requestedBy } : {}, mode: "suggest" });
2873
+ const own = `${forLine(branch)}: ${withoutNear(piece.summary)}`;
2874
+ const context = opts.previewUrl ? ` See it in context in the exploration's preview: ${opts.previewUrl}` : ` See it in context in the exploration: ${branch.url}`;
2875
+ const base = {
2876
+ source: opts.source ?? "mcp",
2877
+ ...opts.requestedBy ? { requestedBy: opts.requestedBy } : {},
2878
+ changes: piece.values.slice(0, 6).map((v) => ({ field: pieceValueField(v), after: v.value }))
2879
+ };
2880
+ let request;
2881
+ if (plan.kind === "request") request = { ...plan.request, summary: `${own}${context}` };
2882
+ else if (piece.kind === "token" && piece.token) {
2883
+ request = {
2884
+ ...base,
2885
+ component: "Tokens",
2886
+ kind: "other",
2887
+ title: `Add ${piece.token.path}`,
2888
+ summary: `${own} Proposed: ${piece.token.path} = ${piece.token.value}, beside the closest token.${context}`,
2889
+ changes: [{ field: piece.token.path, after: piece.token.value }]
2890
+ };
2891
+ } else {
2892
+ request = { ...base, component: piece.component ?? cap(piece.name), kind: piece.component ? "new-variant" : "new-component", title: piece.title, summary: `${own}${context}` };
2893
+ }
2894
+ return { request, neededBy: plan.neededBy };
2895
+ }
2837
2896
  const STATUS_LABEL = {
2838
2897
  draft: "Draft",
2839
2898
  "in-review": "In review",
@@ -2888,7 +2947,7 @@ function linkStatus(x) {
2888
2947
  }
2889
2948
  if (x.state === "merged") return make("shipped");
2890
2949
  if (x.state !== "open") return make("closed");
2891
- if ((x.labels ?? []).includes("exploration")) return make("exploring");
2950
+ if ((x.labels ?? []).includes("exploration") || x.draft && (x.labels ?? []).includes("ready-for-devs")) return make("exploring");
2892
2951
  if (x.draft) return make("draft");
2893
2952
  const latest = /* @__PURE__ */ new Map();
2894
2953
  for (const r of x.reviews ?? []) if (r.user && r.state !== "COMMENTED") latest.set(r.user, r.state);
@@ -2946,7 +3005,7 @@ function nearestQuestion(n, opts = {}) {
2946
3005
  }
2947
3006
  function suggestNearestComment(n) {
2948
3007
  if (!n.nearest) return null;
2949
- return `Let's not add it to the library: ${n.nearest}${n.nearestToken ? ` (\`${n.nearestToken}\`)` : ""} covers it. Use it on ${n.title} (#${n.pr}) instead, then close this branch.`;
3008
+ return `Let's not add it to the library: ${n.nearest}${n.nearestToken ? ` (\`${n.nearestToken}\`)` : ""} covers it. Use it on ${n.title} (${prRef(n)}) instead, then close this branch.`;
2950
3009
  }
2951
3010
  function pieceId(parts) {
2952
3011
  return slugify(parts.filter(Boolean).join(" "), 48);
@@ -2968,7 +3027,7 @@ function proposedTokenPath(nearest, name, category) {
2968
3027
  return [...parts.slice(0, -1), slug].join(".");
2969
3028
  }
2970
3029
  export {
2971
- DEFAULT_TOKEN_PATHS as $,
3030
+ productRepos as $,
2972
3031
  formatValue as A,
2973
3032
  resolve as B,
2974
3033
  moveToken as C,
@@ -2995,175 +3054,180 @@ export {
2995
3054
  previewLinks as X,
2996
3055
  findPreviewComment as Y,
2997
3056
  previewsSettled as Z,
2998
- baseBranchOf as _,
3057
+ previewUrl as _,
2999
3058
  proposedTokenPath as a,
3000
- colorsEqual as a$,
3001
- layoutOptions as a0,
3002
- buildTokenSet as a1,
3003
- readPreviewComment as a2,
3004
- linkStatus as a3,
3005
- libraryPreviewState as a4,
3006
- parsePiecesRecord as a5,
3007
- libraryBranchPlan as a6,
3008
- NEEDED_BY_LABEL as a7,
3009
- withNeededBy as a8,
3010
- withLink as a9,
3011
- PREVIEW_COMMENT_MARKER as aA,
3012
- PREVIEW_PLACEHOLDERS as aB,
3013
- PRIMITIVE_MODE as aC,
3014
- PRODUCT_LABEL_PREFIX as aD,
3015
- RIGHTS as aE,
3016
- RIGHT_LABEL as aF,
3017
- RISK_TIER as aG,
3018
- TEAM_NAME_MAX as aH,
3019
- TIER_ORDER as aI,
3020
- TeamDirectory as aJ,
3021
- VISUAL_CHECKS_DOCS as aK,
3022
- VISUAL_CHECK_LABEL as aL,
3023
- VISUAL_WORKFLOW_FILES as aM,
3024
- affectedContrast as aN,
3025
- aliasOf as aO,
3026
- appForProject as aP,
3027
- appUrl as aQ,
3028
- approverEntries as aR,
3029
- approverLists as aS,
3030
- branchName as aT,
3031
- branchSlug as aU,
3032
- canShip as aV,
3033
- changeKind as aW,
3034
- changedModes as aX,
3035
- changesMode as aY,
3036
- clearRawDeep as aZ,
3037
- colorToCss as a_,
3038
- withPiecesRecord as aa,
3039
- productBranchSentence as ab,
3040
- mergePiecesRecord as ac,
3041
- productOfBranch as ad,
3042
- defaultProduct as ae,
3043
- slugify as af,
3044
- defineConfig as ag,
3045
- globToRegExp as ah,
3046
- ConfigError as ai,
3047
- DEFAULT_CHANGES_MODE as aj,
3048
- DEFAULT_OVERRIDE as ak,
3049
- DEFAULT_PRODUCTS as al,
3050
- isGuardrail as am,
3051
- AAA_MIN as an,
3052
- AA_MIN as ao,
3053
- CHANGES_MODES as ap,
3054
- CONTRAST_CELL_MAX as aq,
3055
- CONTRAST_CHECKS_FILE as ar,
3056
- DEFAULT_GOVERNANCE as as,
3057
- DEFAULT_RIGHTS as at,
3058
- DEFAULT_VISUAL_IMPACT as au,
3059
- DTCG_TYPES as av,
3060
- JsonParseError as aw,
3061
- LINK_STATUS_TONE as ax,
3062
- OWNER_GROUPS as ay,
3063
- PREVIEW_APP_LABELS as az,
3059
+ changedModes as a$,
3060
+ linkStatus as a0,
3061
+ libraryPreviewState as a1,
3062
+ parsePiecesRecord as a2,
3063
+ libraryBranchPlan as a3,
3064
+ NEEDED_BY_LABEL as a4,
3065
+ withNeededBy as a5,
3066
+ withLink as a6,
3067
+ withPiecesRecord as a7,
3068
+ productBranchSentence as a8,
3069
+ productOfBranch as a9,
3070
+ JsonParseError as aA,
3071
+ LINK_STATUS_TONE as aB,
3072
+ OWNER_GROUPS as aC,
3073
+ PREVIEW_APP_LABELS as aD,
3074
+ PREVIEW_COMMENT_MARKER as aE,
3075
+ PREVIEW_PLACEHOLDERS as aF,
3076
+ PRIMITIVE_MODE as aG,
3077
+ PRODUCT_LABEL_PREFIX as aH,
3078
+ RIGHTS as aI,
3079
+ RIGHT_LABEL as aJ,
3080
+ RISK_TIER as aK,
3081
+ TEAM_NAME_MAX as aL,
3082
+ TIER_ORDER as aM,
3083
+ TeamDirectory as aN,
3084
+ VISUAL_CHECKS_DOCS as aO,
3085
+ VISUAL_CHECK_LABEL as aP,
3086
+ VISUAL_WORKFLOW_FILES as aQ,
3087
+ affectedContrast as aR,
3088
+ aliasOf as aS,
3089
+ appForProject as aT,
3090
+ appUrl as aU,
3091
+ approverEntries as aV,
3092
+ approverLists as aW,
3093
+ branchName as aX,
3094
+ branchSlug as aY,
3095
+ canShip as aZ,
3096
+ changeKind as a_,
3097
+ pieceRequest as aa,
3098
+ mergePiecesRecord as ab,
3099
+ defaultProduct as ac,
3100
+ productOfRepo as ad,
3101
+ baseBranchOf as ae,
3102
+ DEFAULT_TOKEN_PATHS as af,
3103
+ layoutOptions as ag,
3104
+ buildTokenSet as ah,
3105
+ readPreviewComment as ai,
3106
+ slugify as aj,
3107
+ defineConfig as ak,
3108
+ globToRegExp as al,
3109
+ ConfigError as am,
3110
+ DEFAULT_CHANGES_MODE as an,
3111
+ DEFAULT_OVERRIDE as ao,
3112
+ DEFAULT_PRODUCTS as ap,
3113
+ isGuardrail as aq,
3114
+ AAA_MIN as ar,
3115
+ AA_MIN as as,
3116
+ CHANGES_MODES as at,
3117
+ CONTRAST_CELL_MAX as au,
3118
+ CONTRAST_CHECKS_FILE as av,
3119
+ DEFAULT_GOVERNANCE as aw,
3120
+ DEFAULT_RIGHTS as ax,
3121
+ DEFAULT_VISUAL_IMPACT as ay,
3122
+ DTCG_TYPES as az,
3064
3123
  modesOf as b,
3065
- productProblems as b$,
3066
- comboKey as b0,
3067
- commitMessage as b1,
3068
- compactJson as b2,
3069
- composePrBody as b3,
3070
- composite as b4,
3071
- contextFor as b5,
3072
- contrastLevel as b6,
3073
- contrastPair as b7,
3074
- contrastRatio as b8,
3075
- defaultContext as b9,
3076
- isTeamEntry as bA,
3077
- isTokenFile as bB,
3078
- isVercelComment as bC,
3079
- kindForMin as bD,
3080
- layeredParityIssues as bE,
3081
- libraryIsPublic as bF,
3082
- luminance as bG,
3083
- nearestQuestion as bH,
3084
- neededBySection as bI,
3085
- nodesEqual as bJ,
3086
- normalizeRights as bK,
3087
- overrideKey as bL,
3088
- ownerEntryProblems as bM,
3089
- pairKey as bN,
3090
- parseDimension as bO,
3091
- parseJson as bP,
3092
- parseNeededBy as bQ,
3093
- parseOwnerEntry as bR,
3094
- parseVercelComment as bS,
3095
- piecesSection as bT,
3096
- plainEqual as bU,
3097
- previewComment as bV,
3098
- previewLinksOf as bW,
3099
- previewUrl as bX,
3100
- productForPlace as bY,
3101
- productLabel as bZ,
3102
- productMarks as b_,
3103
- defaultTitle as ba,
3104
- detectLayout as bb,
3105
- entriesFor as bc,
3106
- entryLabel as bd,
3107
- expandEntries as be,
3108
- expandOwners as bf,
3109
- fieldChanges as bg,
3110
- figmaPushNextLine as bh,
3111
- figmaPushTierLabel as bi,
3112
- findProduct as bj,
3113
- findToken as bk,
3114
- findVercelComment as bl,
3115
- flattenLayerFile as bm,
3116
- formatNumber as bn,
3117
- formatOwnerEntry as bo,
3118
- fromPlain as bp,
3119
- getChild as bq,
3120
- getEntry as br,
3121
- groupsPhrase as bs,
3122
- hasVisualWorkflow as bt,
3123
- hexToRgba as bu,
3124
- holdersOf as bv,
3125
- indexByPath as bw,
3126
- inheritedTypeAt as bx,
3127
- installCommand as by,
3128
- installCommandFromPreviewComment as bz,
3124
+ previewLinksOf as b$,
3125
+ changesMode as b0,
3126
+ clearRawDeep as b1,
3127
+ colorToCss as b2,
3128
+ colorsEqual as b3,
3129
+ comboKey as b4,
3130
+ commitMessage as b5,
3131
+ compactJson as b6,
3132
+ composePrBody as b7,
3133
+ composite as b8,
3134
+ contextFor as b9,
3135
+ indexByPath as bA,
3136
+ inheritedTypeAt as bB,
3137
+ installCommand as bC,
3138
+ installCommandFromPreviewComment as bD,
3139
+ isTeamEntry as bE,
3140
+ isTokenFile as bF,
3141
+ isVercelComment as bG,
3142
+ kindForMin as bH,
3143
+ layeredParityIssues as bI,
3144
+ libraryIsPublic as bJ,
3145
+ luminance as bK,
3146
+ nearestQuestion as bL,
3147
+ neededBySection as bM,
3148
+ nodesEqual as bN,
3149
+ normalizeRights as bO,
3150
+ overrideKey as bP,
3151
+ ownerEntryProblems as bQ,
3152
+ pairKey as bR,
3153
+ parseDimension as bS,
3154
+ parseJson as bT,
3155
+ parseNeededBy as bU,
3156
+ parseOwnerEntry as bV,
3157
+ parseVercelComment as bW,
3158
+ pieceValueField as bX,
3159
+ piecesSection as bY,
3160
+ plainEqual as bZ,
3161
+ previewComment as b_,
3162
+ contrastLevel as ba,
3163
+ contrastPair as bb,
3164
+ contrastRatio as bc,
3165
+ defaultContext as bd,
3166
+ defaultTitle as be,
3167
+ detectLayout as bf,
3168
+ entriesFor as bg,
3169
+ entryLabel as bh,
3170
+ expandEntries as bi,
3171
+ expandOwners as bj,
3172
+ fieldChanges as bk,
3173
+ figmaPushNextLine as bl,
3174
+ figmaPushTierLabel as bm,
3175
+ findProduct as bn,
3176
+ findToken as bo,
3177
+ findVercelComment as bp,
3178
+ flattenLayerFile as bq,
3179
+ formatNumber as br,
3180
+ formatOwnerEntry as bs,
3181
+ fromPlain as bt,
3182
+ getChild as bu,
3183
+ getEntry as bv,
3184
+ groupsPhrase as bw,
3185
+ hasVisualWorkflow as bx,
3186
+ hexToRgba as by,
3187
+ holdersOf as bz,
3129
3188
  TIER_AXIS as c,
3130
- productsOf as c0,
3131
- projectOfLabel as c1,
3132
- protectedBranchesOf as c2,
3133
- renderedColor as c3,
3134
- rgbaToDtcg as c4,
3135
- rightsProblems as c5,
3136
- sameProducts as c6,
3137
- sameToken as c7,
3138
- serializeJson as c8,
3139
- shipPolicy as c9,
3140
- whyItExists as cA,
3141
- snapshotUrl as ca,
3142
- soloApprover as cb,
3143
- soloOwnerOf as cc,
3144
- soloOwnerSentence as cd,
3145
- storybookUrl as ce,
3146
- suggestNearestComment as cf,
3147
- summarizeTokenChange as cg,
3148
- tarballAssetName as ch,
3149
- tarballUrl as ci,
3150
- teamKey as cj,
3151
- teamKeyOf as ck,
3152
- teamName as cl,
3153
- teamUnreadableMessage as cm,
3154
- teamsIn as cn,
3155
- toAlias as co,
3156
- toMap as cp,
3157
- toPlain as cq,
3158
- tokenBump as cr,
3159
- tokenNode as cs,
3160
- unreadableShipTeams as ct,
3161
- unreadableTeams as cu,
3162
- valueIn as cv,
3163
- valueToCss as cw,
3164
- visualImpactProblems as cx,
3165
- visualOffer as cy,
3166
- whoCanShipSentence as cz,
3189
+ productForPlace as c0,
3190
+ productLabel as c1,
3191
+ productMarks as c2,
3192
+ productProblems as c3,
3193
+ productRepoOf as c4,
3194
+ productsOf as c5,
3195
+ projectOfLabel as c6,
3196
+ protectedBranchesOf as c7,
3197
+ renderedColor as c8,
3198
+ rgbaToDtcg as c9,
3199
+ valueIn as cA,
3200
+ valueToCss as cB,
3201
+ visualImpactProblems as cC,
3202
+ visualOffer as cD,
3203
+ whoCanShipSentence as cE,
3204
+ whyItExists as cF,
3205
+ rightsProblems as ca,
3206
+ sameProducts as cb,
3207
+ sameToken as cc,
3208
+ serializeJson as cd,
3209
+ shipPolicy as ce,
3210
+ snapshotUrl as cf,
3211
+ soloApprover as cg,
3212
+ soloOwnerOf as ch,
3213
+ soloOwnerSentence as ci,
3214
+ storybookUrl as cj,
3215
+ suggestNearestComment as ck,
3216
+ summarizeTokenChange as cl,
3217
+ tarballAssetName as cm,
3218
+ tarballUrl as cn,
3219
+ teamKey as co,
3220
+ teamKeyOf as cp,
3221
+ teamName as cq,
3222
+ teamUnreadableMessage as cr,
3223
+ teamsIn as cs,
3224
+ toAlias as ct,
3225
+ toMap as cu,
3226
+ toPlain as cv,
3227
+ tokenBump as cw,
3228
+ tokenNode as cx,
3229
+ unreadableShipTeams as cy,
3230
+ unreadableTeams as cz,
3167
3231
  collectRefs as d,
3168
3232
  evaluatePairs as e,
3169
3233
  findReferenceProblems as f,
@@ -3188,4 +3252,4 @@ export {
3188
3252
  parseColor as y,
3189
3253
  rgbaToHex as z
3190
3254
  };
3191
- //# sourceMappingURL=prod-branch-CJZwMfVD.js.map
3255
+ //# sourceMappingURL=prod-branch-JL5tmL6u.js.map