@openscd/scl-lib 2.0.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 (238) hide show
  1. package/LICENCE +201 -0
  2. package/README.md +20 -0
  3. package/dist/foundation/codecomponents/nsds.d.ts +5 -0
  4. package/dist/foundation/codecomponents/nsds.js +22435 -0
  5. package/dist/foundation/codecomponents/nsds.js.map +1 -0
  6. package/dist/foundation/nsd.json +137748 -0
  7. package/dist/foundation/uniqueElementName.d.ts +2 -0
  8. package/dist/foundation/uniqueElementName.js +18 -0
  9. package/dist/foundation/uniqueElementName.js.map +1 -0
  10. package/dist/foundation/utils.d.ts +20 -0
  11. package/dist/foundation/utils.js +14 -0
  12. package/dist/foundation/utils.js.map +1 -0
  13. package/dist/generator/appIdGenerator.d.ts +21 -0
  14. package/dist/generator/appIdGenerator.js +53 -0
  15. package/dist/generator/appIdGenerator.js.map +1 -0
  16. package/dist/generator/lnInstGenerator.d.ts +16 -0
  17. package/dist/generator/lnInstGenerator.js +41 -0
  18. package/dist/generator/lnInstGenerator.js.map +1 -0
  19. package/dist/generator/macAddressGenerator.d.ts +14 -0
  20. package/dist/generator/macAddressGenerator.js +39 -0
  21. package/dist/generator/macAddressGenerator.js.map +1 -0
  22. package/dist/index.d.ts +61 -0
  23. package/dist/index.js +55 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/tAddress/changeGseOrSmvAddress.d.ts +14 -0
  26. package/dist/tAddress/changeGseOrSmvAddress.js +43 -0
  27. package/dist/tAddress/changeGseOrSmvAddress.js.map +1 -0
  28. package/dist/tBaseElement/find.d.ts +6 -0
  29. package/dist/tBaseElement/find.js +529 -0
  30. package/dist/tBaseElement/find.js.map +1 -0
  31. package/dist/tBaseElement/getChildren.d.ts +5 -0
  32. package/dist/tBaseElement/getChildren.js +12 -0
  33. package/dist/tBaseElement/getChildren.js.map +1 -0
  34. package/dist/tBaseElement/getReference.d.ts +9 -0
  35. package/dist/tBaseElement/getReference.js +31 -0
  36. package/dist/tBaseElement/getReference.js.map +1 -0
  37. package/dist/tBaseElement/identity.d.ts +2 -0
  38. package/dist/tBaseElement/identity.js +566 -0
  39. package/dist/tBaseElement/identity.js.map +1 -0
  40. package/dist/tBaseElement/isPublic.d.ts +2 -0
  41. package/dist/tBaseElement/isPublic.js +5 -0
  42. package/dist/tBaseElement/isPublic.js.map +1 -0
  43. package/dist/tBaseElement/parentTags.d.ts +3 -0
  44. package/dist/tBaseElement/parentTags.js +8 -0
  45. package/dist/tBaseElement/parentTags.js.map +1 -0
  46. package/dist/tBaseElement/tags.d.ts +8 -0
  47. package/dist/tBaseElement/tags.js +807 -0
  48. package/dist/tBaseElement/tags.js.map +1 -0
  49. package/dist/tBay/updateBay.d.ts +5 -0
  50. package/dist/tBay/updateBay.js +81 -0
  51. package/dist/tBay/updateBay.js.map +1 -0
  52. package/dist/tControl/controlBlockGseOrSmv.d.ts +7 -0
  53. package/dist/tControl/controlBlockGseOrSmv.js +26 -0
  54. package/dist/tControl/controlBlockGseOrSmv.js.map +1 -0
  55. package/dist/tControl/controlBlockObjRef.d.ts +2 -0
  56. package/dist/tControl/controlBlockObjRef.js +14 -0
  57. package/dist/tControl/controlBlockObjRef.js.map +1 -0
  58. package/dist/tControl/controlBlocks.d.ts +2 -0
  59. package/dist/tControl/controlBlocks.js +9 -0
  60. package/dist/tControl/controlBlocks.js.map +1 -0
  61. package/dist/tControl/findControlSubscription.d.ts +2 -0
  62. package/dist/tControl/findControlSubscription.js +8 -0
  63. package/dist/tControl/findControlSubscription.js.map +1 -0
  64. package/dist/tControl/pathId.d.ts +1 -0
  65. package/dist/tControl/pathId.js +9 -0
  66. package/dist/tControl/pathId.js.map +1 -0
  67. package/dist/tControl/removeControlBlock.d.ts +14 -0
  68. package/dist/tControl/removeControlBlock.js +35 -0
  69. package/dist/tControl/removeControlBlock.js.map +1 -0
  70. package/dist/tControl/updateConfRev.d.ts +2 -0
  71. package/dist/tControl/updateConfRev.js +8 -0
  72. package/dist/tControl/updateConfRev.js.map +1 -0
  73. package/dist/tControl/updateDatSet.d.ts +6 -0
  74. package/dist/tControl/updateDatSet.js +22 -0
  75. package/dist/tControl/updateDatSet.js.map +1 -0
  76. package/dist/tControlWithIEDName/connctedAp.d.ts +2 -0
  77. package/dist/tControlWithIEDName/connctedAp.js +7 -0
  78. package/dist/tControlWithIEDName/connctedAp.js.map +1 -0
  79. package/dist/tDataSet/canAddDataSet.d.ts +4 -0
  80. package/dist/tDataSet/canAddDataSet.js +44 -0
  81. package/dist/tDataSet/canAddDataSet.js.map +1 -0
  82. package/dist/tDataSet/createDataSet.d.ts +9 -0
  83. package/dist/tDataSet/createDataSet.js +33 -0
  84. package/dist/tDataSet/createDataSet.js.map +1 -0
  85. package/dist/tDataSet/removeDataSet.d.ts +10 -0
  86. package/dist/tDataSet/removeDataSet.js +27 -0
  87. package/dist/tDataSet/removeDataSet.js.map +1 -0
  88. package/dist/tDataSet/updateDataSet.d.ts +7 -0
  89. package/dist/tDataSet/updateDataSet.js +28 -0
  90. package/dist/tDataSet/updateDataSet.js.map +1 -0
  91. package/dist/tDataTypeTemplates/foundation.d.ts +2 -0
  92. package/dist/tDataTypeTemplates/foundation.js +118 -0
  93. package/dist/tDataTypeTemplates/foundation.js.map +1 -0
  94. package/dist/tDataTypeTemplates/importLNodeType.d.ts +13 -0
  95. package/dist/tDataTypeTemplates/importLNodeType.js +88 -0
  96. package/dist/tDataTypeTemplates/importLNodeType.js.map +1 -0
  97. package/dist/tDataTypeTemplates/insertSelectedLNodeType.d.ts +20 -0
  98. package/dist/tDataTypeTemplates/insertSelectedLNodeType.js +187 -0
  99. package/dist/tDataTypeTemplates/insertSelectedLNodeType.js.map +1 -0
  100. package/dist/tDataTypeTemplates/lNodeTypeToSelection.d.ts +8 -0
  101. package/dist/tDataTypeTemplates/lNodeTypeToSelection.js +67 -0
  102. package/dist/tDataTypeTemplates/lNodeTypeToSelection.js.map +1 -0
  103. package/dist/tDataTypeTemplates/nsdToJson.d.ts +101 -0
  104. package/dist/tDataTypeTemplates/nsdToJson.js +433 -0
  105. package/dist/tDataTypeTemplates/nsdToJson.js.map +1 -0
  106. package/dist/tDataTypeTemplates/removeDataType.d.ts +12 -0
  107. package/dist/tDataTypeTemplates/removeDataType.js +62 -0
  108. package/dist/tDataTypeTemplates/removeDataType.js.map +1 -0
  109. package/dist/tDataTypeTemplates/updateLNodeType.d.ts +2 -0
  110. package/dist/tDataTypeTemplates/updateLNodeType.js +22 -0
  111. package/dist/tDataTypeTemplates/updateLNodeType.js.map +1 -0
  112. package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.d.ts +16 -0
  113. package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.js +52 -0
  114. package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.js.map +1 -0
  115. package/dist/tExtRef/extRefTypeRestrictions.d.ts +17 -0
  116. package/dist/tExtRef/extRefTypeRestrictions.js +32 -0
  117. package/dist/tExtRef/extRefTypeRestrictions.js.map +1 -0
  118. package/dist/tExtRef/isSubscribed.d.ts +7 -0
  119. package/dist/tExtRef/isSubscribed.js +23 -0
  120. package/dist/tExtRef/isSubscribed.js.map +1 -0
  121. package/dist/tExtRef/matchDataAttributes.d.ts +2 -0
  122. package/dist/tExtRef/matchDataAttributes.js +13 -0
  123. package/dist/tExtRef/matchDataAttributes.js.map +1 -0
  124. package/dist/tExtRef/matchSrcAttributes.d.ts +2 -0
  125. package/dist/tExtRef/matchSrcAttributes.js +28 -0
  126. package/dist/tExtRef/matchSrcAttributes.js.map +1 -0
  127. package/dist/tExtRef/sourceControlBlock.d.ts +8 -0
  128. package/dist/tExtRef/sourceControlBlock.js +52 -0
  129. package/dist/tExtRef/sourceControlBlock.js.map +1 -0
  130. package/dist/tExtRef/subscribe.d.ts +47 -0
  131. package/dist/tExtRef/subscribe.js +187 -0
  132. package/dist/tExtRef/subscribe.js.map +1 -0
  133. package/dist/tExtRef/unsubscribe.d.ts +27 -0
  134. package/dist/tExtRef/unsubscribe.js +55 -0
  135. package/dist/tExtRef/unsubscribe.js.map +1 -0
  136. package/dist/tFCDA/canAddFCDA.d.ts +10 -0
  137. package/dist/tFCDA/canAddFCDA.js +42 -0
  138. package/dist/tFCDA/canAddFCDA.js.map +1 -0
  139. package/dist/tFCDA/fcdaBaseTypes.d.ts +11 -0
  140. package/dist/tFCDA/fcdaBaseTypes.js +56 -0
  141. package/dist/tFCDA/fcdaBaseTypes.js.map +1 -0
  142. package/dist/tFCDA/removeFCDA.d.ts +8 -0
  143. package/dist/tFCDA/removeFCDA.js +33 -0
  144. package/dist/tFCDA/removeFCDA.js.map +1 -0
  145. package/dist/tGSE/changeGSEContent.d.ts +17 -0
  146. package/dist/tGSE/changeGSEContent.js +53 -0
  147. package/dist/tGSE/changeGSEContent.js.map +1 -0
  148. package/dist/tGSE/createGSE.d.ts +20 -0
  149. package/dist/tGSE/createGSE.js +44 -0
  150. package/dist/tGSE/createGSE.js.map +1 -0
  151. package/dist/tGSEControl/canAddGSEControl.d.ts +4 -0
  152. package/dist/tGSEControl/canAddGSEControl.js +27 -0
  153. package/dist/tGSEControl/canAddGSEControl.js.map +1 -0
  154. package/dist/tGSEControl/createGSEControl.d.ts +49 -0
  155. package/dist/tGSEControl/createGSEControl.js +65 -0
  156. package/dist/tGSEControl/createGSEControl.js.map +1 -0
  157. package/dist/tGSEControl/updateGSEControl.d.ts +15 -0
  158. package/dist/tGSEControl/updateGSEControl.js +61 -0
  159. package/dist/tGSEControl/updateGSEControl.js.map +1 -0
  160. package/dist/tIED/insertIED.d.ts +13 -0
  161. package/dist/tIED/insertIED.js +245 -0
  162. package/dist/tIED/insertIED.js.map +1 -0
  163. package/dist/tIED/removeIED.d.ts +14 -0
  164. package/dist/tIED/removeIED.js +70 -0
  165. package/dist/tIED/removeIED.js.map +1 -0
  166. package/dist/tIED/updateIED.d.ts +17 -0
  167. package/dist/tIED/updateIED.js +185 -0
  168. package/dist/tIED/updateIED.js.map +1 -0
  169. package/dist/tInputs/removeInputs.d.ts +7 -0
  170. package/dist/tInputs/removeInputs.js +25 -0
  171. package/dist/tInputs/removeInputs.js.map +1 -0
  172. package/dist/tLN/removeSubscriptionSupervision.d.ts +7 -0
  173. package/dist/tLN/removeSubscriptionSupervision.js +94 -0
  174. package/dist/tLN/removeSubscriptionSupervision.js.map +1 -0
  175. package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.d.ts +13 -0
  176. package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.js +116 -0
  177. package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.js.map +1 -0
  178. package/dist/tLN/supervision/createSupervisionEdit.d.ts +20 -0
  179. package/dist/tLN/supervision/createSupervisionEdit.js +129 -0
  180. package/dist/tLN/supervision/createSupervisionEdit.js.map +1 -0
  181. package/dist/tLN/supervision/findControlBlockOnSrcAttributes.d.ts +10 -0
  182. package/dist/tLN/supervision/findControlBlockOnSrcAttributes.js +13 -0
  183. package/dist/tLN/supervision/findControlBlockOnSrcAttributes.js.map +1 -0
  184. package/dist/tLN/supervision/foundation.d.ts +37 -0
  185. package/dist/tLN/supervision/foundation.js +43 -0
  186. package/dist/tLN/supervision/foundation.js.map +1 -0
  187. package/dist/tLN/supervision/insertSubscriptionSupervisions.d.ts +11 -0
  188. package/dist/tLN/supervision/insertSubscriptionSupervisions.js +98 -0
  189. package/dist/tLN/supervision/insertSubscriptionSupervisions.js.map +1 -0
  190. package/dist/tLN/supervision/instantiateSubscriptionSupervision.d.ts +10 -0
  191. package/dist/tLN/supervision/instantiateSubscriptionSupervision.js +36 -0
  192. package/dist/tLN/supervision/instantiateSubscriptionSupervision.js.map +1 -0
  193. package/dist/tLN/supervision/removeSupervision.d.ts +7 -0
  194. package/dist/tLN/supervision/removeSupervision.js +39 -0
  195. package/dist/tLN/supervision/removeSupervision.js.map +1 -0
  196. package/dist/tReportControl/canAddReportControl.d.ts +11 -0
  197. package/dist/tReportControl/canAddReportControl.js +24 -0
  198. package/dist/tReportControl/canAddReportControl.js.map +1 -0
  199. package/dist/tReportControl/createReportControl.d.ts +68 -0
  200. package/dist/tReportControl/createReportControl.js +78 -0
  201. package/dist/tReportControl/createReportControl.js.map +1 -0
  202. package/dist/tReportControl/numberReportControlInstances.d.ts +5 -0
  203. package/dist/tReportControl/numberReportControlInstances.js +19 -0
  204. package/dist/tReportControl/numberReportControlInstances.js.map +1 -0
  205. package/dist/tReportControl/updateReportControl.d.ts +5 -0
  206. package/dist/tReportControl/updateReportControl.js +24 -0
  207. package/dist/tReportControl/updateReportControl.js.map +1 -0
  208. package/dist/tSMV/changeSMVContent.d.ts +3 -0
  209. package/dist/tSMV/changeSMVContent.js +5 -0
  210. package/dist/tSMV/changeSMVContent.js.map +1 -0
  211. package/dist/tSMV/createSMV.d.ts +16 -0
  212. package/dist/tSMV/createSMV.js +32 -0
  213. package/dist/tSMV/createSMV.js.map +1 -0
  214. package/dist/tSampledValueControl/canAddSampledValueControl.d.ts +4 -0
  215. package/dist/tSampledValueControl/canAddSampledValueControl.js +27 -0
  216. package/dist/tSampledValueControl/canAddSampledValueControl.js.map +1 -0
  217. package/dist/tSampledValueControl/createSampledValueControl.d.ts +66 -0
  218. package/dist/tSampledValueControl/createSampledValueControl.js +74 -0
  219. package/dist/tSampledValueControl/createSampledValueControl.js.map +1 -0
  220. package/dist/tSampledValueControl/updateSampledValueControl.d.ts +14 -0
  221. package/dist/tSampledValueControl/updateSampledValueControl.js +60 -0
  222. package/dist/tSampledValueControl/updateSampledValueControl.js.map +1 -0
  223. package/dist/tServices/tConfReportControl/maxReportControl.d.ts +9 -0
  224. package/dist/tServices/tConfReportControl/maxReportControl.js +14 -0
  225. package/dist/tServices/tConfReportControl/maxReportControl.js.map +1 -0
  226. package/dist/tSubstation/removeProcessElement.d.ts +9 -0
  227. package/dist/tSubstation/removeProcessElement.js +50 -0
  228. package/dist/tSubstation/removeProcessElement.js.map +1 -0
  229. package/dist/tSubstation/updateLnType.d.ts +8 -0
  230. package/dist/tSubstation/updateLnType.js +96 -0
  231. package/dist/tSubstation/updateLnType.js.map +1 -0
  232. package/dist/tSubstation/updateSubstation.d.ts +5 -0
  233. package/dist/tSubstation/updateSubstation.js +75 -0
  234. package/dist/tSubstation/updateSubstation.js.map +1 -0
  235. package/dist/tVoltageLevel/updateVoltageLevel.d.ts +5 -0
  236. package/dist/tVoltageLevel/updateVoltageLevel.js +83 -0
  237. package/dist/tVoltageLevel/updateVoltageLevel.js.map +1 -0
  238. package/package.json +43 -0
