@blockml/parser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/blocks/org/blockml/bml/compiler/parser/Library.bml +143 -0
  2. package/blocks/org/blockml/bml/compiler/parser/ParserType.bml +40 -0
  3. package/blocks/org/blockml/bml/compiler/parser/README.bml +68 -0
  4. package/blocks/org/blockml/bml/compiler/parser/capability/AssertBlockRoot.bml +45 -0
  5. package/blocks/org/blockml/bml/compiler/parser/capability/BuildSubBlockIndex.bml +43 -0
  6. package/blocks/org/blockml/bml/compiler/parser/capability/CollectLeadingComments.bml +50 -0
  7. package/blocks/org/blockml/bml/compiler/parser/capability/CollectTrailingComments.bml +50 -0
  8. package/blocks/org/blockml/bml/compiler/parser/capability/CreateMapContext.bml +56 -0
  9. package/blocks/org/blockml/bml/compiler/parser/capability/DetectFormat.bml +47 -0
  10. package/blocks/org/blockml/bml/compiler/parser/capability/DocumentElement.bml +43 -0
  11. package/blocks/org/blockml/bml/compiler/parser/capability/ElementChildren.bml +43 -0
  12. package/blocks/org/blockml/bml/compiler/parser/capability/ElementLocalName.bml +43 -0
  13. package/blocks/org/blockml/bml/compiler/parser/capability/ElementPrefix.bml +43 -0
  14. package/blocks/org/blockml/bml/compiler/parser/capability/ElementSourceLoc.bml +46 -0
  15. package/blocks/org/blockml/bml/compiler/parser/capability/ExpressionFromRaw.bml +46 -0
  16. package/blocks/org/blockml/bml/compiler/parser/capability/ExtractNamespaceBindings.bml +47 -0
  17. package/blocks/org/blockml/bml/compiler/parser/capability/FqnToQName.bml +46 -0
  18. package/blocks/org/blockml/bml/compiler/parser/capability/GetAttribute.bml +46 -0
  19. package/blocks/org/blockml/bml/compiler/parser/capability/GetCharacterData.bml +43 -0
  20. package/blocks/org/blockml/bml/compiler/parser/capability/GetParseErrors.bml +43 -0
  21. package/blocks/org/blockml/bml/compiler/parser/capability/HasBmlSemanticQNameBindings.bml +43 -0
  22. package/blocks/org/blockml/bml/compiler/parser/capability/InferCardinality.bml +43 -0
  23. package/blocks/org/blockml/bml/compiler/parser/capability/IsBooleanLiteral.bml +43 -0
  24. package/blocks/org/blockml/bml/compiler/parser/capability/IsCData.bml +43 -0
  25. package/blocks/org/blockml/bml/compiler/parser/capability/IsComment.bml +43 -0
  26. package/blocks/org/blockml/bml/compiler/parser/capability/IsElement.bml +43 -0
  27. package/blocks/org/blockml/bml/compiler/parser/capability/IsTextNode.bml +43 -0
  28. package/blocks/org/blockml/bml/compiler/parser/capability/IsTypeReferenceEntitySugar.bml +43 -0
  29. package/blocks/org/blockml/bml/compiler/parser/capability/MapBlock.bml +50 -0
  30. package/blocks/org/blockml/bml/compiler/parser/capability/MapBlockInstanceNode.bml +46 -0
  31. package/blocks/org/blockml/bml/compiler/parser/capability/MapCompositionTemplate.bml +46 -0
  32. package/blocks/org/blockml/bml/compiler/parser/capability/MapDocumentBlock.bml +54 -0
  33. package/blocks/org/blockml/bml/compiler/parser/capability/MapTypeReferenceEntityInstance.bml +46 -0
  34. package/blocks/org/blockml/bml/compiler/parser/capability/MergeSourceInfo.bml +49 -0
  35. package/blocks/org/blockml/bml/compiler/parser/capability/NormalizeBooleanValue.bml +43 -0
  36. package/blocks/org/blockml/bml/compiler/parser/capability/Parse.bml +52 -0
  37. package/blocks/org/blockml/bml/compiler/parser/capability/ParseBmlMeta.bml +43 -0
  38. package/blocks/org/blockml/bml/compiler/parser/capability/ParseBooleanAttribute.bml +43 -0
  39. package/blocks/org/blockml/bml/compiler/parser/capability/ParseDirectives.bml +50 -0
  40. package/blocks/org/blockml/bml/compiler/parser/capability/ParseMemberValue.bml +50 -0
  41. package/blocks/org/blockml/bml/compiler/parser/capability/ParseTypeExpression.bml +53 -0
  42. package/blocks/org/blockml/bml/compiler/parser/capability/ParseVisibilityFromName.bml +47 -0
  43. package/blocks/org/blockml/bml/compiler/parser/capability/ParseXmlDom.bml +47 -0
  44. package/blocks/org/blockml/bml/compiler/parser/capability/ResolveBlockReference.bml +53 -0
  45. package/blocks/org/blockml/bml/compiler/parser/capability/ResolvePrefix.bml +46 -0
  46. package/blocks/org/blockml/bml/compiler/parser/capability/ResolveTypeName.bml +53 -0
  47. package/blocks/org/blockml/bml/compiler/parser/capability/SourceLoc.bml +49 -0
  48. package/blocks/org/blockml/bml/compiler/parser/capability/SplitQName.bml +43 -0
  49. package/blocks/org/blockml/bml/compiler/parser/capability/TrimText.bml +43 -0
  50. package/blocks/org/blockml/bml/compiler/parser/capability/TypeExpressionToString.bml +43 -0
  51. package/blocks/org/blockml/bml/compiler/parser/capability/VisibilityPrefix.bml +43 -0
  52. package/blocks/org/blockml/bml/compiler/parser/capability/XmlTriviaFromElement.bml +47 -0
  53. package/blocks/org/blockml/bml/compiler/parser/config/MapTimeDiagnosticCodes.bml +40 -0
  54. package/blocks/org/blockml/bml/compiler/parser/config/ParserConstants.bml +49 -0
  55. package/blocks/org/blockml/bml/compiler/parser/documentation/ArchitectureOverview.bml +61 -0
  56. package/blocks/org/blockml/bml/compiler/parser/documentation/AttributeClassification.bml +56 -0
  57. package/blocks/org/blockml/bml/compiler/parser/documentation/BlockMetadataMapping.bml +51 -0
  58. package/blocks/org/blockml/bml/compiler/parser/documentation/DesignDecisions.bml +53 -0
  59. package/blocks/org/blockml/bml/compiler/parser/documentation/Diagnostics.bml +52 -0
  60. package/blocks/org/blockml/bml/compiler/parser/documentation/ExpressionCapture.bml +46 -0
  61. package/blocks/org/blockml/bml/compiler/parser/documentation/Introduction.bml +52 -0
  62. package/blocks/org/blockml/bml/compiler/parser/documentation/LayerSeparation.bml +55 -0
  63. package/blocks/org/blockml/bml/compiler/parser/documentation/MappingPrinciples.bml +48 -0
  64. package/blocks/org/blockml/bml/compiler/parser/documentation/MemberMapping.bml +48 -0
  65. package/blocks/org/blockml/bml/compiler/parser/documentation/MemberMappingOrder.bml +46 -0
  66. package/blocks/org/blockml/bml/compiler/parser/documentation/PackageOwnership.bml +50 -0
  67. package/blocks/org/blockml/bml/compiler/parser/documentation/PublicApi.bml +58 -0
  68. package/blocks/org/blockml/bml/compiler/parser/documentation/RoundtripContract.bml +50 -0
  69. package/blocks/org/blockml/bml/compiler/parser/documentation/ScopeExclusions.bml +49 -0
  70. package/blocks/org/blockml/bml/compiler/parser/documentation/SingleFileScope.bml +47 -0
  71. package/blocks/org/blockml/bml/compiler/parser/documentation/TypeDescriptorParsing.bml +47 -0
  72. package/blocks/org/blockml/bml/compiler/parser/documentation/V1Scope.bml +48 -0
  73. package/blocks/org/blockml/bml/compiler/parser/documentation/XmlCommentsParse.bml +48 -0
  74. package/blocks/org/blockml/bml/compiler/parser/map/MapContext.bml +58 -0
  75. package/dist/index.d.ts +2 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +2 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/map/context.d.ts +16 -0
  80. package/dist/map/context.d.ts.map +1 -0
  81. package/dist/map/context.js +15 -0
  82. package/dist/map/context.js.map +1 -0
  83. package/dist/map/directives.d.ts +23 -0
  84. package/dist/map/directives.d.ts.map +1 -0
  85. package/dist/map/directives.js +89 -0
  86. package/dist/map/directives.js.map +1 -0
  87. package/dist/map/map-block.d.ts +6 -0
  88. package/dist/map/map-block.d.ts.map +1 -0
  89. package/dist/map/map-block.js +792 -0
  90. package/dist/map/map-block.js.map +1 -0
  91. package/dist/map/map-composition.d.ts +23 -0
  92. package/dist/map/map-composition.d.ts.map +1 -0
  93. package/dist/map/map-composition.js +241 -0
  94. package/dist/map/map-composition.js.map +1 -0
  95. package/dist/map/member-value.d.ts +4 -0
  96. package/dist/map/member-value.d.ts.map +1 -0
  97. package/dist/map/member-value.js +69 -0
  98. package/dist/map/member-value.js.map +1 -0
  99. package/dist/map/type-expression.d.ts +6 -0
  100. package/dist/map/type-expression.d.ts.map +1 -0
  101. package/dist/map/type-expression.js +266 -0
  102. package/dist/map/type-expression.js.map +1 -0
  103. package/dist/parse.d.ts +3 -0
  104. package/dist/parse.d.ts.map +1 -0
  105. package/dist/parse.js +80 -0
  106. package/dist/parse.js.map +1 -0
  107. package/dist/pipeline/format-detect.d.ts +2 -0
  108. package/dist/pipeline/format-detect.d.ts.map +1 -0
  109. package/dist/pipeline/format-detect.js +8 -0
  110. package/dist/pipeline/format-detect.js.map +1 -0
  111. package/dist/pipeline/namespaces.d.ts +7 -0
  112. package/dist/pipeline/namespaces.d.ts.map +1 -0
  113. package/dist/pipeline/namespaces.js +45 -0
  114. package/dist/pipeline/namespaces.js.map +1 -0
  115. package/dist/pipeline/root-type.d.ts +3 -0
  116. package/dist/pipeline/root-type.d.ts.map +1 -0
  117. package/dist/pipeline/root-type.js +8 -0
  118. package/dist/pipeline/root-type.js.map +1 -0
  119. package/dist/pipeline/xml-dom.d.ts +5 -0
  120. package/dist/pipeline/xml-dom.d.ts.map +1 -0
  121. package/dist/pipeline/xml-dom.js +20 -0
  122. package/dist/pipeline/xml-dom.js.map +1 -0
  123. package/dist/util/boolean.d.ts +4 -0
  124. package/dist/util/boolean.d.ts.map +1 -0
  125. package/dist/util/boolean.js +18 -0
  126. package/dist/util/boolean.js.map +1 -0
  127. package/dist/util/qname.d.ts +17 -0
  128. package/dist/util/qname.d.ts.map +1 -0
  129. package/dist/util/qname.js +189 -0
  130. package/dist/util/qname.js.map +1 -0
  131. package/dist/util/visibility.d.ts +7 -0
  132. package/dist/util/visibility.d.ts.map +1 -0
  133. package/dist/util/visibility.js +20 -0
  134. package/dist/util/visibility.js.map +1 -0
  135. package/dist/util/xml.d.ts +25 -0
  136. package/dist/util/xml.d.ts.map +1 -0
  137. package/dist/util/xml.js +133 -0
  138. package/dist/util/xml.js.map +1 -0
  139. package/package.json +42 -0
