@curless/shopify-adapter 0.1.0 → 0.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI7D,KAAK,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACtE,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAGpB,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE;QAAE,QAAQ,CAAC,EAAE;YAAE,WAAW,EAAE,OAAO,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;CAC1E,CAAC;AAUF,eAAO,MAAM,eAAe,GAC1B,UAAU,YAAY,EAAE,EACxB,cAAc,MAAM,EACpB,OAAM,CAAC,GAAG,EAAE,MAAM,KAAK,IAA4C,KAClE,WAAW,EA6Bb,CAAC;AAiCF,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,aAAa,EACrB,YAAW,OAAO,KAAa,EAC/B,OAAM,CAAC,GAAG,EAAE,MAAM,KAAK,IAA4C,KAClE,OAAO,CAAC,WAAW,EAAE,CAkBvB,CAAC"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI7D,KAAK,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACtE,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAGpB,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE;QAAE,QAAQ,CAAC,EAAE;YAAE,WAAW,EAAE,OAAO,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;CAC1E,CAAC;AAUF,eAAO,MAAM,eAAe,GAC1B,UAAU,YAAY,EAAE,EACxB,cAAc,MAAM,EACpB,OAAM,CAAC,GAAG,EAAE,MAAM,KAAK,IAA4C,KAClE,WAAW,EAuCb,CAAC;AAiCF,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,aAAa,EACrB,YAAW,OAAO,KAAa,EAC/B,OAAM,CAAC,GAAG,EAAE,MAAM,KAAK,IAA4C,KAClE,OAAO,CAAC,WAAW,EAAE,CAkBvB,CAAC"}
package/dist/catalog.js CHANGED
@@ -22,10 +22,21 @@ export const productsToItems = (products, currencyCode, warn = (m) => console.wa
22
22
  warn(`skipping a "${p.title}" variant with no SKU`);
23
23
  continue;
24
24
  }
