@cosyte/ncpdp

中文文档
0.1.6发布于 2026/11/10MITTypeScriptESM + CJS构建来源已验证近 30 天下载 3523

NCPDP 解析器,序列器,以及Node.js和TypeScript的构建器:SCRIPT ePrepression and Telecom dromice claims, 宽大于解析, spec-clean on exmit.

中文使用文档
文档目录17 节
  1. 为什么会这样
  2. 状态
  3. 安装
  4. 依赖关系
  5. 使用量
  6. 发送和阅读电信账单索赔
  7. 读取 STIPT NewRx
  8. API 密码
  9. 日期和时间
  10. 兼容性
  11. 文档
  12. 支助
  13. 警卫
  14. PHI 与安全
  15. 捐款
  16. 许可证
  17. 商标
The Cosyte logo on its own white ground: the icon beside the word Cosyte.

@ cosyte/ ncpdp

在不购买标准的情况下,用一行读取销售商-quirky Telecom药店索赔或STRIPT ePrecific.

npm version CI License: MIT Node

NCPDP 解析器、序列器和节点和类型Script的构建器: SCRIPT ePresent和Telecom 药房要求,宽大 剖析, 光谱清洁 弹出.

为什么会这样

NCPDP是一个品牌下两个结构上无关的标准: SCRIPT,一种XML ePrepression格式, 以及电讯标准,一种控制性质药店索赔格式。 这个 两份指南的执行指南都是购买的产品,因此节点小组通常的路线是: 手卷读者对向导,有人要买:元素走过 fast-xml-parser 斯德哥尔摩,a String.split 页:1 这工作直到 真正的输入到达,然后一个卖家的怪异 是一个例外 扔在中间 离相抵消是一个错误的字段,一个货币金额用 parseFloat 支付错误 金额。 这个软件包是另一个选择:一个宽大化的阅读器,将怪事变成位置 警告而不是失败,一个只写光谱干净输出的保守的发射器,以及 数量和金钱按字符串处理,所以二进制浮动点永远不能损坏一个值.

状态

0.1线. 公共API是定居和稳定的,足以依赖. 输出函数 其论据的形状、它们返回的模型字段和稳定的警告代码的消费者 分支上的所有内容都包含在此发布后的语义版本中; 重命名一个警告代码 是一个突破性的变化,被作为一体对待.

两种公共表面仍在移动,两者都是添加式视图而不是剖析本身:

  • 结构化的SIG视图 (单位:千美元)medication.sig) (中文(简体) ). 明确损失并明确标注: 自由文本 sigText 永远是权威的 永远不会被覆盖 结构化的组件 只有在已公布的字段标签显示其元素名称时才解码。 这个被禁用的名字列表可以 当重新检查其定位时丢失一个名称, 这将移动组件从 coded 改为 absent。 。 。 .
  • 线码标签表 (单位:千美元)known 在拒绝, DUR, 或理由代码。 标签船只在 所以大多数密码都作为光线密码 known: false当发现一件文物时,会添加标签,而且永远不会猜到.

两种电线格式上的其他一切都解决了. 软件包做和不解码是 一次,在 合规说明。 。 。 .

安装

pnpm add @cosyte/ncpdp

22号或以后试验的节点js 22、24和26(engines.node 实值 >=22.0.0) (中文(简体) ). 软件包是 无害环境管理"type": "module"和船 共同JS建造 旁边,所以 import 财务报告和审定财务报表 require 都决心 通过相同的 exports 地图。 脚本类型解析 node16 遗产 node10。 。 。 .

依赖关系

电信方面是零依赖,只有节点标准库. STRIPT一方只拿一个 经审查的运行时间依赖, fast-xml-parser,用于名称意识 XML 解析, 配置了 XXE 安全, 实体解析被禁用 。 不再依赖运行时间 添加时没有同样的审查.

使用量

下文的两个例子是完整的程序。 每一个都与这个包裹相撞 下方的块 这是它印刷的,逐字记录。 每一个病人、医生、成员和产品价值 是人工合成的.

发送和阅读电信账单索赔

import { buildTelecomRequest, serializeTelecom, parseTelecom, claim } from "@cosyte/ncpdp/telecom";

// Emit a spec-clean Telecom B1 billing claim. Every value below is synthetic.
const wire = serializeTelecom(
  buildTelecomRequest({
    header: { transactionCode: "B1", binNumber: "999999", dateOfService: "20260115" },
    segments: [
      { segmentId: "04", fields: [{ id: "C2", value: "SYNTHCARD09" }] },
      {
        segmentId: "07",
        fields: [
          { id: "D2", value: "RX0000001" },
          { id: "E1", value: "03" },
          { id: "D7", value: "99999999999" },
          { id: "E7", value: "30000" },
          { id: "D5", value: "30" },
        ],
      },
    ],
  }),
);

