@jsondrop/commerce

中文文档
0.1.0发布于 2026/11/01MITTypeScriptES Module零依赖

Drupal Commerce类型和一个用于@jsondrop/core的commerce_api客户端(购物车、结帐、支付)。

中文使用文档
文档目录5 节
  1. 目录
  2. 购物车和结帐
  3. 产品包
  4. 其他商务模块
  5. 扩展

@jsondrop /商务

Drupal Commerce类型和客户端 commerce_api 模块:购物车, 优惠券,结帐,航运和付款。

npm install @jsondrop/core @jsondrop/drupal @jsondrop/commerce

需要 commerce_api (8.x-1.x)在Drupal端。

目录

commerce_api重命名Commerce的资源类型: commerce_ 前缀 go和下划线变成了连字符,路径被复数化。

Drupal资源类型路径
commerce_product (默认)product--default/jsonapi/products/default
commerce_product_variation (默认)product-variation--default/jsonapi/product-variations/default
commerce_order (默认)order--default/jsonapi/orders/default
commerce_order_item (默认)order-item--default/jsonapi/order-items/default
commerce_store (在线)store--online/jsonapi/stores/online
commerce_promotion_couponpromotion-coupon/jsonapi/promotion-coupons

JSON:API Extras覆盖重命名。 在带有Extras的网站上,类型 保留Drupal的名称(commerce_product_variation--default),除非 资源配置则相反,站点将两者混合在一起。这两种类型都接受 命名;对于路径,使用 client.withDiscoveredPaths();对于类型名称 CommerceApi 发送, naming: 'drupal' (并下达命令,而不是 id,所以它们自己的类型被发送)。

withCommerceApi(client) 给出解析这些路径的客户端,以及 类型是按实体类型注册的,所以每个产品包都是 Product,每一种变化 ProductVariation等等。

import { JsonApiClient } from '@jsondrop/core';
import { withCommerceApi } from '@jsondrop/commerce';

const drupal = withCommerceApi(new JsonApiClient({ baseUrl: 'https://shop.example.com' }));
const products = await drupal.getCollection('product--default', { query: { include: ['variations'] } });
products[0].variations; // ProductVariation[], with resolved_price

购物车和结帐

import { CommerceApi, checkoutStatus, createCartToken } from '@jsondrop/commerce';

const commerce = new CommerceApi(drupal).withCartToken(token ?? createCartToken());

await commerce.addToCart({ type: 'product-variation--default', id: variationId, quantity: 2 });
const [cart] = await commerce.getCarts();
await commerce.applyCoupons(cart.id, 'SAVE10');

await commerce.updateCheckout(cart.id, {
  email: '[email protected]',
  billing_information: { address: { country_code: 'HR', locality: 'Zagreb', postal_code: '10000', address_line1: 'Ilica 1' } },
});
const { constraints, shippingRates, paymentOptions, ready } = checkoutStatus(await commerce.getCheckout(cart.id));
方法端点
getCurrentStore()GET /current-store
getCarts(), getCart(id)GET /carts, GET /carts/{order}
addToCart(items)POST /cart/add
updateCartItem(order, item, { quantity })PATCH /carts/{order}/items/{item}
removeCartItems(order, items)DELETE /carts/{order}/items
clearCart(order)DELETE /carts/{order}
applyCoupons(order, codes), removeCoupons(order)PATCH / DELETE /carts/{order}/coupons
getCheckout(order), updateCheckout(order, changes)GET / PATCH /checkout/{order}
getShippingMethods(order)GET /checkout/{order}/shipping-methods
createPayment(order, { gatewayId })POST /checkout/{order}/payment
approvePayment(order, params)GET /checkout/{order}/payment/approve (离线返回)

订单 可以作为ID或订单本身传递(getCarts() 将它们返回);对于订单,发送其类型的请求使用真实类型 (order--regular,而不是配置的默认值)。

你自己的模型。 方法是泛型的,并使用包的类型进行类型化 默认情况下。如果您将响应映射到您自己的模型,请使用未类型化的响应: commerce.getCarts<Resource>().

车令牌。 Commerce_api从不发出一个:客户端创建一个 (createCartToken())并将其发送为 Commerce-Cart-Token;车创建 下面的权利属于所有持有它的人。将它保存在httpOnly cookie中并调用 从服务器获取Drupal。看到 例子6.

支付。 createPayment 用付款支付订单的余额 仪表(现场和手动网关)和下订单。它返回 整个响应,所以一个网关模块用一个额外的步骤来响应 可以由调用方处理。场外网关重定向客户,并且 approvePayment 在他们返回时完成付款。

产品包

为 commerce_variation_bundle: 带有“变体包”特征的变体类型保存着包项 (bundle-item--{type}),每一个都是另一种变化的数量。

import { bundleItems, type VariationBundle } from '@jsondrop/commerce';

declare module '@jsondrop/core' {
  interface ResourceTypes {
    'product-variation--bundle': VariationBundle<'bundle'>;
  }
}

const set = await drupal.getResource('product-variation--bundle', id, {
  query: { include: ['bundle_items.variation'] },
});
set.bundle_discount; // percentage off the items
for (const { variation, quantity, unitPrice } of bundleItems(set)) {
  // enabled items, with their variation and its resolved unit price
}

isVariationBundle(variation) 从普通的变化中区分包。添加一个 像任何变化一样捆在车上;模块从它的物品中定价。

其他商务模块

Commerce_api重命名每一个 commerce_* 实体类型,也有贡献类型。 COMMERCE_ENTITY_TYPES 列出了解决问题的途径(商业, commerce_shipping commerce_variation_bundle);在commerce_api中添加其他的 命名:

const drupal = withCommerceApi(client, ['license', 'wishlist-item']);
// or
const commerce = new CommerceApi(client, { entityTypes: ['license'] });

扩展

  • 你的包和字段: 示例4.
  • 你的模块的端点,头和支付流:子类 CommerceApi, 示例5.
  • 其他名称: orderType, couponType, paymentType 和 cartInclude 选项。

版本与发布记录

@jsondrop/commerce 共发布 2 个版本,首次发布于 2026/11/01;过去 12 个月发布了 2 个版本。

版本发布日期距今
0.1.0latest2026/11/011 天前
0.0.0-stage2026/11/011 天前

关于 @jsondrop/commerce 的常见问题

@jsondrop/commerce 是什么?

Drupal Commerce类型和一个用于@jsondrop/core的commerce_api客户端(购物车、结帐、支付)。

如何安装 @jsondrop/commerce?

在项目目录运行 npm install @jsondrop/commerce,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@jsondrop/core(^0.1.0)、@jsondrop/drupal(^0.1.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@jsondrop/commerce 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@jsondrop/commerce 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@jsondrop/commerce 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20.19。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@jsondrop/commerce 可以商用吗?

@jsondrop/commerce 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@jsondrop/commerce 还在维护吗?

最新版本 0.1.0 发布于 2026/11/01(1 天前);至今共发布 2 个版本,其中过去 12 个月发布了 2 个;首次发布于 2026/11/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。