Functional Weave
Code in Rust

logistics.sscc@1.1.0

impl/typescript.ts

1,501 bytes · the TypeScript implementation · view raw

Imports name this capability’s declared dependencies, which fune builds next to it in your project; each one links to its page.

import { gs1CheckDigit } from "./validation_gs1_check_digit.ts";  ← from validation.gs1-check-digit ^1.0.0 · built alongside by fune

/**
 * Build an 18-digit SSCC: extension digit, GS1 company prefix, zero-padded
 * serial reference and GS1 mod-10 check digit.
 */
export function buildSscc(extensionDigit: number, companyPrefix: string, serialReference: number): string {
  if (!Number.isInteger(extensionDigit) || extensionDigit < 0 || extensionDigit > 9) {
    throw new RangeError(`extensionDigit must be 0 to 9, received ${extensionDigit}`);
  }
  if (typeof companyPrefix !== "string" || !/^[0-9]{4,12}$/.test(companyPrefix)) {
    throw new RangeError(`companyPrefix must be 4 to 12 digits, received "${companyPrefix}"`);
  }
  if (!Number.isInteger(serialReference)) {
    throw new TypeError(`serialReference must be an integer, received ${serialReference}`);
  }
  if (serialReference < 0) {
    throw new RangeError(`serialReference must not be negative, received ${serialReference}`);
  }
  // Prefix and serial share 16 digits, so a longer prefix leaves less room.
  // Too large is an error: truncating would reuse another unit's number.
  const room = 16 - companyPrefix.length;
  const serial = String(serialReference);
  if (serial.length > room) {
    throw new RangeError(
      `serialReference must fit in ${room} digits after a ${companyPrefix.length}-digit company prefix, received ${serialReference}`,
    );
  }
  const data = String(extensionDigit) + companyPrefix + serial.padStart(room, "0");
  return data + String(gs1CheckDigit(data));
}