// Read it back. A vendor quirk becomes a positioned warning here, never a throw.
const t = parseTelecom(wire);
const c = claim(t);

console.log(t.kind, t.header.transactionCode, t.warnings.length);
console.log(c?.cardholderId, c?.prescriptionReferenceNumber);
console.log(c?.product?.id, c?.product?.qualifier);
console.log(c?.quantityDispensed?.source, c?.quantityDispensed?.impliedDecimal);
request B1 0
SYNTHCARD09 RX0000001
99999999999 03
30000 30.000

注意倒数行. 所发放的数量带有一个隐含的小数点后三分位数,逐字记录则含有 源保存在缩放值旁边,该值是按字符串而不是通过浮点生成的.

读取 STIPT NewRx

import { parseScript, newRx } from "@cosyte/ncpdp/script";

// A minimal SCRIPT NewRx. Every value below is synthetic.
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<Message xmlns="http://www.ncpdp.org/schema/SCRIPT" version="2017071">
  <Header><MessageID>SYNTH-MSG-0001</MessageID></Header>
  <Body><NewRx>
    <Patient><HumanPatient>
      <Name><LastName>Testpatient</LastName><FirstName>Avery</FirstName></Name>
      <DateOfBirth><Date>1990-04-12</Date></DateOfBirth>
    </HumanPatient></Patient>
    <MedicationPrescribed>
      <DrugDescription>Amoxicillin 500 MG Oral Capsule</DrugDescription>
      <DrugCoded><ProductCode Qualifier="ND">99999999999</ProductCode></DrugCoded>
      <Sig><SigText>Take 1 capsule by mouth three times daily for 10 days.</SigText></Sig>
    </MedicationPrescribed>
  </NewRx></Body>