25
+ // A single unparseable price shouldn't take down the whole catalog load —
26
+ // skip and warn (toMinor rejects non-plain-decimal strings), so one bad
27
+ // product can't empty the merchant's catalog.
28
+ let priceMinor;
29
+ try {
30
+ priceMinor = toMinor(v.price, currencyCode);
31
+ }
32
+ catch {
33
+ warn(`skipping "${p.title}" (${v.sku}) — unparseable price ${JSON.stringify(v.price)}`);
34
+ continue;
35
+ }
25
36
  items.push({
26
37
  sku: v.sku,
27
38
  name: p.title,
28
- priceMinor: toMinor(v.price, currencyCode),
39
+ priceMinor,
29
40
  currency: currencyCode,
30
41
  description: p.description,
31
42
  imageUrl: p.featuredImage?.url,
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
package/dist/money.d.ts CHANGED
@@ -1,6 +1,12 @@
1
1
  /** Minor-unit exponent for an ISO currency (default 2). */
2
2
  export declare const decimalsFor: (currency: string) => number;
3
- /** Decimal-string major amount ("2450.00") → integer minor units, for `currency`. */
3
+ /**
4
+ * Decimal-string major amount ("2450.00") → integer minor units, for `currency`.
5
+ * Accepts only a plain signed decimal — a thousands separator, scientific
6
+ * notation, or junk is REJECTED (throws) rather than silently becoming NaN or a
7
+ * wrong-magnitude/wrong-sign amount. The sign is applied to the whole value so a
8
+ * negative fraction can't flip positive (e.g. "-0.99" → -99, not +99).
9
+ */
4
10
  export declare const toMinor: (amount: string, currency: string) => number;
5
11
  /** Integer minor units → decimal-string major amount ("245000" → "2450.00"), for `currency`. */
6
12
  export declare const toMajorString: (minor: number, currency: string) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAmCA,2DAA2D;AAC3D,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,KAAG,MACG,CAAC;AAEnD,qFAAqF;AACrF,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,MAM1D,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,MACM,CAAC"}
1
+ {"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAmCA,2DAA2D;AAC3D,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,KAAG,MACG,CAAC;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,MAQ1D,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,MACM,CAAC"}
package/dist/money.js CHANGED
@@ -33,13 +33,22 @@ const MINOR_UNIT_DECIMALS = {
33
33
  };
34
34
  /** Minor-unit exponent for an ISO currency (default 2). */
35
35
  export const decimalsFor = (currency) => MINOR_UNIT_DECIMALS[currency.toUpperCase()] ?? 2;
36
- /** Decimal-string major amount ("2450.00") → integer minor units, for `currency`. */
36
+ /**
37
+ * Decimal-string major amount ("2450.00") → integer minor units, for `currency`.
38
+ * Accepts only a plain signed decimal — a thousands separator, scientific
39
+ * notation, or junk is REJECTED (throws) rather than silently becoming NaN or a
40
+ * wrong-magnitude/wrong-sign amount. The sign is applied to the whole value so a
41
+ * negative fraction can't flip positive (e.g. "-0.99" → -99, not +99).
42
+ */
37
43
  export const toMinor = (amount, currency) => {
38
44
  const dp = decimalsFor(currency);
39
- const [wholeRaw = '0', fracRaw = ''] = amount.trim().split('.');
40
- const whole = wholeRaw === '' ? '0' : wholeRaw;
45
+ const m = /^(-?)(\d+)(?:\.(\d+))?$/.exec(amount.trim());
46
+ if (!m)
47
+ throw new Error(`toMinor: not a plain decimal amount: ${JSON.stringify(amount)}`);
48
+ const [, sign, wholeRaw, fracRaw = ''] = m;
41
49
  const frac = `${fracRaw}${'0'.repeat(dp)}`.slice(0, dp);
42
- return Number(whole) * 10 ** dp + (dp > 0 ? Number(frac) : 0);
50
+ const minor = Number(wholeRaw) * 10 ** dp + (dp > 0 ? Number(frac) : 0);
51
+ return sign === '-' ? -minor : minor;
43
52
  };
44
53
  /** Integer minor units → decimal-string major amount ("245000" → "2450.00"), for `currency`. */
45
54
  export const toMajorString = (minor, currency) => (minor / 10 ** decimalsFor(currency)).toFixed(decimalsFor(currency));
package/dist/money.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"money.js","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,iFAAiF;AACjF,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAE5E,2EAA2E;AAC3E,uCAAuC;AACvC,MAAM,mBAAmB,GAA2B;IAClD,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAU,EAAE,CACtD,mBAAmB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;AAEnD,qFAAqF;AACrF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAU,EAAE;IAClE,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/C,MAAM,IAAI,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAU,EAAE,CACvE,CAAC,KAAK,GAAG,EAAE,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"money.js","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,iFAAiF;AACjF,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAE5E,2EAA2E;AAC3E,uCAAuC;AACvC,MAAM,mBAAmB,GAA2B;IAClD,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAU,EAAE,CACtD,mBAAmB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAU,EAAE;IAClE,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1F,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACvC,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAU,EAAE,CACvE,CAAC,KAAK,GAAG,EAAE,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../src/orders.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMjF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,aAAa,EACrB,OAAO,cAAc,EACrB,YAAW,OAAO,KAAa,KAC9B,OAAO,CAAC,eAAe,CAoDzB,CAAC"}
1
+ {"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../src/orders.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMjF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,aAAa,EACrB,OAAO,cAAc,EACrB,YAAW,OAAO,KAAa,KAC9B,OAAO,CAAC,eAAe,CA6DzB,CAAC"}
package/dist/orders.js CHANGED
@@ -17,16 +17,25 @@ const FIND_BY_TAG = 'query($q:String!){ orders(first:1, query:$q){ nodes{ id nam
17
17
  const ORDER_CREATE = 'mutation($o:OrderCreateOrderInput!){ orderCreate(order:$o){ order{ id name } userErrors{ field message } } }';
18
18
  export const writebackShopifyOrder = async (config, input, fetchImpl = fetch) => {
19
19
  const token = await exchangeToken(config, fetchImpl);
20
+ // Only use the order id for idempotency if it's a safe, tag-searchable token —
21
+ // real ids (pi_…/ord_…/UUID) always are. A value with a space or a Shopify
22
+ // search operator would make `tag:${id}` false-match an unrelated order (and
23
+ // silently drop the writeback), and Shopify normalizes odd tags so the stored
24
+ // tag wouldn't equal the searched one (→ a duplicate). An unsafe id degrades to
25
+ // no-dedupe (create anyway), never mis-dedupe.
26
+ const idemTag = input.agentbankOrderId && /^[A-Za-z0-9_.:-]{1,255}$/.test(input.agentbankOrderId)
27
+ ? input.agentbankOrderId
28
+ : undefined;
20
29
  // Idempotency: find an existing order tagged with this agentbank order id.
21
- if (input.agentbankOrderId) {
22
- const found = await shopifyGraphql(config, token, FIND_BY_TAG, { q: `tag:${input.agentbankOrderId}` }, fetchImpl);
30
+ if (idemTag) {
31
+ const found = await shopifyGraphql(config, token, FIND_BY_TAG, { q: `tag:${idemTag}` }, fetchImpl);
23
32
  const existing = found.orders.nodes[0];
24
33
  if (existing)
25
34
  return { created: false, reason: `already written back (${existing.name})` };
26
35
  }
27
36
  const tags = ['agentbank', `protocol:${input.protocol}`];
28
- if (input.agentbankOrderId)
29
- tags.push(input.agentbankOrderId);
37
+ if (idemTag)
38
+ tags.push(idemTag);
30
39
  const note = `Paid via agentbank · protocol ${input.protocol}${input.agentbankOrderId ? ` · order ${input.agentbankOrderId}` : ''}`;
31
40
  const lineItem = {
32
41
  variantId: `gid://shopify/ProductVariant/${input.variantId}`,
@@ -37,11 +46,9 @@ export const writebackShopifyOrder = async (config, input, fetchImpl = fetch) =>
37
46
  // variant's current price. Omitting unitPriceMinor/currency keeps the variant
38
47
  // price (Shopify's default).
39
48
  if (input.unitPriceMinor != null && input.currency) {
49
+ const currencyCode = input.currency.toUpperCase(); // Shopify's CurrencyCode enum is upper-case
40
50
  lineItem.priceSet = {
41
- shopMoney: {
42
- amount: toMajorString(input.unitPriceMinor, input.currency),
43
- currencyCode: input.currency,
44
- },
51
+ shopMoney: { amount: toMajorString(input.unitPriceMinor, currencyCode), currencyCode },
45
52
  };
46
53
  }
47
54
  const data = await shopifyGraphql(config, token, ORDER_CREATE, { o: { lineItems: [lineItem], financialStatus: 'PAID', note, tags } }, fetchImpl);
@@ -1 +1 @@
1
- {"version":3,"file":"orders.js","sourceRoot":"","sources":["../src/orders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orders.js","sourceRoot":"","sources":["../src/orders.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curless/shopify-adapter",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Use a Shopify store as an agentbank catalog source, and record agent-settled sales back as paid Shopify orders. Maps Shopify Admin products → a generic CatalogItem your merchant backend prices from, and writes an order back after an agent pays through agentbank. Zero runtime dependencies (uses the platform fetch).",
5
5
  "license": "MIT",
6
6
  "type": "module",