
Security News
require(esm) Backported to Node.js 20, Paving the Way for ESM-Only Packages
require(esm) backported to Node.js 20, easing the transition to ESM-only packages and reducing complexity for developers as Node 18 nears end-of-life.
ASC X12 parser, generator, query engine, and mapper; now with support for streams.
An ASC X12 parser, generator, query engine, and mapper written for NodeJS. Parsing supports reading from streams to conserve resources in memory-intensive operations.
Install it from the npm repository:
npm install --save node-x12
Then require it in your project:
const { X12Parser } = require('node-x12')
The TypeScript code is compiled to JavaScript and distributed via NPM. If you wish to use the TypeScript code directly you can download the zip and unpack it locally.
Then import it in your project:
import { X12Parser } from './node-x12/core.ts'
Contributions by TrueCommerce up to April 2016:
Enhancements original to this fork:
See the API for more information.
Version 2.x series is being actively developed. Minor versions should not cause breaking changes, but major releases will break.
The next major version has lots of things planned in order to more completely describe ASC X12 and perform more of the heavy lifting in terms of parsing and handling X12 EDI documents. To view and track all issues in the 2.x series: milestone 'Version 2.0.0'
The query language makes it possible to directly select values from the class object model. See Query Language for more information.
Example 1: Select REF02
Elements
REF02
Example 2: Select REF02
Elements With a PO
Qualifier in REF01
REF02:REF01["PO"]
Example 3: Select Line-Level PO Numbers (850)
PO1-REF02:REF01["PO"]
Example 4: Select ASN Line Quantities
HL+S+O+P+I-LIN-SN102
Example 5: Select values from a loop series
FOREACH(LX)=>MAN02:MAN01["CP"]
Some vendors will concatenate multiple valid EDI documents into a single request or file. This DOES NOT CONFORM to the ASC X12 spec, but it does happen. Implementing support for this scenario was trivial. When parsing an EDI document, it will be handled one of two ways:
X12FatInterchange
object with property interchanges
, an array of X12Interchange
objectsIn the latter of the two scenarios, the parser will set the header and trailer to the last available ISA and IEA segments. The element data of the discarded ISA and IEA segments will be lost if the original fat EDI document is not preserved. If all the header and trailer information is important to your organization, we recommend setting the parser to strict so that you get all the data into an object, or else go back to your implementer and request that they fix their EDI.
Implementers of ASC X12 are not guaranteed to conform completely to spec. There are scenarios that this library WILL NOT be able to handle and WILL NEVER be added. Despite the addition of functionality beyond the base parser from the original libray, the goal of this library is to remain a simple implementation of the spec. Some examples of scenarios this library won't handle:
Such issues should be resolved between a user of this library and the implementer of ASC X12 documents they are working with.
Additional documentation can be found self-hosted within the repository.
const { X12Generator, X12Parser, X12TransactionMap } = require('node-x12')
// Parse valid ASC X12 EDI into an object.
const parser = new X12Parser(true)
let interchange = parser.parse('...raw X12 data...')
// Parse a stream of valid ASC X12 EDI
const ediStream = fs.createReadStream('someFile.edi')
const segments = []
ediStream
.pipe(parser)
.on('data', data => {
segments.push(data)
})
.on('end', () => {
interchange = parser.getInterchangeFromSegments(segments)
})
// Generate valid ASC X12 EDI from an object.
const jsen = {
options: {
elementDelimiter: '*',
segmentTerminator: '\n'
},
header: [
'00',
'',
'00',
'',
'ZZ',
'10000000',
'01',
'100000000',
'100000',
'0425',
'|',
'00403',
'100748195',
'0',
'P',
'>'
],
functionalGroups: [...etc]
}
const generator = new X12Generator(jsen)
// Query X12 like an object model
const engine = new X12QueryEngine()
const results = engine.query(interchange, 'REF02:REF01["IA"]')
results.forEach(result => {
// Do something with each result.
// result.interchange
// result.functionalGroup
// result.transaction
// result.segment
// result.element
// result.value OR result.values
})
// Map transaction sets to javascript objects
const map = {
status: 'W0601',
poNumber: 'W0602',
poDate: 'W0603',
shipto_name: 'N102:N101["ST"]',
shipto_address: 'N1-N301:N101["ST"]',
shipto_city: 'N1-N401:N101["ST"]',
shipto_state: 'N1-N402:N101["ST"]',
shipto_zip: 'N1-N403:N101["ST"]'
}
interchange.functionalGroups.forEach(group => {
group.transactions.forEach(transaction => {
console.log(transaction.toObject(map))
})
})
Created originally for the TC Toolbox project by TrueCommerce; the public repository for TC Toolbox has been taken offline. The original, parser-only library may be found at TrueCommerce/node-x12, which is still public at this time but no longer maintained. Without the good work done by TrueCommerce up until 2016, this library would not exist.
Thanks to @DotJoshJohnson.
FAQs
ASC X12 parser, generator, query engine, and mapper; now with support for streams.
We found that node-x12 demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
require(esm) backported to Node.js 20, easing the transition to ESM-only packages and reducing complexity for developers as Node 18 nears end-of-life.
Security News
PyPI now supports iOS and Android wheels, making it easier for Python developers to distribute mobile packages.
Security News
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.