@@ -0,0 +1,89 @@
1
+ import { expressionFromRaw } from "./member-value.js";
2
+ import { getAttribute } from "../util/xml.js";
3
+ const BML_NS = "http://blockml.org/bml";
4
+ function bmlAttr(element, local) {
5
+ return (getAttribute(element, `bml:${local}`) ??
6
+ getAttribute(element, `${BML_NS}:${local}`));
7
+ }
8
+ export function parseDirectives(element, loc) {
9
+ const directives = [];
10
+ const each = bmlAttr(element, "each");
11
+ if (each !== undefined) {
12
+ const colon = each.indexOf(":");
13
+ let variables = [];
14
+ let collectionRaw = each;
15
+ if (colon !== -1) {
16
+ variables = each
17
+ .slice(0, colon)
18
+ .split(",")
19
+ .map((v) => v.trim())
20
+ .filter(Boolean);
21
+ collectionRaw = each.slice(colon + 1).trim();
22
+ }
23
+ let collection;
24
+ if (collectionRaw.startsWith("${")) {
25
+ collection = expressionFromRaw(collectionRaw, loc);
26
+ }
27
+ else {
28
+ collection = expressionFromRaw(`\${ ${collectionRaw} }`, loc);
29
+ }
30
+ directives.push({
31
+ type: "each",
32
+ variables,
33
+ collection,
34
+ });
35
+ }
36
+ const ifAttr = bmlAttr(element, "if");
37
+ if (ifAttr !== undefined) {
38
+ directives.push({
39
+ type: "if",
40
+ condition: expressionFromRaw(ifAttr, loc),
41
+ });
42
+ }
43
+ const unless = bmlAttr(element, "unless");
44
+ if (unless !== undefined) {
45
+ directives.push({
46
+ type: "unless",
47
+ condition: expressionFromRaw(unless, loc),
48
+ });
49
+ }
50
+ const withAttr = bmlAttr(element, "with");
51
+ if (withAttr !== undefined) {
52
+ const bindings = withAttr.split(",").map((part) => {
53
+ const eq = part.indexOf("=");
54
+ const name = (eq === -1 ? part : part.slice(0, eq)).trim();
55
+ const valueRaw = eq === -1 ? "" : part.slice(eq + 1).trim();
56
+ return {
57
+ name,
58
+ value: expressionFromRaw(valueRaw, loc),
59
+ };
60
+ });
61
+ directives.push({ type: "with", bindings });
62
+ }
63
+ return directives;
64
+ }
65
+ export function parseBmlMeta(element, typeFqn, file, loc) {
66
+ const id = bmlAttr(element, "id");
67
+ const version = bmlAttr(element, "version");
68
+ const bean = bmlAttr(element, "bean");
69
+ const scope = bmlAttr(element, "scope");
70
+ return {
71
+ id: id !== undefined ? parseMetaValue(id, typeFqn, file, loc) : undefined,
72
+ version: version !== undefined
73
+ ? parseMetaValue(version, typeFqn, file, loc)
74
+ : undefined,
75
+ bean: bean !== undefined ? parseMetaValue(bean, typeFqn, file, loc) : undefined,
76
+ scope,
77
+ };
78
+ }
79
+ function parseMetaValue(raw, typeFqn, file, loc) {
80
+ if (raw.startsWith("${") && raw.endsWith("}")) {
81
+ return expressionFromRaw(raw, loc);
82
+ }
83
+ return {
84
+ kind: "literal",
85
+ value: raw,
86
+ typeFqn,
87
+ };
88
+ }
89
+ //# sourceMappingURL=directives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/map/directives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { BlockDefinition } from "@blockml/bom";
2
+ import type { Element } from "@xmldom/xmldom";
3
+ import { type MapContext } from "./context.js";
4
+ export declare function mapBlock(element: Element, ctx: MapContext): BlockDefinition;
5
+ export declare function mapDocumentBlock(element: Element, filePath: string, source: string, bindings: Record<string, string>): BlockDefinition;
6
+ //# sourceMappingURL=map-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-block.d.ts","sourceRoot":"","sources":["../../src/map/map-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,eAAe,EAoBhB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAu6BjE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,eAAe,CAE3E;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,eAAe,CAGjB"}