@umec/core 0.1.0-alpha.7 → 0.1.0-alpha.8

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.
@@ -49,19 +49,20 @@ function formatOrderLine(order, products, now = Date.now()) {
49
49
  const name = order.name?.trim() || "\u304A\u5BA2\u69D8";
50
50
  return `${name} | ${parseItems(order.items_json, products)} | ${formatYen(order.amount)} | ${elapsedDays}\u65E5`;
51
51
  }
52
- async function notifyUnshipped(orders, env, { alertFrom, alertTo, products = {} }) {
52
+ async function notifyUnshipped(orders, env, { alertFrom, alertTo, alertSubject, products = {} }) {
53
53
  if (orders.length === 0) return;
54
- if (!env.DISCORD_WEBHOOK_URL) throw new Error("DISCORD_WEBHOOK_URL is not configured");
55
54
  if (!env.RESEND_API_KEY) throw new Error("RESEND_API_KEY is not configured");
56
55
  const lines = orders.map((order) => formatOrderLine(order, products));
57
56
  const content = ["\u672A\u767A\u9001\u30A2\u30E9\u30FC\u30C8: pending \u306E\u6CE8\u6587\u304C\u3042\u308A\u307E\u3059\u3002", "", ...lines].join("\n");
58
- const discordResponse = await fetch(env.DISCORD_WEBHOOK_URL, {
59
- method: "POST",
60
- headers: { "Content-Type": "application/json" },
61
- body: JSON.stringify({ content, allowed_mentions: { parse: [] } })
62
- });
63
- if (!discordResponse.ok) {
64
- throw new Error(`Discord notification failed: ${discordResponse.status}`);
57
+ if (env.DISCORD_WEBHOOK_URL) {
58
+ const discordResponse = await fetch(env.DISCORD_WEBHOOK_URL, {
59
+ method: "POST",
60
+ headers: { "Content-Type": "application/json" },
61
+ body: JSON.stringify({ content, allowed_mentions: { parse: [] } })
62
+ });
63
+ if (!discordResponse.ok) {
64
+ throw new Error(`Discord notification failed: ${discordResponse.status}`);
65
+ }
65
66
  }
66
67
  const rows = lines.map((line) => {
67
68
  const [name, items, amount, elapsedDays] = line.split(" | ");
@@ -76,7 +77,7 @@ async function notifyUnshipped(orders, env, { alertFrom, alertTo, products = {}
76
77
  const { error } = await resend.emails.send({
77
78
  from: alertFrom,
78
79
  to: alertTo,
79
- subject: "\u3010emu\u3011\u672A\u767A\u9001\u30A2\u30E9\u30FC\u30C8",
80
+ subject: alertSubject,
80
81
  html: `<!DOCTYPE html>
81
82
  <html lang="ja">
82
83
  <head><meta charset="UTF-8"></head>
@@ -106,4 +107,4 @@ async function notifyUnshipped(orders, env, { alertFrom, alertTo, products = {}
106
107
  export {
107
108
  notifyUnshipped
108
109
  };
109
- //# sourceMappingURL=chunk-QRFFBMFN.js.map
110
+ //# sourceMappingURL=chunk-JWTXQAOL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/notify.ts"],"sourcesContent":["import { Resend } from \"resend\";\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nexport type UnshippedOrder = {\n id: string;\n name: string | null;\n items_json: string | null;\n amount: number | null;\n created_at: number | string | null;\n};\n\nexport type NotifyEnv = {\n DISCORD_WEBHOOK_URL?: string;\n RESEND_API_KEY?: string;\n};\n\ntype CheckoutItem = {\n sku?: unknown;\n quantity?: unknown;\n};\n\nexport type NotifyProduct = {\n name: string;\n};\n\nexport type NotifyProductsMap = Record<string, NotifyProduct | undefined>;\n\nexport type NotifyUnshippedOptions = {\n alertFrom: string;\n alertTo: string;\n alertSubject: string;\n products?: NotifyProductsMap;\n};\n\nfunction formatYen(value: number | null) {\n if (value == null) return \"-\";\n return new Intl.NumberFormat(\"ja-JP\", {\n style: \"currency\",\n currency: \"JPY\",\n maximumFractionDigits: 0,\n }).format(value);\n}\n\nfunction parseTimestamp(value: number | string | null) {\n if (value == null || value === \"\") return null;\n const timestamp = typeof value === \"string\" ? Number(value) : value;\n return Number.isFinite(timestamp) ? timestamp : null;\n}\n\nfunction parseItems(itemsJson: string | null, products: NotifyProductsMap) {\n if (!itemsJson) return \"-\";\n\n try {\n const parsed: unknown = JSON.parse(itemsJson);\n if (!Array.isArray(parsed) || parsed.length === 0) return \"-\";\n\n return parsed\n .map((item) => {\n if (typeof item !== \"object\" || item === null) return null;\n const { sku, quantity } = item as CheckoutItem;\n const productSku = typeof sku === \"string\" ? sku : \"\";\n const productName = productSku && products[productSku] ? products[productSku].name : productSku || \"商品\";\n const itemQuantity = typeof quantity === \"number\" && Number.isFinite(quantity) ? quantity : 0;\n return `${productName} x ${itemQuantity}`;\n })\n .filter((item): item is string => Boolean(item))\n .join(\", \");\n } catch {\n return \"-\";\n }\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction notificationErrorSuffix(error: unknown) {\n if (typeof error !== \"object\" || error === null) return \"\";\n const value = error as { name?: unknown; statusCode?: unknown };\n const details = [\n typeof value.name === \"string\" ? `name=${value.name}` : null,\n typeof value.statusCode === \"number\" ? `statusCode=${value.statusCode}` : null,\n ].filter((detail): detail is string => detail !== null);\n\n return details.length > 0 ? ` (${details.join(\", \")})` : \"\";\n}\n\nfunction formatOrderLine(order: UnshippedOrder, products: NotifyProductsMap, now = Date.now()) {\n const createdAt = parseTimestamp(order.created_at);\n const elapsedDays = createdAt == null ? \"-\" : String(Math.floor((now - createdAt) / DAY_MS));\n const name = order.name?.trim() || \"お客様\";\n return `${name} | ${parseItems(order.items_json, products)} | ${formatYen(order.amount)} | ${elapsedDays}日`;\n}\n\nexport async function notifyUnshipped(\n orders: UnshippedOrder[],\n env: NotifyEnv,\n { alertFrom, alertTo, alertSubject, products = {} }: NotifyUnshippedOptions,\n) {\n if (orders.length === 0) return;\n if (!env.RESEND_API_KEY) throw new Error(\"RESEND_API_KEY is not configured\");\n\n const lines = orders.map((order) => formatOrderLine(order, products));\n const content = [\"未発送アラート: pending の注文があります。\", \"\", ...lines].join(\"\\n\");\n\n if (env.DISCORD_WEBHOOK_URL) {\n const discordResponse = await fetch(env.DISCORD_WEBHOOK_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content, allowed_mentions: { parse: [] } }),\n });\n if (!discordResponse.ok) {\n throw new Error(`Discord notification failed: ${discordResponse.status}`);\n }\n }\n\n const rows = lines\n .map((line) => {\n const [name, items, amount, elapsedDays] = line.split(\" | \");\n return `<tr>\n <td style=\"padding:8px;border-bottom:1px solid #eee;\">${escapeHtml(name ?? \"\")}</td>\n <td style=\"padding:8px;border-bottom:1px solid #eee;\">${escapeHtml(items ?? \"\")}</td>\n <td style=\"padding:8px;border-bottom:1px solid #eee;text-align:right;\">${escapeHtml(amount ?? \"\")}</td>\n <td style=\"padding:8px;border-bottom:1px solid #eee;text-align:right;\">${escapeHtml(elapsedDays ?? \"\")}</td>\n </tr>`;\n })\n .join(\"\");\n\n const resend = new Resend(env.RESEND_API_KEY);\n const { error } = await resend.emails.send({\n from: alertFrom,\n to: alertTo,\n subject: alertSubject,\n html: `<!DOCTYPE html>\n<html lang=\"ja\">\n<head><meta charset=\"UTF-8\"></head>\n<body style=\"font-family:sans-serif;color:#222;max-width:720px;margin:0 auto;padding:32px 16px;\">\n <h1 style=\"font-size:20px;margin:0 0 16px;\">未発送アラート</h1>\n <p style=\"font-size:14px;line-height:1.7;color:#555;\">pending のまま threshold を超えた注文があります。</p>\n <table style=\"width:100%;border-collapse:collapse;font-size:14px;\">\n <thead>\n <tr>\n <th style=\"padding:8px;border-bottom:2px solid #222;text-align:left;\">名前</th>\n <th style=\"padding:8px;border-bottom:2px solid #222;text-align:left;\">商品</th>\n <th style=\"padding:8px;border-bottom:2px solid #222;text-align:right;\">金額</th>\n <th style=\"padding:8px;border-bottom:2px solid #222;text-align:right;\">経過日数</th>\n </tr>\n </thead>\n <tbody>${rows}</tbody>\n </table>\n</body>\n</html>`,\n text: content,\n });\n if (error) {\n throw new Error(`Resend notification failed${notificationErrorSuffix(error)}`);\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  } from "./chunk-4V4GYE7E.js";
19
19
  import {
20
20
  notifyUnshipped
21
- } from "./chunk-QRFFBMFN.js";
21
+ } from "./chunk-JWTXQAOL.js";
22
22
  import {
23
23
  createSubscribeHandler
24
24
  } from "./chunk-X2SNVVFW.js";
package/dist/notify.d.ts CHANGED
@@ -16,8 +16,9 @@ type NotifyProductsMap = Record<string, NotifyProduct | undefined>;
16
16
  type NotifyUnshippedOptions = {
17
17
  alertFrom: string;
18
18
  alertTo: string;
19
+ alertSubject: string;
19
20
  products?: NotifyProductsMap;
20
21
  };
21
- declare function notifyUnshipped(orders: UnshippedOrder[], env: NotifyEnv, { alertFrom, alertTo, products }: NotifyUnshippedOptions): Promise<void>;
22
+ declare function notifyUnshipped(orders: UnshippedOrder[], env: NotifyEnv, { alertFrom, alertTo, alertSubject, products }: NotifyUnshippedOptions): Promise<void>;
22
23
 
23
24
  export { type NotifyEnv, type NotifyProduct, type NotifyProductsMap, type NotifyUnshippedOptions, type UnshippedOrder, notifyUnshipped };
package/dist/notify.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  notifyUnshipped
3
- } from "./chunk-QRFFBMFN.js";
3
+ } from "./chunk-JWTXQAOL.js";
4
4
  export {
5
5
  notifyUnshipped
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umec/core",
3
- "version": "0.1.0-alpha.7",
3
+ "version": "0.1.0-alpha.8",
4
4
  "description": "Headless EC logic for umec — config schema and shared handlers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/notify.ts"],"sourcesContent":["import { Resend } from \"resend\";\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nexport type UnshippedOrder = {\n id: string;\n name: string | null;\n items_json: string | null;\n amount: number | null;\n created_at: number | string | null;\n};\n\nexport type NotifyEnv = {\n DISCORD_WEBHOOK_URL?: string;\n RESEND_API_KEY?: string;\n};\n\ntype CheckoutItem = {\n sku?: unknown;\n quantity?: unknown;\n};\n\nexport type NotifyProduct = {\n name: string;\n};\n\nexport type NotifyProductsMap = Record<string, NotifyProduct | undefined>;\n\nexport type NotifyUnshippedOptions = {\n alertFrom: string;\n alertTo: string;\n products?: NotifyProductsMap;\n};\n\nfunction formatYen(value: number | null) {\n if (value == null) return \"-\";\n return new Intl.NumberFormat(\"ja-JP\", {\n style: \"currency\",\n currency: \"JPY\",\n maximumFractionDigits: 0,\n }).format(value);\n}\n\nfunction parseTimestamp(value: number | string | null) {\n if (value == null || value === \"\") return null;\n const timestamp = typeof value === \"string\" ? Number(value) : value;\n return Number.isFinite(timestamp) ? timestamp : null;\n}\n\nfunction parseItems(itemsJson: string | null, products: NotifyProductsMap) {\n if (!itemsJson) return \"-\";\n\n try {\n const parsed: unknown = JSON.parse(itemsJson);\n if (!Array.isArray(parsed) || parsed.length === 0) return \"-\";\n\n return parsed\n .map((item) => {\n if (typeof item !== \"object\" || item === null) return null;\n const { sku, quantity } = item as CheckoutItem;\n const productSku = typeof sku === \"string\" ? sku : \"\";\n const productName = productSku && products[productSku] ? products[productSku].name : productSku || \"商品\";\n const itemQuantity = typeof quantity === \"number\" && Number.isFinite(quantity) ? quantity : 0;\n return `${productName} x ${itemQuantity}`;\n })\n .filter((item): item is string => Boolean(item))\n .join(\", \");\n } catch {\n return \"-\";\n }\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction notificationErrorSuffix(error: unknown) {\n if (typeof error !== \"object\" || error === null) return \"\";\n const value = error as { name?: unknown; statusCode?: unknown };\n const details = [\n typeof value.name === \"string\" ? `name=${value.name}` : null,\n typeof value.statusCode === \"number\" ? `statusCode=${value.statusCode}` : null,\n ].filter((detail): detail is string => detail !== null);\n\n return details.length > 0 ? ` (${details.join(\", \")})` : \"\";\n}\n\nfunction formatOrderLine(order: UnshippedOrder, products: NotifyProductsMap, now = Date.now()) {\n const createdAt = parseTimestamp(order.created_at);\n const elapsedDays = createdAt == null ? \"-\" : String(Math.floor((now - createdAt) / DAY_MS));\n const name = order.name?.trim() || \"お客様\";\n return `${name} | ${parseItems(order.items_json, products)} | ${formatYen(order.amount)} | ${elapsedDays}日`;\n}\n\nexport async function notifyUnshipped(\n orders: UnshippedOrder[],\n env: NotifyEnv,\n { alertFrom, alertTo, products = {} }: NotifyUnshippedOptions,\n) {\n if (orders.length === 0) return;\n if (!env.DISCORD_WEBHOOK_URL) throw new Error(\"DISCORD_WEBHOOK_URL is not configured\");\n if (!env.RESEND_API_KEY) throw new Error(\"RESEND_API_KEY is not configured\");\n\n const lines = orders.map((order) => formatOrderLine(order, products));\n const content = [\"未発送アラート: pending の注文があります。\", \"\", ...lines].join(\"\\n\");\n\n const discordResponse = await fetch(env.DISCORD_WEBHOOK_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content, allowed_mentions: { parse: [] } }),\n });\n if (!discordResponse.ok) {\n throw new Error(`Discord notification failed: ${discordResponse.status}`);\n }\n\n const rows = lines\n .map((line) => {\n const [name, items, amount, elapsedDays] = line.split(\" | \");\n return `<tr>\n <td style=\"padding:8px;border-bottom:1px solid #eee;\">${escapeHtml(name ?? \"\")}</td>\n <td style=\"padding:8px;border-bottom:1px solid #eee;\">${escapeHtml(items ?? \"\")}</td>\n <td style=\"padding:8px;border-bottom:1px solid #eee;text-align:right;\">${escapeHtml(amount ?? \"\")}</td>\n <td style=\"padding:8px;border-bottom:1px solid #eee;text-align:right;\">${escapeHtml(elapsedDays ?? \"\")}</td>\n </tr>`;\n })\n .join(\"\");\n\n const resend = new Resend(env.RESEND_API_KEY);\n const { error } = await resend.emails.send({\n from: alertFrom,\n to: alertTo,\n subject: \"【emu】未発送アラート\",\n html: `<!DOCTYPE html>\n<html lang=\"ja\">\n<head><meta charset=\"UTF-8\"></head>\n<body style=\"font-family:sans-serif;color:#222;max-width:720px;margin:0 auto;padding:32px 16px;\">\n <h1 style=\"font-size:20px;margin:0 0 16px;\">未発送アラート</h1>\n <p style=\"font-size:14px;line-height:1.7;color:#555;\">pending のまま threshold を超えた注文があります。</p>\n <table style=\"width:100%;border-collapse:collapse;font-size:14px;\">\n <thead>\n <tr>\n <th style=\"padding:8px;border-bottom:2px solid #222;text-align:left;\">名前</th>\n <th style=\"padding:8px;border-bottom:2px solid #222;text-align:left;\">商品</th>\n <th style=\"padding:8px;border-bottom:2px solid #222;text-align:right;\">金額</th>\n <th style=\"padding:8px;border-bottom:2px solid #222;text-align:right;\">経過日数</th>\n </tr>\n </thead>\n <tbody>${rows}</tbody>\n </table>\n</body>\n</html>`,\n text: content,\n });\n if (error) {\n throw new Error(`Resend notification failed${notificationErrorSuffix(error)}`);\n }\n}\n"],"mappings":"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","names":[]}