@koda-plus/medusa-plugin-subiekt-nexo 0.2.0 → 0.2.1
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/.medusa/server/src/admin/index.js +206 -169
- package/.medusa/server/src/admin/index.mjs +206 -169
- package/.medusa/server/src/api/admin/subiekt/check/route.d.ts +9 -0
- package/.medusa/server/src/api/admin/subiekt/documents/route.d.ts +8 -0
- package/.medusa/server/src/api/admin/subiekt/helpers.d.ts +23 -0
- package/.medusa/server/src/api/admin/subiekt/orders/[id]/documents/route.d.ts +12 -0
- package/.medusa/server/src/api/admin/subiekt/orders/[id]/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/subiekt/orders/[id]/send/route.d.ts +8 -0
- package/.medusa/server/src/api/admin/subiekt/products/release/route.d.ts +9 -0
- package/.medusa/server/src/api/admin/subiekt/products/route.d.ts +9 -0
- package/.medusa/server/src/api/admin/subiekt/route.d.ts +8 -0
- package/.medusa/server/src/api/admin/subiekt/runs/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/subiekt/sync/route.d.ts +9 -0
- package/.medusa/server/src/api/admin/subiekt/tasks/[id]/retry/route.d.ts +9 -0
- package/.medusa/server/src/api/admin/subiekt/tasks/route.d.ts +8 -0
- package/.medusa/server/src/api/admin/subiekt/writers/route.d.ts +9 -0
- package/.medusa/server/src/api/hooks/subiekt/route.d.ts +11 -0
- package/.medusa/server/src/api/middlewares.d.ts +6 -0
- package/.medusa/server/src/jobs/subiekt-process-tasks.d.ts +12 -0
- package/.medusa/server/src/jobs/subiekt-pull-events.d.ts +12 -0
- package/.medusa/server/src/jobs/subiekt-sync-products.d.ts +11 -0
- package/.medusa/server/src/jobs/subiekt-sync-stock.d.ts +11 -0
- package/.medusa/server/src/modules/subiekt/index.d.ts +113 -0
- package/.medusa/server/src/modules/subiekt/lib/backoff.d.ts +23 -0
- package/.medusa/server/src/modules/subiekt/lib/bridge-client.d.ts +86 -0
- package/.medusa/server/src/modules/subiekt/lib/capabilities.d.ts +24 -0
- package/.medusa/server/src/modules/subiekt/lib/constants.d.ts +99 -0
- package/.medusa/server/src/modules/subiekt/lib/contract.d.ts +527 -0
- package/.medusa/server/src/modules/subiekt/lib/demo.d.ts +95 -0
- package/.medusa/server/src/modules/subiekt/lib/diagnostics.d.ts +15 -0
- package/.medusa/server/src/modules/subiekt/lib/documents.d.ts +35 -0
- package/.medusa/server/src/modules/subiekt/lib/dto.d.ts +81 -0
- package/.medusa/server/src/modules/subiekt/lib/guide.d.ts +19 -0
- package/.medusa/server/src/modules/subiekt/lib/kit-contract.d.ts +186 -0
- package/.medusa/server/src/modules/subiekt/lib/kit-contract.js +144 -0
- package/.medusa/server/src/modules/subiekt/lib/kit-guards.d.ts +12 -0
- package/.medusa/server/src/modules/subiekt/lib/kit-guards.js +90 -0
- package/.medusa/server/src/modules/subiekt/lib/kit-meta.d.ts +8 -0
- package/.medusa/server/src/modules/subiekt/lib/kit-meta.js +13 -0
- package/.medusa/server/src/modules/subiekt/lib/kit-routes.d.ts +156 -0
- package/.medusa/server/src/modules/subiekt/lib/kit-routes.js +409 -0
- package/.medusa/server/src/modules/subiekt/lib/nip.d.ts +44 -0
- package/.medusa/server/src/modules/subiekt/lib/numbers.d.ts +9 -0
- package/.medusa/server/src/modules/subiekt/lib/options.d.ts +128 -0
- package/.medusa/server/src/modules/subiekt/lib/order-payload.d.ts +137 -0
- package/.medusa/server/src/modules/subiekt/lib/payment.d.ts +54 -0
- package/.medusa/server/src/modules/subiekt/lib/products.d.ts +121 -0
- package/.medusa/server/src/modules/subiekt/lib/references.d.ts +76 -0
- package/.medusa/server/src/modules/subiekt/lib/references.js +10 -8
- package/.medusa/server/src/modules/subiekt/lib/signature.d.ts +53 -0
- package/.medusa/server/src/modules/subiekt/lib/stock.d.ts +83 -0
- package/.medusa/server/src/modules/subiekt/lib/writers.d.ts +29 -0
- package/.medusa/server/src/modules/subiekt/migrations/Migration20261004180000.d.ts +9 -0
- package/.medusa/server/src/modules/subiekt/migrations/Migration20261006120000.d.ts +11 -0
- package/.medusa/server/src/modules/subiekt/models/subiekt-catalog-change.d.ts +36 -0
- package/.medusa/server/src/modules/subiekt/models/subiekt-catalog-quarantine.d.ts +17 -0
- package/.medusa/server/src/modules/subiekt/models/subiekt-connection.d.ts +25 -0
- package/.medusa/server/src/modules/subiekt/models/subiekt-document.d.ts +31 -0
- package/.medusa/server/src/modules/subiekt/models/subiekt-sync-run.d.ts +19 -0
- package/.medusa/server/src/modules/subiekt/models/subiekt-task.d.ts +39 -0
- package/.medusa/server/src/modules/subiekt/models/subiekt-writer.d.ts +17 -0
- package/.medusa/server/src/modules/subiekt/service.d.ts +133 -0
- package/.medusa/server/src/subscribers/subiekt-fulfillment-created.d.ts +13 -0
- package/.medusa/server/src/subscribers/subiekt-order-canceled.d.ts +9 -0
- package/.medusa/server/src/subscribers/subiekt-order-placed.d.ts +14 -0
- package/.medusa/server/src/subscribers/subiekt-payment-captured.d.ts +11 -0
- package/.medusa/server/src/workflows/index.d.ts +20 -0
- package/.medusa/server/src/workflows/subiekt/cancel-order-in-subiekt.d.ts +13 -0
- package/.medusa/server/src/workflows/subiekt/catalog.d.ts +89 -0
- package/.medusa/server/src/workflows/subiekt/check-subiekt-connection.d.ts +8 -0
- package/.medusa/server/src/workflows/subiekt/create-subiekt-wz.d.ts +14 -0
- package/.medusa/server/src/workflows/subiekt/events.d.ts +30 -0
- package/.medusa/server/src/workflows/subiekt/health.d.ts +20 -0
- package/.medusa/server/src/workflows/subiekt/issue-subiekt-document.d.ts +23 -0
- package/.medusa/server/src/workflows/subiekt/orders.d.ts +70 -0
- package/.medusa/server/src/workflows/subiekt/process-subiekt-tasks.d.ts +8 -0
- package/.medusa/server/src/workflows/subiekt/pull-subiekt-events.d.ts +8 -0
- package/.medusa/server/src/workflows/subiekt/queue.d.ts +34 -0
- package/.medusa/server/src/workflows/subiekt/runtime.d.ts +43 -0
- package/.medusa/server/src/workflows/subiekt/sales-documents.d.ts +35 -0
- package/.medusa/server/src/workflows/subiekt/send-order-to-subiekt.d.ts +45 -0
- package/.medusa/server/src/workflows/subiekt/stock-plan.d.ts +17 -0
- package/.medusa/server/src/workflows/subiekt/sync-subiekt-products.d.ts +17 -0
- package/.medusa/server/src/workflows/subiekt/sync-subiekt-stock.d.ts +23 -0
- package/.medusa/server/src/workflows/subiekt/tasks.d.ts +43 -0
- package/.medusa/server/src/workflows/subiekt/writers.d.ts +18 -0
- package/CHANGELOG.md +16 -0
- package/README.md +12 -12
- package/package.json +30 -2
|
@@ -347,26 +347,13 @@ function resolveText(value, lang) {
|
|
|
347
347
|
const pl2 = lang.toLowerCase().startsWith("pl");
|
|
348
348
|
return (pl2 ? value.pl ?? value.en : value.en ?? value.pl) || void 0;
|
|
349
349
|
}
|
|
350
|
-
const PL_GENITIVE = ["stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"];
|
|
351
|
-
function monthYear(since, lang) {
|
|
352
|
-
const m = /^(\d{4})-(\d{2})$/.exec(since);
|
|
353
|
-
if (!m) return since;
|
|
354
|
-
const year = Number(m[1]);
|
|
355
|
-
const month = Number(m[2]);
|
|
356
|
-
if (lang.toLowerCase().startsWith("pl")) return `${PL_GENITIVE[month - 1] ?? m[2]} ${year}`;
|
|
357
|
-
try {
|
|
358
|
-
return new Intl.DateTimeFormat(lang, { month: "long", year: "numeric", timeZone: "UTC" }).format(new Date(Date.UTC(year, month - 1, 15)));
|
|
359
|
-
} catch {
|
|
360
|
-
return since;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
350
|
function referencesFor(list, lang) {
|
|
364
351
|
return (list ?? []).map((r) => ({
|
|
365
352
|
name: r.name,
|
|
366
|
-
url: r.url,
|
|
353
|
+
url: r.url ?? void 0,
|
|
354
|
+
soon: r.soon,
|
|
367
355
|
icon: r.icon,
|
|
368
356
|
description: resolveText(r.description, lang),
|
|
369
|
-
since: r.since,
|
|
370
357
|
metrics: r.metrics.map((m) => ({ label: resolveText(m.label, lang) ?? "", value: m.value })).filter((m) => m.label),
|
|
371
358
|
links: r.links.map((l) => ({ label: resolveText(l.label, lang) ?? l.url, url: l.url })),
|
|
372
359
|
review: r.review ? { ...r.review, quote: resolveText(r.review.quote ?? void 0, lang) } : null
|
|
@@ -545,6 +532,10 @@ const SubiektOrderWidget = ({ data }) => {
|
|
|
545
532
|
adminSdk.defineWidgetConfig({
|
|
546
533
|
zone: "order.details.side.after"
|
|
547
534
|
});
|
|
535
|
+
const KIT_META = {
|
|
536
|
+
pkg: "@koda-plus/medusa-plugin-subiekt-nexo",
|
|
537
|
+
version: "0.2.1"
|
|
538
|
+
};
|
|
548
539
|
const NBSP = " ";
|
|
549
540
|
const NBHY = "‑";
|
|
550
541
|
const SHORT = /(^|[\s("„])(oraz|albo|lub|ale|że|bo|czy|gdy|aby|by|więc|jak|na|do|za|ze|we|od|po|to|[aiouwze])[ \t]+/gi;
|
|
@@ -676,6 +667,12 @@ function ModeBadge({ color, label, title, children }) {
|
|
|
676
667
|
] })
|
|
677
668
|
] });
|
|
678
669
|
}
|
|
670
|
+
function splitReferences(items) {
|
|
671
|
+
return {
|
|
672
|
+
live: items.filter((r) => !r.soon && typeof r.url === "string" && r.url !== ""),
|
|
673
|
+
soon: items.filter((r) => r.soon === true)
|
|
674
|
+
};
|
|
675
|
+
}
|
|
679
676
|
const host = (url) => {
|
|
680
677
|
try {
|
|
681
678
|
return new URL(url).host.replace(/^www\./, "");
|
|
@@ -709,8 +706,9 @@ function meanRating(items) {
|
|
|
709
706
|
return { value: Math.round(value * 10) / 10, first: reviews[0] };
|
|
710
707
|
}
|
|
711
708
|
function ReferencesBadge({ items, labels }) {
|
|
712
|
-
|
|
713
|
-
|
|
709
|
+
const { live, soon } = splitReferences(items);
|
|
710
|
+
if (live.length + soon.length === 0) return null;
|
|
711
|
+
const mean = meanRating(live);
|
|
714
712
|
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
|
|
715
713
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
716
714
|
"button",
|
|
@@ -718,8 +716,11 @@ function ReferencesBadge({ items, labels }) {
|
|
|
718
716
|
type: "button",
|
|
719
717
|
className: "inline-flex h-9 max-w-full items-center gap-x-3 rounded-full border border-ui-border-base bg-ui-bg-component py-1 pl-1.5 pr-3 outline-none transition-fg hover:bg-ui-bg-component-hover focus-visible:shadow-borders-focus",
|
|
720
718
|
children: [
|
|
721
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center", children:
|
|
722
|
-
/* @__PURE__ */ jsxRuntime.
|
|
719
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center", children: [...live, ...soon].slice(0, 3).map((r, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.clx("rounded-md", i > 0 && "-ml-2", r.soon && "opacity-50"), children: /* @__PURE__ */ jsxRuntime.jsx(StoreIcon, { reference: r, size: 24 }) }, r.url ?? r.name)) }),
|
|
720
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-x-1.5", children: [
|
|
721
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small-plus truncate text-ui-fg-base", children: labels.count(live.length, soon.length) }),
|
|
722
|
+
live.length > 0 && soon.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small shrink-0 text-ui-fg-muted", children: labels.soonMore(soon.length) }) : null
|
|
723
|
+
] }),
|
|
723
724
|
mean ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex shrink-0 items-center gap-x-2 border-l border-ui-border-base pl-3", children: [
|
|
724
725
|
/* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: mean.value, size: 13 }),
|
|
725
726
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small-plus tabular-nums text-ui-fg-base", children: labels.rating(mean.value) }),
|
|
@@ -734,52 +735,61 @@ function ReferencesBadge({ items, labels }) {
|
|
|
734
735
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "text-ui-fg-base", children: labels.title }),
|
|
735
736
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: labels.subtitle })
|
|
736
737
|
] }),
|
|
737
|
-
/* @__PURE__ */ jsxRuntime.
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
/* @__PURE__ */ jsxRuntime.jsxs("
|
|
741
|
-
/* @__PURE__ */ jsxRuntime.
|
|
742
|
-
|
|
743
|
-
/* @__PURE__ */ jsxRuntime.
|
|
744
|
-
|
|
738
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "flex max-h-[60vh] flex-col divide-y divide-ui-border-base overflow-y-auto", children: [
|
|
739
|
+
live.map((r) => {
|
|
740
|
+
var _a, _b;
|
|
741
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex flex-col gap-y-2 px-4 py-3", children: [
|
|
742
|
+
/* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "group flex items-center gap-x-3", children: [
|
|
743
|
+
/* @__PURE__ */ jsxRuntime.jsx(StoreIcon, { reference: r, size: 32 }),
|
|
744
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
|
|
745
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
|
|
746
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "truncate text-ui-fg-interactive group-hover:text-ui-fg-interactive-hover", children: host(r.url) })
|
|
747
|
+
] }),
|
|
748
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "ml-auto shrink-0 text-ui-fg-muted group-hover:text-ui-fg-interactive" })
|
|
745
749
|
] }),
|
|
746
|
-
/* @__PURE__ */ jsxRuntime.
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: nb(r.description) }) : null,
|
|
765
|
-
((_b = r.metrics) == null ? void 0 : _b.length) || r.since ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
|
|
766
|
-
(r.metrics ?? []).map((m) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { size: "2xsmall", color: "green", children: [
|
|
750
|
+
r.review ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
|
|
751
|
+
/* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: r.review.rating, scale: r.review.scale }),
|
|
752
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-xsmall-plus tabular-nums text-ui-fg-base", children: labels.rating(r.review.rating / (r.review.scale || 5) * 5) }),
|
|
753
|
+
/* @__PURE__ */ jsxRuntime.jsx(SourceMark, { review: r.review }),
|
|
754
|
+
r.review.url ? /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.review.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
|
|
755
|
+
labels.review,
|
|
756
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
|
|
757
|
+
] }) : null
|
|
758
|
+
] }) : null,
|
|
759
|
+
((_a = r.review) == null ? void 0 : _a.quote) ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "xsmall", className: "border-l-2 border-ui-border-strong pl-2 italic text-ui-fg-subtle", children: [
|
|
760
|
+
nb(r.review.quote),
|
|
761
|
+
r.review.author ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "not-italic text-ui-fg-muted", children: [
|
|
762
|
+
" ",
|
|
763
|
+
r.review.author
|
|
764
|
+
] }) : null
|
|
765
|
+
] }) : null,
|
|
766
|
+
r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: nb(r.description) }) : null,
|
|
767
|
+
((_b = r.metrics) == null ? void 0 : _b.length) ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-1.5", children: (r.metrics ?? []).map((m) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { size: "2xsmall", color: "green", children: [
|
|
767
768
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: m.value }),
|
|
768
769
|
" ",
|
|
769
770
|
m.label
|
|
770
|
-
] }, m.label)),
|
|
771
|
-
r.
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
l.
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
771
|
+
] }, m.label)) }) : null,
|
|
772
|
+
(r.links ?? []).length ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-x-3 gap-y-1", children: (r.links ?? []).map((l) => /* @__PURE__ */ jsxRuntime.jsxs("a", { href: l.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
|
|
773
|
+
l.label,
|
|
774
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
|
|
775
|
+
] }, l.url)) }) : null
|
|
776
|
+
] }, r.url ?? r.name);
|
|
777
|
+
}),
|
|
778
|
+
soon.map((r) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex flex-col gap-y-2 px-4 py-3", children: [
|
|
779
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
|
|
780
|
+
/* @__PURE__ */ jsxRuntime.jsx(StoreIcon, { reference: r, size: 32 }),
|
|
781
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-x-2", children: [
|
|
782
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
|
|
783
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "blue", className: "shrink-0", children: labels.soon })
|
|
784
|
+
] })
|
|
785
|
+
] }),
|
|
786
|
+
r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: nb(r.description) }) : null
|
|
787
|
+
] }, r.url ?? r.name))
|
|
788
|
+
] })
|
|
779
789
|
] })
|
|
780
790
|
] });
|
|
781
791
|
}
|
|
782
|
-
const KODA_DISCORD = "https://
|
|
792
|
+
const KODA_DISCORD = "https://koda.plus/discord";
|
|
783
793
|
const KODA_EMAIL = "hello@koda.plus";
|
|
784
794
|
const KODA_DEMO = "https://medusa.koda.plus";
|
|
785
795
|
const plain = (text) => text.split(NBSP).join(" ");
|
|
@@ -887,8 +897,13 @@ function envNames(code) {
|
|
|
887
897
|
for (const m of code.matchAll(/^([A-Z][A-Z0-9_]*)=/gm)) names.add(m[1]);
|
|
888
898
|
return [...names];
|
|
889
899
|
}
|
|
900
|
+
function pinnedPackage(spec) {
|
|
901
|
+
const version = spec.version ?? (spec.pkg === KIT_META.pkg ? KIT_META.version : null);
|
|
902
|
+
return version && /^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version) ? `${spec.pkg}@${version}` : spec.pkg;
|
|
903
|
+
}
|
|
890
904
|
function buildSetupPrompt(spec, lang) {
|
|
891
905
|
const code = (text) => "`" + text + "`";
|
|
906
|
+
const pinned = pinnedPackage(spec);
|
|
892
907
|
const env = envNames(`${spec.config}
|
|
893
908
|
${spec.demo}`).map(code).join(", ");
|
|
894
909
|
const needs = spec.needs.map((n) => `- ${plain(n)}`);
|
|
@@ -909,16 +924,16 @@ ${spec.demo}`).map(code).join(", ");
|
|
|
909
924
|
"",
|
|
910
925
|
"## Kroki",
|
|
911
926
|
"1. Zanim cokolwiek zmienisz, sprawdź projekt: Medusa 2.12 albo nowsza (tego wymagają strony i tłumaczenia panelu we wtyczce), menedżer pakietów projektu i medusa-config.ts. Jeśli coś blokuje instalację, zatrzymaj się i napisz mi, co.",
|
|
912
|
-
`2. Zainstaluj wtyczkę menedżerem pakietów projektu, na przykład ${code(`npm install ${spec.pkg}`)}. Jeśli rejestr jej nie znajduje
|
|
927
|
+
`2. Zainstaluj wtyczkę w tej wersji menedżerem pakietów projektu, na przykład ${code(`npm install ${pinned}`)}. Potem sprawdź pochodzenie paczki: ${code(`npm view ${spec.pkg} dist-tags.latest`)} i ${code("npm audit signatures")}. Jeśli rejestr jej nie znajduje albo podpisy się nie zgadzają, zatrzymaj się i daj mi znać: pomaga Koda Plus (${KODA_EMAIL}, Discord ${KODA_DISCORD}).`,
|
|
913
928
|
"3. Zarejestruj wtyczkę w medusa-config.ts, nie ruszając tego, co już tam jest. Użyj konfiguracji z Przewodnika wdrożenia:",
|
|
914
929
|
"",
|
|
915
930
|
...config2,
|
|
916
931
|
"",
|
|
917
|
-
`4. Dodaj do opcji przełącznik trybu demo, tak jak w sklepie demo: ${code(spec.demo)}.
|
|
932
|
+
`4. Dodaj do opcji przełącznik trybu demo, tak jak w sklepie demo: ${code(spec.demo)}. Tryb demo działa tylko po jawnym włączeniu: wtedy moduł pracuje na przykładowych danych i nie łączy się z ${service}; bez niego i bez kluczy mówi „nieskonfigurowane” i nic nie robi.`,
|
|
918
933
|
`5. Wpisz zmienne do .env i do środowiska hostingu, nigdy do kodu ani do gita: ${env}. Jeśli nie podałem Ci wartości, zostaw ją pustą i wypisz mi ją na końcu.`,
|
|
919
|
-
`6. Uruchom migracje bazy (${code("npx medusa db:migrate")}), potem sklep, i otwórz ${spec.route} w panelu admina. Sprawdź, czy Panel, Przewodnik wdrożenia i Ustawienia otwierają się bez błędów w konsoli przeglądarki i w logu serwera.`,
|
|
920
|
-
`7. Nie włączaj żadnego zapisu, czyli niczego, co zmienia dane w ${service} albo w sklepie. Każdy zapis uzbraja człowiek w Ustawieniach, po próbie na sucho; opcje tylko na to pozwalają.`,
|
|
921
|
-
`8.
|
|
934
|
+
spec.migrations === false ? `6. Uruchom sklep i otwórz ${spec.route} w panelu admina (ta wtyczka nie ma własnych tabel, migracje nie są potrzebne). Sprawdź, czy Panel, Przewodnik wdrożenia i Ustawienia otwierają się bez błędów w konsoli przeglądarki i w logu serwera.` : `6. Uruchom migracje bazy (${code("npx medusa db:migrate")}), potem sklep, i otwórz ${spec.route} w panelu admina. Sprawdź, czy Panel, Przewodnik wdrożenia i Ustawienia otwierają się bez błędów w konsoli przeglądarki i w logu serwera.`,
|
|
935
|
+
spec.readOnly ? `7. Ta integracja tylko czyta z ${service}: nie ma zapisów do uzbrajania. Użyj klucza tylko do odczytu, jeśli ${service} go oferuje.` : `7. Nie włączaj żadnego zapisu, czyli niczego, co zmienia dane w ${service} albo w sklepie. Każdy zapis uzbraja człowiek w Ustawieniach, po próbie na sucho; opcje tylko na to pozwalają.`,
|
|
936
|
+
`8. Zaproponuj sekcję o tej integracji do notatek projektu dla agentów AI (CLAUDE.md albo AGENTS.md, zależnie od tego, czego używa projekt; jeśli nie ma żadnego, zaproponuj CLAUDE.md) i pokaż mi jej treść, zanim ją zapiszesz: pakiet i jego wersja, gdzie są jego opcje w medusa-config.ts, zmienne środowiskowe, przełącznik demo, to, że zapisy uzbraja człowiek w Ustawieniach, że wdrożenie krok po kroku jest w panelu w Przewodniku wdrożenia, że pomoc jest na Discordzie (${KODA_DISCORD}) i że wtyczka zmienia się aktualizacją pakietu, nigdy edycją node_modules.`,
|
|
922
937
|
"",
|
|
923
938
|
"Na koniec napisz mi, co zmieniłeś i co zostało po mojej stronie: konta i klucze, pierwsze połączenie w Ustawieniach i uzbrojenie zapisów."
|
|
924
939
|
].join("\n");
|
|
@@ -936,16 +951,16 @@ ${spec.demo}`).map(code).join(", ");
|
|
|
936
951
|
"",
|
|
937
952
|
"## Steps",
|
|
938
953
|
"1. Before you change anything, check the project: Medusa 2.12 or newer (the plugin's admin pages and translations need it), the project's package manager and medusa-config.ts. If something blocks the install, stop and tell me what.",
|
|
939
|
-
`2. Install the plugin with the project's package manager, for example ${code(`npm install ${spec.pkg}`)}. If the registry cannot find it, stop and tell me: Koda Plus
|
|
954
|
+
`2. Install this version of the plugin with the project's package manager, for example ${code(`npm install ${pinned}`)}. Then check where the package comes from: ${code(`npm view ${spec.pkg} dist-tags.latest`)} and ${code("npm audit signatures")}. If the registry cannot find it or the signatures do not verify, stop and tell me: Koda Plus helps (${KODA_EMAIL}, Discord ${KODA_DISCORD}).`,
|
|
940
955
|
"3. Register the plugin in medusa-config.ts without touching what is already there. Use the setup from the Setup guide:",
|
|
941
956
|
"",
|
|
942
957
|
...config2,
|
|
943
958
|
"",
|
|
944
|
-
`4. Add the demo switch to the options, as the demo store has it: ${code(spec.demo)}.
|
|
959
|
+
`4. Add the demo switch to the options, as the demo store has it: ${code(spec.demo)}. Demo mode runs only when switched on: then the module works on sample data and never calls ${service}; without it and without keys it says "Not configured" and does nothing.`,
|
|
945
960
|
`5. Put the variables in .env and in the hosting's environment, never in code or in git: ${env}. If I did not give you a value, leave it empty and list it for me at the end.`,
|
|
946
|
-
`6. Run the database migrations (${code("npx medusa db:migrate")}), then the store, and open ${spec.route} in the admin. Check that the Panel, the Setup guide and Settings open with no errors in the browser console or the server log.`,
|
|
947
|
-
`7. Do not turn on any writer, that is anything that changes data in ${service} or in the store. A person arms each writer in Settings, after a dry run; the options only allow it.`,
|
|
948
|
-
`8.
|
|
961
|
+
spec.migrations === false ? `6. Start the store and open ${spec.route} in the admin (this plugin has no tables of its own, no migrations needed). Check that the Panel, the Setup guide and Settings open with no errors in the browser console or the server log.` : `6. Run the database migrations (${code("npx medusa db:migrate")}), then the store, and open ${spec.route} in the admin. Check that the Panel, the Setup guide and Settings open with no errors in the browser console or the server log.`,
|
|
962
|
+
spec.readOnly ? `7. This integration only reads from ${service}: there are no writers to arm. Use a read-only key if ${service} offers one.` : `7. Do not turn on any writer, that is anything that changes data in ${service} or in the store. A person arms each writer in Settings, after a dry run; the options only allow it.`,
|
|
963
|
+
`8. Propose a section about this integration for the project's notes for AI agents (CLAUDE.md or AGENTS.md, whichever the project uses; if neither exists, propose CLAUDE.md) and show me its text before you save it: the package and its version, where its options sit in medusa-config.ts, the environment variables, the demo switch, that a person arms writers in Settings, that the step by step setup is in the admin under Setup guide, that help is on Discord (${KODA_DISCORD}), and that the plugin changes through package updates, never through edits in node_modules.`,
|
|
949
964
|
"",
|
|
950
965
|
"When you are done, tell me what you changed and what is left for me: accounts and keys, the first connection in Settings and arming the writers."
|
|
951
966
|
].join("\n");
|
|
@@ -962,7 +977,7 @@ function PromptButton({ spec, lang, labels }) {
|
|
|
962
977
|
}
|
|
963
978
|
};
|
|
964
979
|
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
|
|
965
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { size: "small", variant: "secondary", onClick: () =>
|
|
980
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { size: "small", variant: "secondary", onClick: () => setState("idle"), children: [
|
|
966
981
|
/* @__PURE__ */ jsxRuntime.jsx(icons.Sparkles, {}),
|
|
967
982
|
labels.button
|
|
968
983
|
] }) }),
|
|
@@ -1046,54 +1061,67 @@ function SettingsView({
|
|
|
1046
1061
|
children
|
|
1047
1062
|
] });
|
|
1048
1063
|
}
|
|
1049
|
-
function
|
|
1050
|
-
|
|
1064
|
+
function CardIcon({ reference }) {
|
|
1065
|
+
return reference.icon ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: reference.icon, alt: "", width: 36, height: 36, className: "h-9 w-9 shrink-0 rounded-md bg-white object-contain shadow-borders-base" }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-medium-plus flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-ui-bg-base text-ui-fg-base shadow-borders-base", children: reference.name.slice(0, 1).toUpperCase() });
|
|
1066
|
+
}
|
|
1067
|
+
function References({ items, title, subtitle, openLabel, soonLabel, reviewLabel, ratingLabel }) {
|
|
1068
|
+
const { live, soon } = splitReferences(items);
|
|
1069
|
+
if (live.length + soon.length === 0) return null;
|
|
1051
1070
|
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
1052
1071
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-1 px-6 py-4", children: [
|
|
1053
1072
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: title }),
|
|
1054
1073
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: subtitle })
|
|
1055
1074
|
] }),
|
|
1056
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
/* @__PURE__ */ jsxRuntime.jsxs("
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1063
|
-
|
|
1075
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 px-6 py-4 md:grid-cols-2 xl:grid-cols-3", children: [
|
|
1076
|
+
live.map((r) => {
|
|
1077
|
+
var _a;
|
|
1078
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3 rounded-lg border border-ui-border-base bg-ui-bg-component px-4 py-3", children: [
|
|
1079
|
+
/* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "group flex items-center gap-x-3", children: [
|
|
1080
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardIcon, { reference: r }),
|
|
1081
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
|
|
1082
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
|
|
1083
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "truncate text-ui-fg-interactive group-hover:text-ui-fg-interactive-hover", children: host(r.url) })
|
|
1084
|
+
] }),
|
|
1085
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "ml-auto shrink-0 text-ui-fg-muted group-hover:text-ui-fg-interactive" })
|
|
1064
1086
|
] }),
|
|
1065
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: nb(r.description) }) : null,
|
|
1077
|
-
((_a = r.metrics) == null ? void 0 : _a.length) || r.since ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
1078
|
-
(r.metrics ?? []).map((m) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { size: "2xsmall", color: "green", children: [
|
|
1087
|
+
r.review ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
|
|
1088
|
+
/* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: r.review.rating, scale: r.review.scale }),
|
|
1089
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-xsmall-plus tabular-nums text-ui-fg-base", children: (ratingLabel ?? ((v) => v.toFixed(1)))(r.review.rating / (r.review.scale || 5) * 5) }),
|
|
1090
|
+
/* @__PURE__ */ jsxRuntime.jsx(SourceMark, { review: r.review }),
|
|
1091
|
+
r.review.url && reviewLabel ? /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.review.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
|
|
1092
|
+
reviewLabel,
|
|
1093
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
|
|
1094
|
+
] }) : null
|
|
1095
|
+
] }) : null,
|
|
1096
|
+
r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: nb(r.description) }) : null,
|
|
1097
|
+
((_a = r.metrics) == null ? void 0 : _a.length) ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-2", children: (r.metrics ?? []).map((m) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { size: "2xsmall", color: "green", children: [
|
|
1079
1098
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: m.value }),
|
|
1080
1099
|
" ",
|
|
1081
1100
|
m.label
|
|
1082
|
-
] }, m.label)),
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
l.
|
|
1088
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "shrink-0" })
|
|
1101
|
+
] }, m.label)) }) : null,
|
|
1102
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-auto flex flex-col gap-y-1 border-t border-ui-border-base pt-2", children: [
|
|
1103
|
+
(r.links ?? []).map((l) => /* @__PURE__ */ jsxRuntime.jsxs("a", { href: l.url, target: "_blank", rel: "noreferrer", className: "txt-compact-small inline-flex w-fit items-center gap-x-1 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
|
|
1104
|
+
l.label,
|
|
1105
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "shrink-0" })
|
|
1106
|
+
] }, l.url)),
|
|
1107
|
+
/* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "txt-compact-small-plus inline-flex w-fit items-center gap-x-1 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
|
|
1108
|
+
openLabel,
|
|
1109
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "shrink-0" })
|
|
1110
|
+
] })
|
|
1093
1111
|
] })
|
|
1094
|
-
] })
|
|
1095
|
-
|
|
1096
|
-
|
|
1112
|
+
] }, r.url ?? r.name);
|
|
1113
|
+
}),
|
|
1114
|
+
soon.map((r) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3 rounded-lg border border-ui-border-base bg-ui-bg-component px-4 py-3", children: [
|
|
1115
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
|
|
1116
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardIcon, { reference: r }),
|
|
1117
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-x-2", children: [
|
|
1118
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
|
|
1119
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "blue", className: "shrink-0", children: soonLabel })
|
|
1120
|
+
] })
|
|
1121
|
+
] }),
|
|
1122
|
+
r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: nb(r.description) }) : null
|
|
1123
|
+
] }, r.url ?? r.name))
|
|
1124
|
+
] })
|
|
1097
1125
|
] });
|
|
1098
1126
|
}
|
|
1099
1127
|
function GuideIntro({ title, text, time, needs, needsLabel, timeLabel }) {
|
|
@@ -1376,7 +1404,7 @@ function usePromptSpec() {
|
|
|
1376
1404
|
needs: Array.isArray(needs) ? needs : [],
|
|
1377
1405
|
config: `// medusa-config.ts, in plugins: [ ... ]
|
|
1378
1406
|
${MEDUSA_CODE}`,
|
|
1379
|
-
demo: 'demo: process.env.SUBIEKT_DEMO === "true"
|
|
1407
|
+
demo: 'demo: process.env.SUBIEKT_DEMO === "true",'
|
|
1380
1408
|
};
|
|
1381
1409
|
}, [t]);
|
|
1382
1410
|
}
|
|
@@ -1473,7 +1501,7 @@ function GuideView({ status, lang }) {
|
|
|
1473
1501
|
title: t("references.title"),
|
|
1474
1502
|
subtitle: t("references.subtitle"),
|
|
1475
1503
|
openLabel: t("references.open"),
|
|
1476
|
-
|
|
1504
|
+
soonLabel: t("references.soon"),
|
|
1477
1505
|
reviewLabel: t("references.review"),
|
|
1478
1506
|
ratingLabel: (value) => fmtRating(value, lang)
|
|
1479
1507
|
}
|
|
@@ -1930,12 +1958,13 @@ function Header({
|
|
|
1930
1958
|
{
|
|
1931
1959
|
items: references,
|
|
1932
1960
|
labels: {
|
|
1933
|
-
count:
|
|
1961
|
+
count: (live, soon) => live > 0 ? live === 1 ? t("references.badgeOne") : t("references.badgeMany", { count: live }) : soon === 1 ? t("references.badgeSoonOne") : t("references.badgeSoonMany", { count: soon }),
|
|
1962
|
+
soonMore: (soon) => t("references.soonMore", { count: soon }),
|
|
1963
|
+
soon: t("references.soon"),
|
|
1934
1964
|
title: t("references.title"),
|
|
1935
1965
|
subtitle: t("references.subtitle"),
|
|
1936
1966
|
open: t("references.open"),
|
|
1937
1967
|
review: t("references.review"),
|
|
1938
|
-
since: (since) => t("references.since", { date: monthYear(since, lang) }),
|
|
1939
1968
|
rating: (value) => fmtRating(value, lang)
|
|
1940
1969
|
}
|
|
1941
1970
|
}
|
|
@@ -2229,6 +2258,62 @@ const config = adminSdk.defineRouteConfig({
|
|
|
2229
2258
|
label: "Subiekt nexo",
|
|
2230
2259
|
icon: SubiektIcon
|
|
2231
2260
|
});
|
|
2261
|
+
const communityEn = {
|
|
2262
|
+
addStore: {
|
|
2263
|
+
button: "Add your store",
|
|
2264
|
+
title: "Does your store run on this integration?",
|
|
2265
|
+
text: "Tell us about it. Once we check it, the store joins this list with a link and its rating.",
|
|
2266
|
+
name: "Store name",
|
|
2267
|
+
url: "Store address",
|
|
2268
|
+
note: "A few words about the setup (optional)",
|
|
2269
|
+
send: "Send the request",
|
|
2270
|
+
copy: "Copy the text",
|
|
2271
|
+
copied: "Request copied, paste it into a mail to hello@koda.plus",
|
|
2272
|
+
hint: "Your mail app opens with the message to {{email}} ready to send.",
|
|
2273
|
+
subject: "A store for {{integration}}",
|
|
2274
|
+
greeting: "Hello, my store runs on {{integration}}. Please add it to the list of stores."
|
|
2275
|
+
},
|
|
2276
|
+
prompt: {
|
|
2277
|
+
button: "Copy prompt",
|
|
2278
|
+
title: "Add this integration to your store",
|
|
2279
|
+
text: "Paste it into Claude Code, Cursor or another AI agent opened in your Medusa project. The agent installs this version of the plugin, sets it up like here and shows you its notes before it saves them.",
|
|
2280
|
+
copy: "Copy",
|
|
2281
|
+
copied: "Prompt copied",
|
|
2282
|
+
failed: "Could not copy. Select the text and copy it by hand."
|
|
2283
|
+
},
|
|
2284
|
+
discord: {
|
|
2285
|
+
button: "Help on Discord",
|
|
2286
|
+
title: "Join the Koda Plus server on Discord"
|
|
2287
|
+
}
|
|
2288
|
+
};
|
|
2289
|
+
const communityPl = {
|
|
2290
|
+
addStore: {
|
|
2291
|
+
button: "Dodaj swój sklep",
|
|
2292
|
+
title: "Twój sklep działa na tej integracji?",
|
|
2293
|
+
text: "Daj nam znać. Po sprawdzeniu dodamy go do tej listy z linkiem i oceną.",
|
|
2294
|
+
name: "Nazwa sklepu",
|
|
2295
|
+
url: "Adres sklepu",
|
|
2296
|
+
note: "Kilka słów o wdrożeniu (opcjonalnie)",
|
|
2297
|
+
send: "Wyślij zgłoszenie",
|
|
2298
|
+
copy: "Kopiuj treść",
|
|
2299
|
+
copied: "Treść skopiowana, wklej ją w mail do hello@koda.plus",
|
|
2300
|
+
hint: "Otworzy się Twoja poczta z gotową wiadomością do {{email}}.",
|
|
2301
|
+
subject: "Zgłoszenie sklepu: {{integration}}",
|
|
2302
|
+
greeting: "Dzień dobry, mój sklep działa na integracji {{integration}}. Proszę o dodanie go do listy sklepów."
|
|
2303
|
+
},
|
|
2304
|
+
prompt: {
|
|
2305
|
+
button: "Kopiuj prompt",
|
|
2306
|
+
title: "Dodaj tę integrację do swojego sklepu",
|
|
2307
|
+
text: "Wklej go w Claude Code, Cursorze albo innym agencie AI otwartym w projekcie Twojej Medusy. Agent zainstaluje tę wersję wtyczki, ustawi ją tak jak tutaj i pokaże Ci notatki, zanim je zapisze.",
|
|
2308
|
+
copy: "Kopiuj",
|
|
2309
|
+
copied: "Prompt skopiowany",
|
|
2310
|
+
failed: "Nie udało się skopiować. Zaznacz tekst i skopiuj go ręcznie."
|
|
2311
|
+
},
|
|
2312
|
+
discord: {
|
|
2313
|
+
button: "Pomoc na Discordzie",
|
|
2314
|
+
title: "Dołącz do serwera Koda Plus na Discordzie"
|
|
2315
|
+
}
|
|
2316
|
+
};
|
|
2232
2317
|
const en = {
|
|
2233
2318
|
title: "Subiekt nexo",
|
|
2234
2319
|
by: "by Koda Plus",
|
|
@@ -2595,39 +2680,15 @@ const en = {
|
|
|
2595
2680
|
title: "Running in stores built by Koda Plus",
|
|
2596
2681
|
subtitle: "Live stores implemented by Koda Plus that run on this integration every day.",
|
|
2597
2682
|
open: "Open the store",
|
|
2598
|
-
since: "Since {{date}}",
|
|
2599
2683
|
badgeOne: "Running in 1 store",
|
|
2600
2684
|
badgeMany: "Running in {{count}} stores",
|
|
2685
|
+
badgeSoonOne: "Coming to 1 store",
|
|
2686
|
+
badgeSoonMany: "Coming to {{count}} stores",
|
|
2687
|
+
soon: "Soon",
|
|
2688
|
+
soonMore: "+{{count}} soon",
|
|
2601
2689
|
review: "Read the review"
|
|
2602
2690
|
},
|
|
2603
|
-
community:
|
|
2604
|
-
addStore: {
|
|
2605
|
-
button: "Add your store",
|
|
2606
|
-
title: "Does your store run on this integration?",
|
|
2607
|
-
text: "Tell us about it. Once we check it, the store joins this list with a link and its rating.",
|
|
2608
|
-
name: "Store name",
|
|
2609
|
-
url: "Store address",
|
|
2610
|
-
note: "A few words about the setup (optional)",
|
|
2611
|
-
send: "Send the request",
|
|
2612
|
-
copy: "Copy the text",
|
|
2613
|
-
copied: "Request copied, paste it into a mail to hello@koda.plus",
|
|
2614
|
-
hint: "Your mail app opens with the message to {{email}} ready to send.",
|
|
2615
|
-
subject: "A store for {{integration}}",
|
|
2616
|
-
greeting: "Hello, my store runs on {{integration}}. Please add it to the list of stores."
|
|
2617
|
-
},
|
|
2618
|
-
prompt: {
|
|
2619
|
-
button: "Copy prompt",
|
|
2620
|
-
title: "Add this integration to your store",
|
|
2621
|
-
text: "Paste it into Claude Code, Cursor or another AI agent opened in your Medusa project. The agent installs the plugin, sets it up like here and leaves notes for further work.",
|
|
2622
|
-
copy: "Copy again",
|
|
2623
|
-
copied: "Prompt copied",
|
|
2624
|
-
failed: "Could not copy. Select the text and copy it by hand."
|
|
2625
|
-
},
|
|
2626
|
-
discord: {
|
|
2627
|
-
button: "Help on Discord",
|
|
2628
|
-
title: "Join the Koda Plus server on Discord"
|
|
2629
|
-
}
|
|
2630
|
-
},
|
|
2691
|
+
community: communityEn,
|
|
2631
2692
|
guide: {
|
|
2632
2693
|
intro: {
|
|
2633
2694
|
title: "Connect Medusa to Subiekt nexo PRO",
|
|
@@ -3251,39 +3312,15 @@ const pl$1 = {
|
|
|
3251
3312
|
title: "Działa w sklepach wdrożonych przez Koda Plus",
|
|
3252
3313
|
subtitle: "Prawdziwe sklepy z wdrożeniem Koda Plus, które pracują na tej integracji na co dzień.",
|
|
3253
3314
|
open: "Otwórz sklep",
|
|
3254
|
-
since: "Od {{date}}",
|
|
3255
3315
|
badgeOne: "Działa w 1 sklepie",
|
|
3256
3316
|
badgeMany: "Działa w {{count}} sklepach",
|
|
3317
|
+
badgeSoonOne: "Wkrótce w 1 sklepie",
|
|
3318
|
+
badgeSoonMany: "Wkrótce w {{count}} sklepach",
|
|
3319
|
+
soon: "Wkrótce",
|
|
3320
|
+
soonMore: "+{{count}} wkrótce",
|
|
3257
3321
|
review: "Zobacz opinię"
|
|
3258
3322
|
},
|
|
3259
|
-
community:
|
|
3260
|
-
addStore: {
|
|
3261
|
-
button: "Dodaj swój sklep",
|
|
3262
|
-
title: "Twój sklep działa na tej integracji?",
|
|
3263
|
-
text: "Daj nam znać. Po sprawdzeniu dodamy go do tej listy z linkiem i oceną.",
|
|
3264
|
-
name: "Nazwa sklepu",
|
|
3265
|
-
url: "Adres sklepu",
|
|
3266
|
-
note: "Kilka słów o wdrożeniu (opcjonalnie)",
|
|
3267
|
-
send: "Wyślij zgłoszenie",
|
|
3268
|
-
copy: "Kopiuj treść",
|
|
3269
|
-
copied: "Treść skopiowana, wklej ją w mail do hello@koda.plus",
|
|
3270
|
-
hint: "Otworzy się Twoja poczta z gotową wiadomością do {{email}}.",
|
|
3271
|
-
subject: "Zgłoszenie sklepu: {{integration}}",
|
|
3272
|
-
greeting: "Dzień dobry, mój sklep działa na integracji {{integration}}. Proszę o dodanie go do listy sklepów."
|
|
3273
|
-
},
|
|
3274
|
-
prompt: {
|
|
3275
|
-
button: "Kopiuj prompt",
|
|
3276
|
-
title: "Dodaj tę integrację do swojego sklepu",
|
|
3277
|
-
text: "Wklej go w Claude Code, Cursorze albo innym agencie AI otwartym w projekcie Twojej Medusy. Agent zainstaluje wtyczkę, ustawi ją tak jak tutaj i zostawi notatki do dalszej pracy.",
|
|
3278
|
-
copy: "Kopiuj jeszcze raz",
|
|
3279
|
-
copied: "Prompt skopiowany",
|
|
3280
|
-
failed: "Nie udało się skopiować. Zaznacz tekst i skopiuj go ręcznie."
|
|
3281
|
-
},
|
|
3282
|
-
discord: {
|
|
3283
|
-
button: "Pomoc na Discordzie",
|
|
3284
|
-
title: "Dołącz do serwera Koda Plus na Discordzie"
|
|
3285
|
-
}
|
|
3286
|
-
},
|
|
3323
|
+
community: communityPl,
|
|
3287
3324
|
guide: {
|
|
3288
3325
|
intro: {
|
|
3289
3326
|
title: "Połącz Medusę z Subiektem nexo PRO",
|