npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@tbox.cn/app-module-member

v0.9.5

Published

商圈会员模块:会员账户、会员卡、积分流水与入会流程(codegen 源)。

Readme

module-member · 会员业务组件

商圈会员域唯一承接组件(@tbox.cn/app-module-member,moduleId member): 入会四动作(支付宝授权 effect → complete-auth 回调)、会员信息、会员卡与偏好记忆、 积分余额与流水、入会表单查询。运行时经 integrations registry 槽位(member×5: account/profile/card/benefits/enrollment——fail-fast 无兜底)接入 provider 包供给的厂商 C 端实现(业务模块零 vendor——真源归 provider 包); InMemoryMemberService 仅供隔离单测使用,不参与运行时注册或失败降级。 同时是全局身份底座:member.status 服务工厂被其他模块消费做登录门禁。

业务职责

| 能力域 | 承接 | |---|---| | 账户状态 | authState/gate 判定、GUEST(已登录未入会)与 MEMBER 区分、登录≠入会 | | 会员信息 | 等级名/卡面图(无 tier 枚举字段,presentation.variant 表达蓝/银/金/黑)| | 积分 | 余额 + 明细(当页 10 条)| | 入会 | CTA 卡/表单卡/入会状态卡 | | 登录 | 登录 CTA 卡(供匿名轮引导)| | 隐私边界 | 隐私诉求拒不澄清,不落任何真实手机号/证件明文 |

架构分层

src/
  server/
    index.ts        模块注册(卡 map / 工具 6 注册 / 无 preTool)
    tool.ts         6 工具定义 + 门禁辅助(~512 行)
    action.ts       动作链(CTA 点击续接,~349 行)
    service.ts      Port 汇编与门禁工厂(~245 行)
    status.ts       账户状态派生(~76 行)
    subject-binding subjectId 绑定(~19 行)
    ports/index.ts  Port 接口(~27 行)
    handler/        意图 handler 骨架(~170 行)
  client/cards/     7 张卡组件

领域模型(契约真源)

  • modules/contracts-mall/src/services/member.ts(~350 行):member Snapshot 型 (账户/积分/权益/入会/卡面)与五 Port:MemberAccountPort、MemberProfilePort、 MemberCardPort、MemberBenefitsPort、MemberEnrollmentPort;SubjectBindingPort 已 deprecated。
  • modules/contracts-mall/src/domain/points.ts / discount.ts:积分与折扣小域。
  • 本模块无 server/domain.ts:账户状态机分散在 status.ts(派生)与 action.ts(续接), 会员实体只在契约 services 层——模块域模型「薄模块 + 契约厚库」形态。

工具清单(tool.ts;index.ts:41-52 单点 withCardEmissionHint 包裹;index.ts:109-114 注册)

| 工具 | 定义行 | oneLiner | carding | actions | |---|---|---|---|---| | queryPoints | tool.ts:160 | 积分账户:余额+明细 facts,供模型作答 | promotion-points-usage | 无 | | queryMemberInfo | tool.ts:239 | 等级/权益概览 facts | member-info | 无 | | queryMemberCard | tool.ts:299 | 会员卡卡面(辅助判定 hasCompleteMemberCard tool.ts:64-66)| member-card-summary | 无 | | queryEnrollmentCta | tool.ts:367 | 入会引导 CTA(含入会状态分流)| member-enrollment-cta | 是 | | queryEnrollmentForm | tool.ts:441 | 入会表单(匿名可查,登录后回填)| member-enrollment-form | 是 | | queryLoginCta | tool.ts:497 | 登录引导 CTA(未登录轮)| member-login-cta | 是 |

细节机制:

  • 匿名短路 anonymousShort(tool.ts:113-120):未登录请求统一短话术 + 登录卡,不发必然失败查询。
  • 隐私拒不面 memberPrivacyRefusal(tool.ts:48-62):模型/用户提隐私核对诉求时冻结卡面细粒度 数据,返回拒不话术(隐私边界工具化而非提示词约定)。
  • queryPoints 链路:getAccount → authState 检查 → 门禁卡或 facts;facts 组装 balance/membershipLabel/items/total/contractNotice,积分服务降级时 pointsNotice 兜底话术。
  • 权益查询 listPointUsage(userId,1,10)(tool.ts:209-215),平台分页缺省 10 条(卡片轮播)。

门禁两级(登录轴)

  • 匿名(identity.source=anonymous):登录 CTA 卡,终止查询。
  • GUEST(已登录未入会):入会 CTA 卡,不误伤可查面。
  • 登录≠入会:任何门禁不得把 GUEST 当匿名拦截。

写动作面

零独立写动作(无 StateStore 命名空间);入会动作由 CTA/表单卡上的 actions 字段 拉起客户端续接(action.ts 动作链),服务端不经工具写状态。

卡片清单(7 张;client/cards/;dataSchema 锚 contracts-mall member schemas)

| cardType | 说明 | |---|---| | member-card-summary | 会员卡面(等级/变体色)| | member-info | 会员信息概览 | | member-point-usage-list | 积分明细列表 | | member-enrollment-cta | 入会引导(含入会入口 actions)| | member-enrollment-form | 入会表单 | | member-enrollment-status | 入会状态回执 | | member-login-cta | 登录引导 |

跨模块协作

  • 供出:member.status 服务工厂(ctx.services 锚)、memberGateCardOftoMallQueryContext (均 contracts-mall 公开入口)——alipay-activity / customer-service / promotion 门禁消费。
  • 不 import 其他 module(跨模块一律经 ctx 服务锚与事件总线)。

铁律摘要

  • import 边界:只 import contracts/sdk 公开入口;client/** 引 server/** 必须 import type。
  • register 只注册不解析;工具实例顶层单例;跨模块交互一律经 ctx。
  • 卡片 key = meta.cardType;exports 恒指 src/。
  • 身份以 reqCtx 为准,不接模型注入的 userId/openId。

已知限制与文档漂移

  • 旧的 README「C 端查询映射」表实为厂商端点映射,本版删除; 端点映射现由对应 provider 包侧维护。
  • @vendor-contract JSDoc 标注尚未存在(全仓 0 命中),Port 语义现摘自普通 JSDoc; 1030 Phase 1 计划增补,增补后本节更新。