@abapify/adt-schemas (中文(简体) )
类型安全 SAP APT 计划 从官方 XSD 定义中生成 共享类型 财务报告和审定财务报表 最佳树摇摆。 。 。 .
概览
此套件为 SAP APT( ABAP 开发工具) REST API 提供了 TypeScript schemas , 自动生成自 SAP 的官方 XSD schema 定义使用 @ abapify/ts-xsd (英语)。 。 。 .
关键特性
- 204+ 类型脚本接口 - 预先生成的,没有运行时间推论间接费用
- 共有类型 - 说吧
AdtObject, (中文(简体) ),LinkType等定义一次 - 最佳捆绑 - 树能震动,只进口你需要的东西
- 全类型安全 - XML 解析/构建的编译时间验证
- 光谱融合 - 直接与REST合同定义有关
建筑要点
XSD Files (SAP Official)
↓ ts-xsd codegen
Schema Literals (as const)
↓ interface generator
TypeScript Interfaces (204 types)
↓ typed() wrapper
Typed Schemas (parse/build)
单一真相来源:所有类型定义都从XSD → TypeScript中流出,取消了手动类型维护.
安装
npm install @abapify/adt-schemas
# or
bun add @abapify/adt-schemas
快速启动
解析 ADT XML
import { classes, type AbapClass } from '@abapify/adt-schemas';
// Parse XML to typed object
const xml = await fetch('/sap/bc/adt/oo/classes/zcl_my_class').then((r) =>
r.text(),
);
const data = classes.parse(xml);
// Full type safety - TypeScript knows all properties
console.log(data.name); // string
console.log(data.category); // 'generalObjectType' | 'exceptionClass' | ...
console.log(data.include?.[0]); // AbapClassInclude | undefined
构建 ATT XML
import { classes } from '@abapify/adt-schemas';
const xml = classes.build({
name: 'ZCL_MY_CLASS',
type: 'CLAS/OC',
category: 'generalObjectType',
final: false,
abstract: false,
});
与 speci 合同一起使用
import { classes, configurations } from '@abapify/adt-schemas';
import { http } from 'speci/rest';
const adtContracts = {
getClass: (name: string) =>
http.get(`/sap/bc/adt/oo/classes/${name}`, {
responses: { 200: classes },
}),
getConfigurations: () =>
http.get(
'/sap/bc/adt/cts/transportrequests/searchconfiguration/configurations',
{
responses: { 200: configurations },
},
),
};
可用的外观
核心项目
| 司马 | 类型 | 说明 |
|---|---|---|
adtcore | AdtObject | 核心 ADT 对象类型 |
atom | LinkType | 原子种子格式(链接,类别) |
abapsource | AbapSourceObject | ABAP 源代码结构 |
abapoo | AbapOoObject | ABAP OO 基准类型 |
仓库对象
| 司马 | 类型 | 说明 |
|---|---|---|
classes | AbapClass | ABAP 类元数据 |
interfaces | AbapInterface | ABAP 接口元数据 |
packagesV1 | Package | 软件包/元数据 |
运输管理
| 司马 | 类型 | 说明 |
|---|---|---|
transportfind | Abap | 运输搜索(ABAP XML 格式) |
transportmanagmentCreate | RootType | 创造交通运输 |
configurations | Configurations | 搜索配置 |
configuration | Configuration | 单一配置 |
ATC (ABAP 测试舱)
| 司马 | 类型 | 说明 |
|---|---|---|
atc | AtcWorklist | ATC 主计划 |
atcworklist | AtcWorklist | ATC 工作清单 |
atcresult | AtcWorklist | ATC结果 |
checklist | CheckMessageList | 检查信件列表 |
quickfixes | AtcQuickfixes | ATC 快补 |
调试追踪( R)
| 司马 | 类型 | 说明 |
|---|---|---|
logpoint | AdtLogpoint | 逻辑点定义 |
traces | Traces | 追踪数据 |
模板
| 司马 | 类型 | 说明 |
|---|---|---|
templatelink | LinkType | 模板链接 |
templatelinkExtended | TemplateLinksType | 扩展模板链接 |
类型系统
预生成接口
所有类型都是作为 TypeScript 接口预生成的,避免运行时间推导间接:
// Import types directly
import type {
AbapClass,
AbapInterface,
AdtObject,
AdtObjectReference,
LinkType,
} from '@abapify/adt-schemas';
// Use in your code
function processClass(cls: AbapClass) {
console.log(cls.name);
console.log(cls.superClassRef?.name);
cls.include?.forEach((inc) => console.log(inc.includeType));
}
共享类型
类型在各种计划之间共享- AdtObject 定义一次并重新使用:
// All these extend AdtObject
interface AbapSourceObject extends AdtObject { ... }
interface AbapOoObject extends AbapSourceMainObject { ... }
interface AbapClass extends AbapOoObject { ... }
interface AbapInterface extends AbapOoObject { ... }
类型等级
AdtObject
├── AdtMainObject
│ └── AbapSourceMainObject
│ └── AbapOoObject
│ ├── AbapClass
│ └── AbapInterface
└── AbapSourceObject
└── AbapClassInclude
Schema 结构
每个计划都是符合W3C的XSD代表,并附有相关的进口:
// Generated schema literal (classes.ts)
export default {
$xmlns: {
adtcore: "http://www.sap.com/adt/core",
abapoo: "http://www.sap.com/adt/oo",
class: "http://www.sap.com/adt/oo/classes",
},
$imports: [adtcore, abapoo, abapsource], // Linked schemas
targetNamespace: "http://www.sap.com/adt/oo/classes",
element: [
{ name: "abapClass", type: "class:AbapClass" },
],
complexType: [
{
name: "AbapClass",
complexContent: {
extension: {
base: "abapoo:AbapOoObject", // Type inheritance
sequence: { element: [...] },
attribute: [...],
}
}
}
],
} as const;
跨计划类型分辨率
这个 $imports 数组允许交叉schema类型分辨率 :
// classes schema imports adtcore, abapoo, abapsource
// Type "adtcore:AdtObjectReference" resolves to AdtObjectReference interface
// Type "abapoo:AbapOoObject" resolves to AbapOoObject interface
建筑
@abapify/adt-schemas
├── src/
│ ├── index.ts # Main exports
│ ├── speci.ts # typed() wrapper factory
│ └── schemas/
│ ├── index.ts # Re-exports from generated
│ └── generated/
│ ├── index.ts # Typed schema exports
│ ├── schemas/
│ │ ├── sap/ # SAP official schemas (23 files)
│ │ └── custom/ # Custom schemas (9 files)
│ └── types/
│ └── index.ts # 204 TypeScript interfaces
生成管道
1. Download XSD → .xsd/model/*.xsd
2. Parse XSD → Schema objects (ts-xsd)
3. Generate Literal → schemas/sap/*.ts (as const)
4. Generate Types → types/index.ts (interfaces)
5. Wrap with typed()→ index.ts (parse/build methods)
自定义 Schemas( ABAP XML 格式)
一些SAP端点返回ABAP XML格式(asx:abap 信封),没有官方XSD. 创建手动计划 src/schemas/generated/schemas/custom/数字 :
// schemas/custom/transportfind.ts
export default {
$xmlns: { asx: 'http://www.sap.com/abapxml' },
targetNamespace: 'http://www.sap.com/abapxml',
element: [{ name: 'abap', type: 'Abap' }],
complexType: [
{
name: 'Abap',
sequence: {
element: [{ name: 'values', type: 'Values' }],
},
attribute: [{ name: 'version', type: 'xs:string' }],
},
],
// ... more types
} as const; // CRITICAL: 'as const' required!
关键点
as const- 需要进行类型推断- 无前缀的元素名称 - 使用( I)
'abap'没有'asx:abap' - 添加到已键入的索引 - 登记在
generated/index.ts
发展
重生Schemas 系统
# Full regeneration pipeline
npx nx run adt-schemas:generate
# Individual steps
npx nx run adt-schemas:download # Download XSD files
npx nx run adt-schemas:codegen # Generate schema literals
npx nx run adt-schemas:types # Generate TypeScript interfaces
添加新外观
- 将 XSD 添加到
.xsd/model/sap/或创建自定义方案 - 更新生成配置
- 运行
npx nx run adt-schemas:generate - 添加打入的包装
generated/index.ts - 添加测试方案 (强制性)
测试
# Run all tests
npx nx test adt-schemas
# Run specific test
npx vitest run tests/scenarios.test.ts
每个计划 必须 有真实的SAP XML固定装置的测试方案.
光谱集成
执行 Serializable 用于无缝光谱集成的接口 :
interface Serializable<T> {
parse(raw: string): T;
build?(data: T): string;
}
这使得REST合同能够自动进行类型推断:
import { classes } from '@abapify/adt-schemas';
const contract = http.get('/sap/bc/adt/oo/classes/zcl_test', {
responses: { 200: classes },
});
// Response type is automatically inferred as AbapClass
const response = await client.execute(contract);
console.log(response.data.name); // TypeScript knows this is string
相关软件包
- @ abapify/ts-xsd (英语) - 核心 XSD 解析器和类型推论
- 光谱 - REST合同图书馆
许可证
麻省理工学院