{"_id":"@calenderjs/event-dsl","_rev":"4-0c931e07fd1ba700453eb8cf3a7ddd4f","name":"@calenderjs/event-dsl","dist-tags":{"latest":"0.3.1"},"versions":{"0.0.1":{"name":"@calenderjs/event-dsl","version":"0.0.1","_id":"@calenderjs/event-dsl@0.0.1","maintainers":[{"name":"systembug","email":"albert_lee@hotmail.com"}],"dist":{"shasum":"1e57bc635192aa08a9e029fa6950b3aa053152a7","tarball":"https://registry.npmjs.org/@calenderjs/event-dsl/-/event-dsl-0.0.1.tgz","fileCount":26,"integrity":"sha512-beVI3wXioq68zLcAljLT0JUuU9rdDPNjBXmr08F8161Rn4BidRvo21K1SPSQ6YEc0rCv6KWHU+3EgWGcHiAGBw==","signatures":[{"sig":"MEUCIAinTPOhp/psGRp3Af83hYWrf9d9ohYAHpBIRIqQRrhgAiEAr5IVE1xQSaC0WbEDiqGGNYESqq1Ojy15ozqNotp2LTw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514778},"main":"./dist/index.cjs","type":"module","_from":"file:calenderjs-event-dsl-0.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"dev":"vite build --watch","lint":"eslint src","test":"vitest run","build":"pnpm build:parser && vite build","clean":"rm -rf dist coverage","typecheck":"tsc --noEmit","postinstall":"pnpm build:parser","build:parser":"peggy src/event-dsl.pegjs -o src/generated/parser.js --format es"},"_npmUser":{"name":"systembug","email":"albert_lee@hotmail.com"},"_resolved":"/private/var/folders/y8/p936_fp95g73q47fqdw8glkh0000gn/T/2f32a537fb7f1c1cb957af4f2418c37c/calenderjs-event-dsl-0.0.1.tgz","_integrity":"sha512-beVI3wXioq68zLcAljLT0JUuU9rdDPNjBXmr08F8161Rn4BidRvo21K1SPSQ6YEc0rCv6KWHU+3EgWGcHiAGBw==","_npmVersion":"11.6.2","description":"Event DSL - 领域特定语言用于定义事件类型和业务规则","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@calenderjs/core":"0.0.1","@calenderjs/event-model":"0.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","peggy":"^4.2.0","vitest":"^2.1.9","typescript":"^5.9.3","@types/node":"^20.19.27","vite-plugin-dts":"^4.5.4","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/event-dsl_0.0.1_1768786704228_0.2840680422830184","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@calenderjs/event-dsl","version":"0.0.2","_id":"@calenderjs/event-dsl@0.0.2","maintainers":[{"name":"systembug","email":"albert_lee@hotmail.com"}],"dist":{"shasum":"40ab95e7b3dc14d630018b49a24518126a0b5cf2","tarball":"https://registry.npmjs.org/@calenderjs/event-dsl/-/event-dsl-0.0.2.tgz","fileCount":26,"integrity":"sha512-rvdIz/duJseY11/yHWT8ObaxXU27TIxUMZpXconGHPW2LdIDbYUEwg2nMUedwVH8g7/amiS7CHyFI3rxy0A70Q==","signatures":[{"sig":"MEQCICLA9BzWfARa6TIVV9t421sPT4ojOaCGC5E+Ca7gtX+fAiAakjg5JqdAm5qHYuQ76B/frvxfnuhR/Kyy+fBDfCP+nQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514778},"main":"./dist/index.cjs","type":"module","_from":"file:calenderjs-event-dsl-0.0.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"dev":"vite build --watch","lint":"eslint src","test":"vitest run","build":"pnpm build:parser && vite build","clean":"rm -rf dist coverage","typecheck":"tsc --noEmit","postinstall":"pnpm build:parser","build:parser":"peggy src/event-dsl.pegjs -o src/generated/parser.js --format es"},"_npmUser":{"name":"systembug","email":"albert_lee@hotmail.com"},"_resolved":"/private/var/folders/y8/p936_fp95g73q47fqdw8glkh0000gn/T/a8f127e9c9e7e6e196f30612dc0e8c4c/calenderjs-event-dsl-0.0.2.tgz","_integrity":"sha512-rvdIz/duJseY11/yHWT8ObaxXU27TIxUMZpXconGHPW2LdIDbYUEwg2nMUedwVH8g7/amiS7CHyFI3rxy0A70Q==","_npmVersion":"11.6.2","description":"Event DSL - 领域特定语言用于定义事件类型和业务规则","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@calenderjs/core":"0.0.2","@calenderjs/event-model":"0.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","peggy":"^4.2.0","vitest":"^2.1.9","typescript":"^5.9.3","@types/node":"^20.19.27","vite-plugin-dts":"^4.5.4","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/event-dsl_0.0.2_1768800030261_0.6372143129251866","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@calenderjs/event-dsl","version":"0.3.0","_id":"@calenderjs/event-dsl@0.3.0","maintainers":[{"name":"systembug","email":"albert_lee@hotmail.com"}],"dist":{"shasum":"789b43c985a187359ccc78c133589ec15b8b8802","tarball":"https://registry.npmjs.org/@calenderjs/event-dsl/-/event-dsl-0.3.0.tgz","fileCount":26,"integrity":"sha512-znNeqvn0tdWymQA67FSF6DCC+scGqqq4WVuX6iszHFHDIbryniCVXqw/lzOxLwXHBzFMmDcAWKvMtDGHvdEnVw==","signatures":[{"sig":"MEUCIQD4SpXl2CiXhaVOQJ9B/nLDEWlwjmuHDQd5L5PIaygOngIgEkmh5MK+NtVAdZ10c4EfluPMK5i+FlTK05Yn5FNlOK4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":511981},"main":"./dist/index.cjs","type":"module","_from":"file:calenderjs-event-dsl-0.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"dev":"vite build --watch","lint":"eslint src","test":"vitest run","build":"pnpm build:parser && vite build","clean":"rm -rf dist coverage","typecheck":"tsc --noEmit","build:parser":"peggy src/event-dsl.pegjs -o src/generated/parser.js --format es"},"_npmUser":{"name":"systembug","email":"albert_lee@hotmail.com"},"_resolved":"/private/var/folders/y8/p936_fp95g73q47fqdw8glkh0000gn/T/fb0a1fe44ebaf33734fddd44f3a9df66/calenderjs-event-dsl-0.3.0.tgz","_integrity":"sha512-znNeqvn0tdWymQA67FSF6DCC+scGqqq4WVuX6iszHFHDIbryniCVXqw/lzOxLwXHBzFMmDcAWKvMtDGHvdEnVw==","_npmVersion":"11.6.2","description":"Event DSL - 领域特定语言用于定义事件类型和业务规则","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@calenderjs/core":"0.3.0","@calenderjs/event-model":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","peggy":"^4.2.0","vitest":"^2.1.9","typescript":"^5.9.3","@types/node":"^20.19.27","vite-plugin-dts":"^4.5.4","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/event-dsl_0.3.0_1786902960174_0.8792564461401513","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@calenderjs/event-dsl","version":"0.3.1","description":"Event DSL - 领域特定语言用于定义事件类型和业务规则","type":"module","main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"publishConfig":{"access":"public"},"dependencies":{"@calenderjs/core":"0.3.1","@calenderjs/event-model":"0.3.1"},"devDependencies":{"@types/node":"^20.19.27","@vitest/coverage-v8":"^2.1.9","peggy":"^4.2.0","typescript":"^5.9.3","vite":"^7.3.0","vite-plugin-dts":"^4.5.4","vitest":"^2.1.9"},"scripts":{"dev":"vite build --watch","build":"pnpm build:parser && vite build","build:parser":"peggy src/event-dsl.pegjs -o src/generated/parser.js --format es","test":"vitest run","lint":"eslint src","typecheck":"tsc --noEmit","clean":"rm -rf dist coverage"},"_id":"@calenderjs/event-dsl@0.3.1","_integrity":"sha512-D17kzXcGyd1NhtrA6QDKZq7ynjHhJoFdco6ABWPCzR915ajpIMb7oKGPxqMIyKLqnPX3KnYOOsIfuiTb892QZg==","_resolved":"/private/var/folders/y8/p936_fp95g73q47fqdw8glkh0000gn/T/55d87e2c796547a9521aca068f6d891d/calenderjs-event-dsl-0.3.1.tgz","_from":"file:calenderjs-event-dsl-0.3.1.tgz","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-D17kzXcGyd1NhtrA6QDKZq7ynjHhJoFdco6ABWPCzR915ajpIMb7oKGPxqMIyKLqnPX3KnYOOsIfuiTb892QZg==","shasum":"3f50e8a6612037515537ab4335fe7f8fd03394a6","tarball":"https://registry.npmjs.org/@calenderjs/event-dsl/-/event-dsl-0.3.1.tgz","fileCount":26,"unpackedSize":511981,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDEHawRBKR53KrKrnlhI3umk1nJQmhamM7fk5418kMRzAiEApPXu7PzA8vzHlPwHRwZNoG0Q3Upn1t2N6GwLFOH/1A4="}]},"_npmUser":{"name":"systembug","email":"albert_lee@hotmail.com"},"directories":{},"maintainers":[{"name":"systembug","email":"albert_lee@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/event-dsl_0.3.1_1786924556150_0.19590036209056283"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-19T01:38:24.124Z","modified":"2026-08-16T23:55:56.478Z","0.0.1":"2026-01-19T01:38:24.394Z","0.0.2":"2026-01-19T05:20:30.429Z","0.3.0":"2026-08-16T17:56:00.341Z","0.3.1":"2026-08-16T23:55:56.307Z"},"description":"Event DSL - 领域特定语言用于定义事件类型和业务规则","maintainers":[{"name":"systembug","email":"albert_lee@hotmail.com"}],"readme":"# @calenderjs/event-dsl\n\nEvent DSL - 领域特定语言，用于定义事件类型和业务规则。\n\n**架构说明**：\n\n- Event DSL 编译成 Data Model (Event 对象，包含规则和数据)\n- Event Data Model 是 SSOT，定义了 Event 接口结构（在 @calenderjs/event-model 中）\n- DSL 通过 EventDSLCompiler 编译成 Data Model (Event 对象，包含规则和数据)\n\n**包职责**：\n本包包含以下组件：\n\n1. **DSL 定义**（核心）：\n   - DSL 语法定义（`.pegjs` 文件）\n   - DSL 解析器（将文本解析为 AST）\n   - AST 类型定义（抽象语法树结构）\n\n2. **DSL 工具**（执行引擎）：\n   - **编译器**（`EventDSLCompiler`）：编译 DSL → Data Model (Event 对象，包含规则和数据)\n   - **运行时引擎**（`EventRuntime`）：使用编译后的 Data Model 进行验证、渲染和行为检查（**应用层使用**，在 `@calenderjs/event-runtime` 包中）\n\n**验证架构**：\n\n1. **编译时验证**（EventDSLCompiler，在 `@calenderjs/event-dsl` 包中）：\n   - 验证 DSL 语法是否正确\n   - 如果编译失败，返回错误\n   - 生成验证器函数（基于字段定义，如 `required`、`min`、`max`）\n\n2. **JSON Schema 验证**（EventValidator，在 `@calenderjs/event-model` 包中）：\n   - 验证 Event 对象是否符合 Event 接口结构\n   - 验证 Event.extra 是否符合 JSON Schema（结构验证）\n   - 无法验证业务规则（如 `attendees.count between 1 and 50` 需要计算数组长度）\n\n3. **运行时验证**（EventRuntime，在 `@calenderjs/event-runtime` 包中）：\n   - 执行 DSL 中定义的业务规则（如 `attendees.count between 1 and 50`）\n   - 验证的是 Event 数据模型的数据（`@calenderjs/event-model` 中的 Event 对象）\n   - 需要运行时数据（event.extra.attendees.length）\n   - 需要上下文信息（context.events, context.now, context.user）\n   - 无法在编译时验证（数据是动态的）\n   - 无法通过 JSON Schema 验证（JSON Schema 只能验证结构，不能验证业务逻辑）\n\n**重要**：\n\n- 运行时**不在**数据模型包中（`@calenderjs/event-model`）\n- 运行时在 DSL 包中（`@calenderjs/event-dsl`）\n- 但运行时验证的是 Event 数据模型的数据\n\n**重要说明**：\n\n- **DSL 的主要用途**：编译成 Data Model (Event 对象，包含规则和数据)\n- **Calendar 组件**：直接使用 Event 对象（event.color, event.icon, event.title），**不需要运行时**\n- **运行时的用途**（应用层）：\n  1. **业务规则验证**：执行 DSL 中定义的业务规则（如 `attendees.count between 1 and 50`、`no conflict with other events`）\n  2. **权限检查**：检查用户是否可以执行某个操作（draggable, editable, deletable）\n  3. **动态渲染**（可选）：根据 DSL 规则动态生成显示属性（但 Event 已有 color/icon）\n\n**数据流程**：\n\n```\nDSL 文本\n  → Peggy 解析器\n  → AST\n  → EventDSLCompiler\n  → Data Model (Event 对象，包含规则和数据)\n  → Calendar 组件（直接使用）\n\n验证流程：\n1. 编译时验证（EventDSLCompiler）：验证 DSL 语法，编译成 Data Model\n2. JSON Schema 验证（EventValidator）：使用 Data Model 中的标准 JSON Schema 验证 Event 结构\n3. 运行时验证（EventRuntime）：使用 Data Model 中的业务规则验证业务逻辑（应用层使用，在 `@calenderjs/event-runtime` 包中）\n```\n\n## 安装\n\n```bash\npnpm add @calenderjs/event-dsl\n```\n\n## 快速开始\n\n### 1. 定义事件类型\n\n```typescript\nimport { EventTypeDefinition } from \"@calenderjs/event-dsl\";\n\nconst meetingType: EventTypeDefinition = {\n  id: \"meeting\",\n  name: \"会议\",\n  fields: [\n    {\n      name: \"title\",\n      type: \"string\",\n      required: true,\n      validation: [\n        { type: \"minLength\", value: 1, errorMessage: \"标题不能为空\" },\n      ],\n    },\n    {\n      name: \"attendees\",\n      type: \"array\",\n      items: { type: \"string\" },\n    },\n  ],\n  display: {\n    color: \"#4285f4\",\n    titleTemplate: \"${title}\",\n    descriptionTemplate: \"${attendees.length} 人\",\n  },\n  behavior: {\n    draggable: true,\n    minDuration: 15,\n    timeConstraints: [\n      {\n        type: \"workingHours\",\n        value: { start: \"09:00\", end: \"18:00\" },\n        errorMessage: \"会议只能在工作时间内安排\",\n      },\n    ],\n  },\n};\n```\n\n### 2. 编译 DSL\n\n```typescript\nimport { EventDSLCompiler } from \"@calenderjs/event-dsl\";\n\nconst dsl: EventDSL = {\n  types: [meetingType],\n};\n\nconst compiler = new EventDSLCompiler();\nconst compiled = compiler.compile(dsl);\n```\n\n### 3. 使用编译后的 Data Model\n\n```typescript\nimport type { Event } from \"@calenderjs/event-model\";\n\n// Data Model 是 Event 对象，包含规则和数据\n// compiled.types[0] 是 CompiledType (Data Model)\nconst dataModel = compiled.types[0];\n\n// Data Model 包含：\n// - extraSchema: JSON Schema (用于验证 Event.extra 结构)\n// - validationRules: 业务规则 (用于验证业务逻辑)\n// - validator, renderer, behavior 等\n```\n\n### 4. 验证 Event 对象\n\n```typescript\nimport { EventValidator } from \"@calenderjs/event-model\";\nimport { EventRuntime } from \"@calenderjs/event-runtime\";\nimport { EventDSLCompiler } from \"@calenderjs/event-dsl\";\n\n// 使用 Event Data Model 验证器验证基础结构\nconst eventValidator = new EventValidator();\nconst baseValidation = eventValidator.validateBase(event);\n\n// 使用运行时验证业务规则\nconst compiler = new EventDSLCompiler();\nconst dataModel = compiler.compileFromAST([ast]);\nconst runtime = new EventRuntime(dataModel.types[0]);\nconst runtimeValidation = runtime.validate(event, context);\n```\n\n## API\n\n### EventDSLCompiler\n\n编译 DSL 定义，生成可执行的验证器和渲染器。\n\n### EventRuntime\n\n运行时系统，使用编译后的 Data Model 进行验证、渲染和行为配置查询。\n\n## 更多示例\n\n查看 `docs/examples/appointment-dsl-examples.ts` 获取更多示例。\n","readmeFilename":"README.md"}