@@ -0,0 +1,56 @@
1
+ function dataAttributeSpecification(anyLn, doName, daName) {
2
+ const doc = anyLn.ownerDocument;
3
+ const lNodeType = doc.querySelector(`:root > DataTypeTemplates > LNodeType[id="${anyLn.getAttribute("lnType")}"]`);
4
+ const doNames = doName.split(".");
5
+ let leaf = lNodeType;
6
+ for (const doName of doNames) {
7
+ const dO = leaf?.querySelector(`DO[name="${doName}"], SDO[name="${doName}"]`);
8
+ leaf = doc.querySelector(`:root > DataTypeTemplates > DOType[id="${dO?.getAttribute("type")}"]`);
9
+ }
10
+ const cdc = leaf?.getAttribute("cdc");
11
+ if (!cdc)
12
+ return;
13
+ if (!daName)
14
+ return { cdc };
15
+ const daNames = daName.split(".");
16
+ for (const daName of daNames) {
17
+ const dA = leaf?.querySelector(`DA[name="${daName}"], BDA[name="${daName}"]`);
18
+ leaf =
19
+ daNames.indexOf(daName) < daNames.length - 1
20
+ ? doc.querySelector(`:root > DataTypeTemplates > DAType[id="${dA?.getAttribute("type")}"]`)
21
+ : dA;
22
+ }
23
+ const bType = leaf?.getAttribute("bType");
24
+ if (!bType)
25
+ return;
26
+ return { cdc, bType };
27
+ }
28
+ /**
29
+ * Determines common data class (CDC) of a given `doName` and with present
30
+ * `daName` its `bType`.
31
+ * @param fcda - The `FCDA` element to determine the `cdc` and `bType` for
32
+ * @returns An object that contains the `cdc` and `bType` with given `daName`
33
+ * or undefined if one of them cannot be determined
34
+ */
35
+ export function fcdaBaseTypes(fcda) {
36
+ const sourceIed = fcda.closest("IED");
37
+ const [ldInst, prefix, lnClass, lnInst, doName, daName] = [
38
+ "ldInst",
39
+ "prefix",
40
+ "lnClass",
41
+ "lnInst",
42
+ "doName",
43
+ "daName",
44
+ ].map((attr) => fcda.getAttribute(attr));
45
+ if (!sourceIed || !ldInst || !lnClass || !doName)
46
+ return;
47
+ const anyLn = Array.from(sourceIed.querySelectorAll(`LDevice[inst="${ldInst}"] > LN, LDevice[inst="${ldInst}"] > LN0`)).find((anyLn) => {
48
+ return ((anyLn.getAttribute("prefix") ?? "") === (prefix ?? "") &&
49
+ anyLn.getAttribute("lnClass") === lnClass &&
50
+ anyLn.getAttribute("inst") === (lnInst ?? ""));
51
+ });
52
+ if (!anyLn)
53
+ return;
54
+ return dataAttributeSpecification(anyLn, doName, daName);
55
+ }
56
+ //# sourceMappingURL=fcdaBaseTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fcdaBaseTypes.js","sourceRoot":"","sources":["../../tFCDA/fcdaBaseTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Remove } from "@openscd/oscd-api";
2
+ import { SetAttributes } from "@openscd/oscd-api";
3
+ export declare function fCDAsSubscription(fcda: Element): Element[];
4
+ /** Utility function to remove `FCDA` element that checks for possible
5
+ * subscription that need to be updated or removed as well.
6
+ * @param remove - remove edit (remove.node must be FCDA)
7
+ * @returns Edit array removing FCDA and its subscriber information */
8
+ export declare function removeFCDA(remove: Remove): (SetAttributes | Remove)[];
@@ -0,0 +1,33 @@
1
+ import { controlBlocks } from "../tControl/controlBlocks.js";
2
+ import { matchDataAttributes } from "../tExtRef/matchDataAttributes.js";
3
+ import { matchSrcAttributes } from "../tExtRef/matchSrcAttributes.js";
4
+ import { unsubscribe } from "../tExtRef/unsubscribe.js";
5
+ export function fCDAsSubscription(fcda) {
6
+ const doc = fcda.ownerDocument;
7
+ const iedName = fcda.closest("IED")?.getAttribute("name");
8
+ if (!iedName)
9
+ return [];
10
+ const isEd1 = !fcda.ownerDocument
11
+ .querySelector("SCL")
12
+ ?.getAttribute("version");
13
+ if (isEd1)
14
+ return Array.from(doc.querySelectorAll(`:root>IED>AccessPoint>Server>LDevice>LN0>Inputs>ExtRef[iedName="${iedName}"],
15
+ :root>IED>AccessPoint>Server>LDevice>LN>Inputs>ExtRef[iedName="${iedName}"]`)).filter((extRef) => matchDataAttributes(extRef, fcda));
16
+ return controlBlocks(fcda).flatMap((controlBlock) => Array.from(doc.querySelectorAll(`:root>IED>AccessPoint>Server>LDevice>LN0>Inputs>ExtRef[iedName="${iedName}"],
17
+ :root>IED>AccessPoint>Server>LDevice>LN>Inputs>ExtRef[iedName="${iedName}"]`)).filter((extRef) => matchDataAttributes(extRef, fcda) &&
18
+ matchSrcAttributes(extRef, controlBlock)));
19
+ }
20
+ /** Utility function to remove `FCDA` element that checks for possible
21
+ * subscription that need to be updated or removed as well.
22
+ * @param remove - remove edit (remove.node must be FCDA)
23
+ * @returns Edit array removing FCDA and its subscriber information */
24
+ export function removeFCDA(remove) {
25
+ if (remove.node.tagName !== "FCDA")
26
+ return [];
27
+ const fcda = remove.node;
28
+ const removeActionFcda = [remove];
29
+ const extRefActions = [];
30
+ extRefActions.push(...unsubscribe(fCDAsSubscription(fcda)));
31
+ return removeActionFcda.concat(extRefActions);
32
+ }
33
+ //# sourceMappingURL=removeFCDA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeFCDA.js","sourceRoot":"","sources":["../../tFCDA/removeFCDA.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,aAAa;SAC9B,aAAa,CAAC,KAAK,CAAC;QACrB,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAE5B,IAAI,KAAK;QACP,OAAO,KAAK,CAAC,IAAI,CACf,GAAG,CAAC,gBAAgB,CAClB,mEAAmE,OAAO;yEACT,OAAO,IAAI,CAC7E,CACF,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1D,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAClD,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,gBAAgB,CAClB,mEAAmE,OAAO;yEACT,OAAO,IAAI,CAC7E,CACF,CAAC,MAAM,CACN,CAAC,MAAM,EAAE,EAAE,CACT,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC;QACjC,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAC3C,CACF,CAAC;AACJ,CAAC;AAED;;;sEAGsE;AACtE,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAK,MAAM,CAAC,IAAgB,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAE3D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAe,CAAC;IAEpC,MAAM,gBAAgB,GAA+B,CAAC,MAAM,CAAC,CAAC;IAE9D,MAAM,aAAa,GAA+B,EAAE,CAAC;IACrD,aAAa,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE5D,OAAO,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Insert, Remove } from "@openscd/oscd-api";
2
+ import { ChangeGseOrSmvAddressOptions } from "../tAddress/changeGseOrSmvAddress.js";
3
+ export type ChangeGseTimeOptions = {
4
+ MinTime?: string;
5
+ MaxTime?: string;
6
+ };
7
+ export type ChangeGSEContentOptions = {
8
+ address?: ChangeGseOrSmvAddressOptions;
9
+ timing?: ChangeGseTimeOptions;
10
+ };
11
+ /** Utility function to change the content of the element `GSE`
12
+ * including the child `Address` and the children `MinTime`/`MaxTime`
13
+ * @param element - the element to be updated
14
+ * @param options - the requested changes
15
+ * @returns Edit array updating GSEs children Address, MinTine and MaxTime
16
+ * */
17
+ export declare function changeGSEContent(element: Element, options: ChangeGSEContentOptions): (Insert | Remove)[];
@@ -0,0 +1,53 @@
1
+ import { createElement } from "../foundation/utils.js";
2
+ import { getReference } from "../tBaseElement/getReference.js";
3
+ import { changeGseOrSmvAddress, } from "../tAddress/changeGseOrSmvAddress.js";
4
+ function changeGseTiming(gSE, options) {
5
+ const edits = [];
6
+ const oldMinTime = gSE.querySelector("MinTime");
7
+ const oldMaxTime = gSE.querySelector("MaxTime");
8
+ if (options.MinTime) {
9
+ const newMinTime = createElement(gSE.ownerDocument, "MinTime", {
10
+ unit: "s",
11
+ multiplier: "m",
12
+ });
13
+ newMinTime.textContent = options.MinTime;
14
+ edits.push({
15
+ parent: gSE,
16
+ node: newMinTime,
17
+ reference: getReference(gSE, "MinTime"),
18
+ });
19
+ }
20
+ if (oldMinTime)
21
+ edits.push({ node: oldMinTime });
22
+ if (options.MaxTime) {
23
+ const newMaxTime = createElement(gSE.ownerDocument, "MaxTime", {
24
+ unit: "s",
25
+ multiplier: "m",
26
+ });
27
+ newMaxTime.textContent = options.MaxTime;
28
+ edits.push({
29
+ parent: gSE,
30
+ node: newMaxTime,
31
+ reference: getReference(gSE, "MaxTime"),
32
+ });
33
+ }
34
+ if (oldMaxTime)
35
+ edits.push({ node: oldMaxTime });
36
+ return edits;
37
+ }
38
+ /** Utility function to change the content of the element `GSE`
39
+ * including the child `Address` and the children `MinTime`/`MaxTime`
40
+ * @param element - the element to be updated
41
+ * @param options - the requested changes
42
+ * @returns Edit array updating GSEs children Address, MinTine and MaxTime
43
+ * */
44
+ export function changeGSEContent(element, options) {
45
+ const addressEdits = options.address
46
+ ? changeGseOrSmvAddress(element, options.address)
47
+ : [];
48
+ const timeEdits = options.timing
49
+ ? changeGseTiming(element, options.timing)
50
+ : [];
51
+ return addressEdits.concat(timeEdits);
52
+ }
53
+ //# sourceMappingURL=changeGSEContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeGSEContent.js","sourceRoot":"","sources":["../../tGSE/changeGSEContent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAEL,qBAAqB,GACtB,MAAM,sCAAsC,CAAC;AAS9C,SAAS,eAAe,CACtB,GAAY,EACZ,OAA6B;IAE7B,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAEhD,IAAI,OAAO,CAAC,OAAO,EAAE;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE;YAC7D,IAAI,EAAE,GAAG;YACT,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;SACxC,CAAC,CAAC;KACJ;IACD,IAAI,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEjD,IAAI,OAAO,CAAC,OAAO,EAAE;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE;YAC7D,IAAI,EAAE,GAAG;YACT,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;SACxC,CAAC,CAAC;KACJ;IACD,IAAI,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;KAKK;AACL,MAAM,UAAU,gBAAgB,CAC9B,OAAgB,EAChB,OAAgC;IAEhC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO;QAClC,CAAC,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM;QAC9B,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Insert } from "@openscd/oscd-api";
2
+ export type CreateGSEOptions = {
3
+ /** MAC-Address within `P` element in the `GSE` element */
4
+ mac?: string;
5
+ /** APPID within `P` element in the `GSE` element */
6
+ appId?: string;
7
+ /** VLAN-ID within `P` element in the `GSE` element */
8
+ vlanId?: string;
9
+ /** VLAN-PRIORITY within `P` element in the `GSE` element */
10
+ vlanPriority?: string;
11
+ /** MaxTime element within `GSE` element */
12
+ MaxTime?: string;
13
+ /** MinTime element within `GSE` element */
14
+ MinTime?: string;
15
+ };
16
+ /** @returns Edit inserting new `GSE` to [[`parent`]] ConnectedAP element */
17
+ export declare function createGSE(parent: Element, attributes: {
18
+ ldInst: string;
19
+ cbName: string;
20
+ }, options?: CreateGSEOptions): Insert | null;
@@ -0,0 +1,44 @@
1
+ import { createElement } from "../foundation/utils.js";
2
+ import { macAddressGenerator } from "../generator/macAddressGenerator.js";
3
+ import { appIdGenerator } from "../generator/appIdGenerator.js";
4
+ import { getReference } from "../tBaseElement/getReference.js";
5
+ /** @returns Edit inserting new `GSE` to [[`parent`]] ConnectedAP element */
6
+ export function createGSE(parent, attributes, options = {}) {
7
+ if (parent.tagName !== "ConnectedAP")
8
+ return null;
9
+ const doc = parent.ownerDocument;
10
+ const gSE = createElement(doc, "GSE", attributes);
11
+ const address = createElement(doc, "Address", {});
12
+ gSE.appendChild(address);
13
+ const pTypes = {};
14
+ pTypes["MAC-Address"] = options.mac ?? macAddressGenerator(doc, "GSE")();
15
+ pTypes.APPID = options.appId ?? appIdGenerator(doc, "GSE")();
16
+ pTypes["VLAN-ID"] = options.vlanId ?? "000";
17
+ pTypes["VLAN-PRIORITY"] = options.vlanPriority ?? "4";
18
+ Object.entries(pTypes)
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
+ .filter(([_, value]) => value !== undefined)
21
+ .forEach(([type, value]) => {
22
+ const child = createElement(doc, "P", { type });
23
+ child.textContent = value;
24
+ address.appendChild(child);
25
+ });
26
+ const newMinTime = createElement(doc, "MinTime", {
27
+ unit: "s",
28
+ multiplier: "m",
29
+ });
30
+ newMinTime.textContent = options.MinTime ?? "10";
31
+ gSE.appendChild(newMinTime);
32
+ const newMaxTime = createElement(doc, "MaxTime", {
33
+ unit: "s",
34
+ multiplier: "m",
35
+ });
36
+ newMaxTime.textContent = options.MaxTime ?? "10000";
37
+ gSE.appendChild(newMaxTime);
38
+ return {
39
+ parent,
40
+ node: gSE,
41
+ reference: getReference(parent, "GSE"),
42
+ };
43
+ }
44
+ //# sourceMappingURL=createGSE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createGSE.js","sourceRoot":"","sources":["../../tGSE/createGSE.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAiB/D,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CACvB,MAAe,EACf,UAA8C,EAC9C,UAA4B,EAAE;IAE9B,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAElD,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;IAEjC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAEzB,MAAM,MAAM,GAAuC,EAAE,CAAC;IACtD,MAAM,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,GAAG,IAAI,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAG,CAAC;IAC1E,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,EAAG,CAAC;IAC9D,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IAC5C,MAAM,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC;IACtD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpB,6DAA6D;SAC5D,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SAC3C,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,WAAW,GAAG,KAAM,CAAC;QAE3B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEL,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE;QAC/C,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,GAAG;KAChB,CAAC,CAAC;IACH,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACjD,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE5B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE;QAC/C,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,GAAG;KAChB,CAAC,CAAC;IACH,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;IACpD,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE5B,OAAO;QACL,MAAM;QACN,IAAI,EAAE,GAAG;QACT,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC;KACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Checks Services>GOOSE AccessPoint or on IED if the first is not present
2
+ * @param parent - parent `LN0`
3
+ * @returns Whether new `GSEControl` is exceeding GOOSE.max attribute */
4
+ export declare function canAddGSEControl(ln0: Element): boolean;
@@ -0,0 +1,27 @@
1
+ function maxGSEControl(parent) {
2
+ {
3
+ const selector = `:scope > Services > GOOSE`;
4
+ const apGOOSE = parent.closest("AccessPoint")?.querySelector(selector);
5
+ if (apGOOSE)
6
+ return {
7
+ max: parseInt(apGOOSE.getAttribute("max") ?? "0", 10),
8
+ scope: "AccessPoint",
9
+ };
10
+ const iedGOOSE = parent.closest("IED")?.querySelector(selector);
11
+ return {
12
+ max: parseInt(iedGOOSE?.getAttribute("max") ?? "0", 10),
13
+ scope: "IED",
14
+ };
15
+ }
16
+ }
17
+ /** Checks Services>GOOSE AccessPoint or on IED if the first is not present
18
+ * @param parent - parent `LN0`
19
+ * @returns Whether new `GSEControl` is exceeding GOOSE.max attribute */
20
+ export function canAddGSEControl(ln0) {
21
+ const { max, scope } = maxGSEControl(ln0);
22
+ const existingGseControls = Array.from(ln0
23
+ .closest(scope)
24
+ ?.querySelectorAll(":scope Server > LDevice > LN0 > GSEControl") ?? []).length;
25
+ return max > existingGseControls;
26
+ }
27
+ //# sourceMappingURL=canAddGSEControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canAddGSEControl.js","sourceRoot":"","sources":["../../tGSEControl/canAddGSEControl.ts"],"names":[],"mappings":"AAAA,SAAS,aAAa,CAAC,MAAe;IACpC;QACE,MAAM,QAAQ,GAAG,2BAA2B,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,OAAO;YACT,OAAO;gBACL,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;gBACrD,KAAK,EAAE,aAAa;aACrB,CAAC;QAEJ,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChE,OAAO;YACL,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;YACvD,KAAK,EAAE,KAAK;SACb,CAAC;KACH;AACH,CAAC;AAED;;wEAEwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAE1C,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CACpC,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;QACf,EAAE,gBAAgB,CAAC,4CAA4C,CAAC,IAAI,EAAE,CACzE,CAAC,MAAM,CAAC;IAET,OAAO,GAAG,GAAG,mBAAmB,CAAC;AACnC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { Insert } from "@openscd/oscd-api";
2
+ export type CreateGSEControlOptions = {
3
+ gseControl?: {
4
+ /** `GSEControl` name. Must be unique.
5
+ * When missing a unique name starting with `newGSEControl_xx` is set */
6
+ name?: string;
7
+ desc?: string | null;
8
+ /** Id for the new GSEControl. Default is IED.name/LDevice.inst/LLN0/GSEControl.name */
9
+ appID?: string;
10
+ /** Whether the GSEControl is of type 'GOOSE' or 'GSSE'. Default 'GOOSE' */
11
+ type?: "GOOSE" | "GSSE";
12
+ /** Whether GOOSE is coded with fixed offsets. Default is false */
13
+ fixedOffs?: "true" | "false";
14
+ /** Security option for the GSEControl acc IEC 62132. Defaults to null */
15
+ securityEnable?: "SignatureAndEncryption" | "Signature" | "None" | null;
16
+ /** Reference to an existing `DataSet` */
17
+ datSet?: string | null;
18
+ /**User-defined configuration revision (confRev). Overwrites
19
+ *logic to to set confRev acc. to IEC 61850.*/
20
+ confRev?: string | null;
21
+ };
22
+ gse?: {
23
+ /** The AccessPoint that shall publish the GOOSE. Default the AccessPoint holding the Server element */
24
+ apName?: string;
25
+ /** MAC-Address within `P` element in the `GSE` element */
26
+ mac?: string;
27
+ /** APPID within `P` element in the `GSE` element */
28
+ appId?: string;
29
+ /** VLAN-ID within `P` element in the `GSE` element */
30
+ vlanId?: string;
31
+ /** VLAN-PRIORITY within `P` element in the `GSE` element */
32
+ vlanPriority?: string;
33
+ /** MaxTime element within `GSE` element */
34
+ MaxTime?: string;
35
+ /** MinTime element within `GSE` element */
36
+ MinTime?: string;
37
+ };
38
+ /** If true, skips check for unique GSEControl name,
39
+ * whether `datSet` is pointing to valid `DataSet`
40
+ * and whether additional GSEControl is allowed in IED/AccessPoint. */
41
+ skipCheck?: boolean;
42
+ };
43
+ /** Utility function to create schema valid `GSEControl` and `GSE` elements
44
+ * @parent Parent element such as `LN0`, `LDevice`, `AccessPoint` and `IED`
45
+ * @options Configuration for GSEControl/GSE element
46
+ * @returns Edit inserting new `GSEControl` to [[`parent`]] element and when possible
47
+ * `GSE` to connected `ConnectedAP`
48
+ * */
49
+ export declare function createGSEControl(parent: Element, options?: CreateGSEControlOptions): Insert[];
@@ -0,0 +1,65 @@
1
+ import { createElement } from "../foundation/utils.js";
2
+ import { getReference } from "../tBaseElement/getReference.js";
3
+ import { connectedAp } from "../tControlWithIEDName/connctedAp.js";
4
+ import { pathId } from "../tControl/pathId.js";
5
+ import { uniqueElementName } from "../foundation/uniqueElementName.js";
6
+ import { canAddGSEControl } from "./canAddGSEControl.js";
7
+ import { createGSE } from "../tGSE/createGSE.js";
8
+ function invalidGSEControl(ln0, name, datSet) {
9
+ const uniqueName = name
10
+ ? !ln0.querySelector(`:scope > GSEControl[name="${name}"]`)
11
+ : true;
12
+ const validDataSet = datSet
13
+ ? !!ln0.querySelector(`:scope > DataSet[name="${datSet}"]`)
14
+ : true;
15
+ return !(uniqueName && validDataSet && canAddGSEControl(ln0));
16
+ }
17
+ /** Utility function to create schema valid `GSEControl` and `GSE` elements
18
+ * @parent Parent element such as `LN0`, `LDevice`, `AccessPoint` and `IED`
19
+ * @options Configuration for GSEControl/GSE element
20
+ * @returns Edit inserting new `GSEControl` to [[`parent`]] element and when possible
21
+ * `GSE` to connected `ConnectedAP`
22
+ * */
23
+ export function createGSEControl(parent, options = { gseControl: {}, gse: {} }) {
24
+ const ln0 = parent.tagName === "LN0" ? parent : parent.querySelector("LN0");
25
+ if (!ln0)
26
+ return [];
27
+ const name = options.gseControl?.name;
28
+ const datSet = options.gseControl?.datSet;
29
+ if (!options.skipCheck && invalidGSEControl(ln0, name, datSet))
30
+ return [];
31
+ const attributes = { ...options.gseControl };
32
+ const cbName = name ? name : uniqueElementName(ln0, "GSEControl");
33
+ if (!options.gseControl?.name)
34
+ attributes.name = cbName;
35
+ if (!options.gseControl?.confRev)
36
+ attributes.confRev = "1";
37
+ if (!options.gseControl?.type)
38
+ attributes.type = "GOOSE";
39
+ if (!options.gseControl?.appID)
40
+ attributes.appID = pathId(ln0, cbName);
41
+ const generatedConfRev = options.gseControl?.datSet ? "1" : "0";
42
+ const userConfRev = options.gseControl?.confRev;
43
+ attributes.confRev = userConfRev ? userConfRev : generatedConfRev;
44
+ const gseControl = createElement(ln0.ownerDocument, "GSEControl", attributes);
45
+ const edits = [];
46
+ edits.push({
47
+ parent: ln0,
48
+ node: gseControl,
49
+ reference: getReference(ln0, "GSEControl"),
50
+ });
51
+ const connAp = connectedAp(ln0, options.gse?.apName);
52
+ if (!connAp)
53
+ return edits;
54
+ const ldInst = ln0.closest("LDevice").getAttribute("inst");
55
+ if (!ldInst || !cbName)
56
+ return edits;
57
+ const gseCreateOptions = options.gse ?? {};
58
+ delete gseCreateOptions.apName;
59
+ const gseAttrs = { ldInst, cbName };
60
+ const gseEdit = createGSE(connAp, gseAttrs, gseCreateOptions);
61
+ if (gseEdit)
62
+ edits.push(gseEdit);
63
+ return edits;
64
+ }
65
+ //# sourceMappingURL=createGSEControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createGSEControl.js","sourceRoot":"","sources":["../../tGSEControl/createGSEControl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Insert, Remove, SetAttributes } from "@openscd/oscd-api";
2
+ /**
3
+ * Utility function to update GSEControl element attributes.
4
+ * ```md
5
+ * These attributes trigger additional edits such as
6
+ * - name: also updates GSE.cbName and supervision references
7
+ * - datSet: update reference DataSet.name - when DataSet is single use
8
+ *
9
+ * >NOTE: confRev attribute is updated +10000 on every data set change
10
+ * ```
11
+ * @param gseControl - GSEControl element
12
+ * @param attributes -
13
+ * @returns action array to update all `GSEControl` attributes
14
+ */
15
+ export declare function updateGSEControl(setAttributes: SetAttributes): (SetAttributes | Remove | Insert)[];
@@ -0,0 +1,61 @@
1
+ import { controlBlockGseOrSmv } from "../tControl/controlBlockGseOrSmv.js";
2
+ import { controlBlockObjRef } from "../tControl/controlBlockObjRef.js";
3
+ import { findControlBlockSubscription } from "../tControl/findControlSubscription.js";
4
+ import { updatedConfRev } from "../tControl/updateConfRev.js";
5
+ import { updateDatSet } from "../tControl/updateDatSet.js";
6
+ /**
7
+ * Utility function to update GSEControl element attributes.
8
+ * ```md
9
+ * These attributes trigger additional edits such as
10
+ * - name: also updates GSE.cbName and supervision references
11
+ * - datSet: update reference DataSet.name - when DataSet is single use
12
+ *
13
+ * >NOTE: confRev attribute is updated +10000 on every data set change
14
+ * ```
15
+ * @param gseControl - GSEControl element
16
+ * @param attributes -
17
+ * @returns action array to update all `GSEControl` attributes
18
+ */
19
+ export function updateGSEControl(setAttributes) {
20
+ if (setAttributes.element.tagName !== "GSEControl")
21
+ return [];
22
+ const updates = [];
23
+ if (setAttributes.attributes.name) {
24
+ const extRefUpdates = findControlBlockSubscription(setAttributes.element).map((extRef) => ({
25
+ element: extRef,
26
+ attributes: { srcCBName: setAttributes.attributes.name },
27
+ }));
28
+ const supervisionUpdates = Array.from(setAttributes.element.ownerDocument.querySelectorAll('*[lnClass="LGOS"] Val'))
29
+ .filter((val) => val.textContent === controlBlockObjRef(setAttributes.element))
30
+ .flatMap((val) => {
31
+ const [path] = controlBlockObjRef(setAttributes.element).split(".");
32
+ const oldValContent = Array.from(val.childNodes).find((node) => node.nodeType === Node.TEXT_NODE);
33
+ const newValContent = setAttributes.element.ownerDocument.createTextNode(`${path}.${setAttributes.attributes.name}`);
34
+ return [
35
+ { node: oldValContent },
36
+ { parent: val, node: newValContent, reference: null },
37
+ ];
38
+ });
39
+ const gseUpdate = [];
40
+ const gSE = controlBlockGseOrSmv(setAttributes.element);
41
+ if (gSE) {
42
+ gseUpdate.push({
43
+ element: gSE,
44
+ attributes: { cbName: setAttributes.attributes.name },
45
+ });
46
+ }
47
+ updates.push(...extRefUpdates, ...supervisionUpdates, ...gseUpdate);
48
+ }
49
+ if (setAttributes.attributes.datSet) {
50
+ const updateDataSet = updateDatSet(setAttributes);
51
+ if (updateDataSet)
52
+ updates.push(updateDataSet);
53
+ // remove datSet from the update to avoid schema invalidity
54
+ else
55
+ delete setAttributes.attributes.datSet;
56
+ // +10000 for data set update
57
+ setAttributes.attributes.confRev = updatedConfRev(setAttributes.element);
58
+ }
59
+ return [setAttributes, ...updates];
60
+ }
61
+ //# sourceMappingURL=updateGSEControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateGSEControl.js","sourceRoot":"","sources":["../../tGSEControl/updateGSEControl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Insert } from "@openscd/oscd-api";
2
+ export type InsertIedOptions = {
3
+ addCommunicationSection: boolean;
4
+ };
5
+ /** Function to import !single IEDs with its `DataTypeTemplates` and
6
+ * optionally linked `Communication`section elements.
7
+ * >NOTE: Element are MOVED from ied document to the project not copied
8
+ * @param scl - the parent SCL element to insert the IED to
9
+ * @param ied - the new IED to be added to the project (SCL)
10
+ * @param options
11
+ * @returns An array containing diff objects representing an import IED edit
12
+ * section */
13
+ export declare function insertIed(scl: Element, ied: Element, options?: InsertIedOptions): Insert[];