</Message>`;

const msg = parseScript(xml);
const rx = newRx(msg); // the NewRx body, or undefined for another transaction

console.log(msg.header.messageId, msg.warnings.length);
console.log(rx?.patient?.name?.lastName, rx?.patient?.dateOfBirth);
console.log(rx?.medication?.description, rx?.medication?.coded?.productCode?.system);
console.log(rx?.medication?.sig?.sigText);
SYNTH-MSG-0001 0
Testpatient 1990-04-12
Amoxicillin 500 MG Oral Capsule NDC
Take 1 capsule by mouth three times daily for 10 days.

更多的任务,每一个都有自己的榜样,都包含在如何指导,从 读取 PBM 回复 财务报告和审定财务报表 构建和序列化信件。 。 。 .

API 密码

五个密码入口,加 @cosyte/ncpdp/package.json 用于读出清单的工具:

导入它携带着什么
@cosyte/ncpdpVERSION 和每一次导出 script, (中文(简体) ), telecom, (中文(简体) ), common,以及 profiles
@cosyte/ncpdp/script师曰 parseScript, (中文(简体) ), newRx,反应脊椎status 编号 : error 编号 : verify),生命周期读取器(rxRenewalResponse 编号 : rxChangeResponse 编号 : cancelRxResponse, (中文(简体) ), approvalOf, (中文(简体) ), serializeScript, (中文(简体) ), buildNewRx, (中文(简体) ), buildScriptResponse
@cosyte/ncpdp/telecom电讯: parseTelecom, (中文(简体) ), claim, (中文(简体) ), adjudication, (中文(简体) ), compound, (中文(简体) ), cobOtherPayments, (中文(简体) ), responseCob, (中文(简体) ), requestDur, (中文(简体) ), priorAuthorization, (中文(简体) ), serializeTelecom, (中文(简体) ), buildTelecomRequest
@cosyte/ncpdp/common共享词汇 : ndcValue, (中文(简体) ), decimalValue,位置帮助器,警告和致命代码常数两个格式共享
@cosyte/ncpdp/profilesdefineProfile, (中文(简体) ), partitionWarnings,以及内置 profiles.surescripts 财务报告和审定财务报表 profiles.pbm

签名、返回类型和每个字段的笔记都作为 JSDoc 公开输出,所以编辑器 显示其内含。 咬人的警示,没有签名可以显示,是:

  • 拒绝总是获胜. 处理反应是交易中的一项总功能 反应状态和拒绝代码一起。 如有拒绝,则处分如下: "rejected" 即使已支付状态外地索偿, 矛盾的表面 反而 未解决。 消费者从未被告知一个被拒绝的索赔已经支付。 未识别状态为 "unknown"从来没有支付.
  • 否认绝不是认可. 生命周期结果只从反应中读取 选择元素。 未确认或不存在的结果如下: "unknown",且反应不正确 拥有一个以上的结果首先解决拒绝问题。 在一个 approvedWithChanges读取 medicationPrescribed:这是被改变的药物,这是可以分发的药物.
  • 一个 Error 从来没有成功. 一个危机 disposition 仅取自反应机构 类型,如果一个错误的信息包含一个以上的响应机构,则最保守 一个赢。 代码和说明是浮出水面的;没有代号表船.
  • 金钱和数量从不浮出水面. 每笔金额都包含一个隐含的 二位小数和一个 可选小区小数点后超小数符号,数量表示小数点后三位数。 两者都是 应用字符串,将逐字记录源保留在结果旁边。 任何出乎意料的事都会发生 保留于 isValid: false 并且没有解释价值 而不是猜测.
  • 没有什么是默默地放弃的. 未知的片段、未知的字段和错误的符号是 保持了逐字记录和警告。 每一个解码交易都与自己的索引相对应 区段、字节相抵和警告,以及后期交易成本的缺陷。 每个复合成分,每个效益协调 钱行,每个回报 DUR 提醒被浮出水面, 从未合并或截断; 已声明的数与 解码的计数会发出警告, 却一无所获。 报告申报的交易数,绝不 已执行.
  • 事先授权是存在,而不是裁决. 它报告说,该部分已经提交 并呼应类型和数字。 它从未决定授权是否有效或是否得到尊重.
  • 结构化SIG有添加剂和失活性. sigText 永远是真理的来源 与结构化观点相协调;如果两者意见相左,则两者都表面为正. 每个 组件被标记 coded, (中文(简体) ), derived,或 absent,一个缺席者 永远不会从自由 文本,而一个模糊的剂量读取 absent 而不是被猜测.
  • Emit是犬形,不是字节身份. 读取是失落的,所以放出复制的模型 内容 : serialize(parse(serialize(x))) 字节与 serialize(x) 财务报告和审定财务报表 parse(serialize(x)) 结构上等于 x。构建者拒绝无效的消息 以有打字错误的方式建造,而不排放畸形的东西 值在错误中永远不会重复。 将 SCRIPT 交易序列化, 软件包不建模 丢弃而不是写带有删除正文的文档:测试 body.kind 首先转发 原字节.
  • 只有结构性腐败才能产生. 空输入, 非 XML, 缺少信件根, 前 XML 遗留版本,没有设置字节,和不支持的版本印章都是输入致命错误. 其它的都是带有稳定代码和位置的警告.

日期和时间

每个有日期的字段 在一个解析模型上 是,并留下来 逐字记录字符串 到达时 电线。 在下面没有东西会改写一个 转换是 选入: 你找到他们的时候 想要一个日期作为部分,作为ISO-8601,或者作为一个瞬间,直到你这样做, header.dateOfService 财务报告和审定财务报表 claim.dateOfBirth 正是发送者发送的字符.

dateValue 将线条串解码为值; toObject, (中文(简体) ), toISO,以及 toDate 读取该值. 每个名字都一样 @cosyte/* par.

import { dateValue, toObject, toISO, toDate } from "@cosyte/ncpdp";

const dos = dateValue(t.header.dateOfService); // "20260629"

toObject(dos); // { year: 2026, month: 6, day: 29 }: month is 1 to 12, never 0 to 11
toISO(dos); // "2026-06-29": truncated to the precision stated, nothing appended
toDate(dos); // undefined: see the timezone rule below
toDate(dos, { assumeOffsetMinutes: 0 }); // 2026-06-29T00:00:00.000Z
toDate(dos, { assumeOffsetMinutes: -300 }); // 2026-06-29T05:00:00.000Z

一种电线形式被解码: CCYYMMDD。 。 。 . 这是本套件唯一公布的日期表 在交易页头和在出生日期(304-C4)的病人部分. 所有其他有日期或有时间的字段均按无说明形式逐字记录: 苏格兰 <SentTime>, (中文(简体) ), <DateOfBirth>,以及 <WrittenDate> 值,以及 Telecom 其他付款日期 (443-E8)和上个填充日期(530-FU)值. dateValue 答题 undefined 这些 而不是猜测一种表格,因为能解决问题的文件是购买的产品 此软件包不重新分配或引用,从猜测中解码的日期是一个错误的答案: 没什么好宣布的 田地本身未受破坏,仍可读取.

一天的日历没有被拒绝,从来没有翻转. dateValue("20240230") 实值 undefined,一个 DateValue 使用相同的组件构建或分散: 转换应用相同的 4/100/400 跳跃规则 解码器应用,所以两种路径都一样 同样的八位数。 这儿没什么 "2024-02-30",每个 ISO-8601 读取 回到3月1日,和 toDate 在接下来的一个月内永远不要返回.

toDate 永远猜不到一个区域. 这里没有解码的表格带有 UTC 偏移,所以区从不 自行决定:无 assumeOffsetMinutes 你会得到 undefined,以及 主机的 时区从不读取, UTC 也从不假设. 提供冲抵 0 意思是"条约" 这个天真值作为UTC))或得到一无所获. 这种拒绝是关键:一个出生日期已经确定 在每一负震荡区,它都默默地行动.

toObject 只返回所报值的组件,因此 Object.keys() 恢复它的精度. 删除 offsetMinutes 离开对象 Temporal.PlainDate.from 和豪华的 DateTime.fromObject 接受现在。 这里两个库都不是依赖; 此软件包将保留 除其 XML 解析器外,零运行时间依赖.

使用两个 @cosyte 在一个文件中解析

三个名字在套间上刻意相同 所以把两个解码器导入一个 模块表示别名或名称间隔:

import { toISO as ncpdpToISO, dateValue } from "@cosyte/ncpdp";
import { toISO as hl7ToISO, parseDtm } from "@cosyte/hl7";

ncpdpToISO(dateValue(c.dateOfBirth)); // c: the Telecom claim view
hl7ToISO(parseDtm(dtm)); // dtm: an HL7 v2 timestamp string

// or namespace them instead
import * as ncpdp from "@cosyte/ncpdp";

兼容性

标准版本. 每个标准的哪个版本被解码,该章在不识别的情况下被识别 已解码的公用栏目,每个栏目的通过日期,以及结束通过的日期 一次也只有一次,在 合规说明他们是 故意不在这里重述 因为第二本是一份过时的.

卖家怪异. 贸易伙伴和伴行指南的差异通过简介处理 系统 : defineProfile() 加内置 profiles.surescripts 科学、技术和科学研究所 profiles.pbm 页:1 电信,通过同一个公共API 并基于真正的容忍定律 比猜测。 附上一个 parseScript(xml, { profile }) 或者说 parseTelecom(raw, { profile })。简介为 说明数字 : 附带属性和电源警告分区,附带配置文件的输出是 字节- 和输出相同, 没有一个 。 剖面图不会改变剖面 .

以相隔为名,取而代之. 受管制物质的电子说明已失效 它需要缉毒署管制的签名核查和 不同的认证姿态。 解析和排放只是全信息,没有流线 模式。 STIPT 构建器释放它获得的SIG, 并且不从结构中生成 结构化的SIG解码不读取任意的自然语言方向. 大部分线码标签都是 不是船,因为没有公共文物可以建造它们。 没有第三方测试过这个包裹 对参照执行没有差别 合规说明 说什么代表两个 知识分子 是完整的非重叠信任列表.

文档

完整参考文献 docs.cosyte.com/ncpdp 页面存档备份,存于互联网档案馆,从此构建 存储器 docs-content/从这些页面开始:

  • 快速启动:读取 SCRIPT NewRx 和 Telecom B1 要求结束, 并看看抛出什么,什么只是警告.
  • 开个账单,读一下答案数字 : 建立Telecom债权并读取已付款和被拒绝答案的教程.
  • 诊断代码每一个致命的,警告,和 以读者或建筑者的行为构建代码.
  • 遵约声明:每条线格式解码, 在收养结束时,由通过收养的公共部门和经过检验的公共部门进行收养.
  • 解决问题:当一个解剖投出时,怎么办, 字段读取未定义,或拒绝放出,以及已知的限制.
  • 已知的限制:完整的"不逾越信任清单".

支助

虫子报告到 问题跟踪器由人工合成而成 仅限数据。 问题和想法 讨论情况, (中文(简体) ), 它覆盖每个科西特仓库。 该组织 支持页面 列出两者.

需要建立国家CPDP集成,还是为您主办和运行? 看我们的 融合服务。 。 。 .

警卫

通过这个存储库私下报告脆弱性 私人脆弱性报告 或通过电子邮件发送给 安全性@ cosyte.com作为 安全政策 描述。 从不报告 而不包含真正的病人数据.

PHI 与安全

药房交易带有PHI, 而这个图书馆是建立在你的假设.

伐木. 图书馆没有记录 没有 console 调用库代码, 以及它自己的 诊断可以完整记录: 警告或错误消息来自一个被冻结的登记册, 由 代码,而制造一个的工厂 采取一个位置 没有别的,所以没有 一个文档可以到达的插入站点。 一个警告 message 与登记册的字节相同 条目 code并且测试表明 位置是 SCRIPT 的 XPath 和一个字节 乘以 Telecom 的双字符字段代号,其部件仅取自此库的名称 认得,从来没有从一个发送者选择的名字.

续收. 没有任何保留。 剖析是交给它的字节的纯函数. 有一个 没有缓存, 没有模块级别状态, 也没有历史; 返回被冻结的模型是唯一的东西 超过呼叫.

写入磁盘 . 无所为而取取. 库打开没有文件也没有 任何时间的套接字, 代码列表它被捆绑的快照编入包中 而不是运行时间下载.

解析模型无法安全日志 . 域值、药品编码、说明和识别特征 你问的就是这个 为. 保证的是 图书馆自己的结构识别器 保持界限,所以 下游包件建筑诊断不能被传送出无约束的线条字节: segment.segmentId 总是两个字符 或空的,但交易是, field.id 最多为2个,一个未建模的 SCRIPT 交易只从一个已关闭的词汇中命名.

昂贵的应用程序仍然拥有什么. 呼叫之外的一切:运输和 加密、认证、访问控制和审计、保留和处置、去除识别 分析前, 和它自己的伐木。 如果您登录了解析模型, 您已经登录了 PHI 。 斯德哥尔摩 装入器拒绝任何带有 <!DOCTYPE> 或者说 <!ENTITY> 声明和解决否 因此,没有外部实体或亿分百的载体,但是没有解析器可以使 未信任的文档可存储 .

捐款

外拉请求. 寄存器是公用和麻省理工学院许可的,它需要拉取请求 条件与任何其他变化相同。 该组织 贡献指南 财务报告和审定财务报表 行为守则 此处适用 本节补充了该寄存器的具体内容.

在合并之前,必须澄清什么是贡献. 一个拉动请求必须绿色满足要求 状态检查 main地方:

pnpm lint && pnpm typecheck && pnpm test && pnpm run check && pnpm run build

林特运行于 --max-warnings=0 每个目录的覆盖率为90%。 检查两道门 文本及代码: 任何履带文件或拉取请求标题、正文中无 em 或 en switch 或输入信件,在已公布的表面没有内部项目标识符。 改变 行为还需要一个变换器,一个重新命名稳定警告代码的变换器正在描述 一个突破性的变化.

许可证

MIT. 版权 (c) 2026 Cosyte LLC. 全文: 自由主义。 。 。 .

商标

@cosyte/ncpdp 是一个独立的开源项目。 Cosyte不附属于, 得到.., 或由本储存库或其文件所命名的任何公司担保。 标记显示为 内置配置的名称,因为配置无法记录交易伙伴公约 它可以容纳而不命名它们。 见 贸易。 。 。 .

版本与发布记录

@cosyte/ncpdp 共发布 20 个版本,首次发布于 2026/07/17;过去 12 个月发布了 20 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.6latest2026/11/10今天
0.1.52026/11/092 天前
0.1.42026/11/082 天前
0.1.32026/11/082 天前
0.1.22026/11/082 天前
0.1.12026/11/083 天前

关于 @cosyte/ncpdp 的常见问题

@cosyte/ncpdp 是什么?

NCPDP 解析器,序列器,以及Node.js和TypeScript的构建器:SCRIPT ePrepression and Telecom dromice claims, 宽大于解析, spec-clean on exmit.

如何安装 @cosyte/ncpdp?

在项目目录运行 npm install @cosyte/ncpdp,或使用 pnpm add / yarn add / bun add。

@cosyte/ncpdp 支持 TypeScript 吗?

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

@cosyte/ncpdp 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@cosyte/ncpdp 需要什么版本的 Node.js?

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

@cosyte/ncpdp 可以商用吗?

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

@cosyte/ncpdp 的下载量有多少?

根据 npm 官方下载统计,@cosyte/ncpdp 在 2026/10/11 – 2026/11/09 这 30 天内被下载 3,523 次,日均约 117 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cosyte/ncpdp 还在维护吗?

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