@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,74 @@
1
+ import { createElement } from "../foundation/utils.js";
2
+ import { getReference } from "../tBaseElement/getReference.js";
3
+ import { uniqueElementName } from "../foundation/uniqueElementName.js";
4
+ import { connectedAp } from "../tControlWithIEDName/connctedAp.js";
5
+ import { createSMV } from "../tSMV/createSMV.js";
6
+ import { pathId } from "../tControl/pathId.js";
7
+ import { canAddSampledValueControl } from "../tSampledValueControl/canAddSampledValueControl.js";
8
+ function invalidSampledValueControl(ln0, name, datSet) {
9
+ const uniqueName = name
10
+ ? !ln0.querySelector(`:scope > SampledValueControl[name="${name}"]`)
11
+ : true;
12
+ const validDataSet = datSet
13
+ ? !!ln0.querySelector(`:scope > DataSet[name="${datSet}"]`)
14
+ : true;
15
+ return !(uniqueName && validDataSet && canAddSampledValueControl(ln0));
16
+ }
17
+ /** Utility function to create schema valid `SampledValueControl` and `SMV` elements
18
+ * @parent Parent element such as `LN0`, `LDevice`, `AccessPoint` and `IED`
19
+ * @options Configuration for SampledValueControl/SMV element
20
+ * @returns Edit inserting new `SampledValueControl` to [[`parent`]] element and when possible
21
+ * `SMV` to connected `ConnectedAP`
22
+ * */
23
+ export function createSampledValueControl(parent, options = {
24
+ smvControl: {},
25
+ smv: {},
26
+ }) {
27
+ const ln0 = parent.tagName === "LN0" ? parent : parent.querySelector("LN0");
28
+ if (!ln0)
29
+ return [];
30
+ const name = options.smvControl?.name;
31
+ const datSet = options.smvControl?.datSet;
32
+ if (!options.skipCheck && invalidSampledValueControl(ln0, name, datSet))
33
+ return [];
34
+ const attributes = { ...options.smvControl };
35
+ const cbName = name ? name : uniqueElementName(ln0, "SampledValueControl");
36
+ if (!options.smvControl?.name)
37
+ attributes.name = cbName;
38
+ if (!options.smvControl?.multicast)
39
+ attributes.multicast = "true";
40
+ if (!options.smvControl?.smpRate)
41
+ attributes.smpRate = "80";
42
+ if (!options.smvControl?.nofASDU)
43
+ attributes.nofASDU = "1";
44
+ if (!options.smvControl?.smpMod)
45
+ attributes.smpMod = "SmpPerPeriod";
46
+ if (!options.smvControl?.smvID)
47
+ attributes.smvID = pathId(ln0, cbName);
48
+ const generatedConfRev = options.smvControl?.datSet ? "1" : "0";
49
+ const userConfRev = options.smvControl?.confRev;
50
+ attributes.confRev = userConfRev ? userConfRev : generatedConfRev;
51
+ const smvControl = createElement(ln0.ownerDocument, "SampledValueControl", attributes);
52
+ const smvOpts = createElement(ln0.ownerDocument, "SmvOpts", options.smvOpts ?? {});
53
+ smvControl.appendChild(smvOpts);
54
+ const edits = [];
55
+ edits.push({
56
+ parent: ln0,
57
+ node: smvControl,
58
+ reference: getReference(ln0, "SampledValueControl"),
59
+ });
60
+ const connAp = connectedAp(ln0, options.smv?.apName);
61
+ if (!connAp)
62
+ return edits;
63
+ const ldInst = ln0.closest("LDevice").getAttribute("inst");
64
+ if (!ldInst || !cbName)
65
+ return edits;
66
+ const smvCreateOptions = options.smv ?? {};
67
+ delete smvCreateOptions.apName;
68
+ const smvAttrs = { ldInst, cbName };
69
+ const smvEdit = createSMV(connAp, smvAttrs, smvCreateOptions);
70
+ if (smvEdit)
71
+ edits.push(smvEdit);
72
+ return edits;
73
+ }
74
+ //# sourceMappingURL=createSampledValueControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSampledValueControl.js","sourceRoot":"","sources":["../../tSampledValueControl/createSampledValueControl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Insert, Remove, SetAttributes } from "@openscd/oscd-api";
2
+ /**
3
+ * Utility function to update SampledValueControl element attributes.
4
+ * ```md
5
+ * These attributes trigger additional edits such as
6
+ * - name: also updates SMV.cbName and supervision references
7
+ * - datSet: update reference DataSet.name - when DataSet is single use
8
+ *
9
+ * >NOTE: confRev attribute is updated +10000 on each data set change
10
+ * ```
11
+ * @param setAttributes - diff holding the `SampledValueControl` as element
12
+ * @returns action array to update all `SampledValueControl` attributes
13
+ */
14
+ export declare function updateSampledValueControl(setAttributes: SetAttributes): (SetAttributes | Remove | Insert)[];
@@ -0,0 +1,60 @@
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 SampledValueControl element attributes.
8
+ * ```md
9
+ * These attributes trigger additional edits such as
10
+ * - name: also updates SMV.cbName and supervision references
11
+ * - datSet: update reference DataSet.name - when DataSet is single use
12
+ *
13
+ * >NOTE: confRev attribute is updated +10000 on each data set change
14
+ * ```
15
+ * @param setAttributes - diff holding the `SampledValueControl` as element
16
+ * @returns action array to update all `SampledValueControl` attributes
17
+ */
18
+ export function updateSampledValueControl(setAttributes) {
19
+ if (setAttributes.element.tagName !== "SampledValueControl")
20
+ return [];
21
+ const updates = [];
22
+ if (setAttributes.attributes?.name) {
23
+ const extRefUpdates = findControlBlockSubscription(setAttributes.element).map((extRef) => ({
24
+ element: extRef,
25
+ attributes: { srcCBName: setAttributes.attributes.name },
26
+ }));
27
+ const supervisionUpdates = Array.from(setAttributes.element.ownerDocument.querySelectorAll(':root > IED > AccessPoint > Server > LDevice > LN[lnClass="LSVS"] > DOI[name="SvCBRef"] > DAI[name="setSrcRef"] > Val'))
28
+ .filter((val) => val.textContent === controlBlockObjRef(setAttributes.element))
29
+ .flatMap((val) => {
30
+ const [path] = controlBlockObjRef(setAttributes.element).split(".");
31
+ const oldValContent = Array.from(val.childNodes).find((node) => node.nodeType === Node.TEXT_NODE);
32
+ const newValContent = setAttributes.element.ownerDocument.createTextNode(`${path}.${setAttributes.attributes.name}`);
33
+ return [
34
+ { node: oldValContent },
35
+ { parent: val, node: newValContent, reference: null },
36
+ ];
37
+ });
38
+ const smvUpdate = [];
39
+ const sMV = controlBlockGseOrSmv(setAttributes.element);
40
+ if (sMV) {
41
+ smvUpdate.push({
42
+ element: sMV,
43
+ attributes: { cbName: setAttributes.attributes.name },
44
+ });
45
+ }
46
+ updates.push(...extRefUpdates, ...supervisionUpdates, ...smvUpdate);
47
+ }
48
+ if (setAttributes.attributes.datSet) {
49
+ const updateDataSet = updateDatSet(setAttributes);
50
+ if (updateDataSet)
51
+ updates.push(updateDataSet);
52
+ // remove datSet from the update to avoid schema invalidity
53
+ else
54
+ delete setAttributes.attributes.datSet;
55
+ // +10000 for update
56
+ setAttributes.attributes.confRev = updatedConfRev(setAttributes.element);
57
+ }
58
+ return [setAttributes, ...updates];
59
+ }
60
+ //# sourceMappingURL=updateSampledValueControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateSampledValueControl.js","sourceRoot":"","sources":["../../tSampledValueControl/updateSampledValueControl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Retrieve the maximum allowed `ReportControl` elements acc. to the
2
+ * `Services` section of the `AccessPoint` or `IED`. -1 indicates no definition
3
+ * of maximum `ReportControl` in the `IED`.
4
+ * @param parent - SCL element within the `IED` or `AccessPoint`
5
+ * @returns `{max, maxBuf} attributes of `ConfReportControl` */
6
+ export declare function maxReportControl(parent: Element): {
7
+ max: number;
8
+ maxBuf: number;
9
+ };
@@ -0,0 +1,14 @@
1
+ /** Retrieve the maximum allowed `ReportControl` elements acc. to the
2
+ * `Services` section of the `AccessPoint` or `IED`. -1 indicates no definition
3
+ * of maximum `ReportControl` in the `IED`.
4
+ * @param parent - SCL element within the `IED` or `AccessPoint`
5
+ * @returns `{max, maxBuf} attributes of `ConfReportControl` */
6
+ export function maxReportControl(parent) {
7
+ const selector = `:scope > Services > ConfReportControl`;
8
+ const [bothMax, bothMaxBuf] = ["max", "maxBuf"].map((attr) => {
9
+ return ["IED", "AccessPoint"].map((root) => parseInt(parent.closest(root)?.querySelector(selector)?.getAttribute(attr) ??
10
+ "-1", 10));
11
+ });
12
+ return { max: Math.max(...bothMax), maxBuf: Math.max(...bothMaxBuf) };
13
+ }
14
+ //# sourceMappingURL=maxReportControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maxReportControl.js","sourceRoot":"","sources":["../../../tServices/tConfReportControl/maxReportControl.ts"],"names":[],"mappings":"AAAA;;;;iEAIiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAI9C,MAAM,QAAQ,GAAG,uCAAuC,CAAC;IAEzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3D,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACzC,QAAQ,CACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC;YAC/D,IAAI,EACN,EAAE,CACH,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Remove } from "@openscd/oscd-api";
2
+ /** Updates remove edit for process type element
3
+ * includes orphan Terminal's and orphan ConnectivityNode's
4
+ * > NOTE: Process type element potentially hold `ConnectivityNode` and
5
+ * > `Terminal`. Removing those can leave orphan elements
6
+ * @param remove - remove edit on precess level elements
7
+ * @return - enriched remove edit array
8
+ */
9
+ export declare function removeProcessElement(remove: Remove): Remove[];
@@ -0,0 +1,50 @@
1
+ function isBusBasCNode(cNode) {
2
+ return cNode.parentElement?.children.length === 1;
3
+ }
4
+ function existOtherTerminalConnection(cNode, terminal) {
5
+ return !!Array.from(cNode.ownerDocument.querySelectorAll(`Terminal[connectivityNode="${cNode.getAttribute("pathName")}"]`)).filter((otherTerminal) => otherTerminal !== terminal).length;
6
+ }
7
+ function cNodesPerTerminal(terminal) {
8
+ return Array.from(terminal.ownerDocument.querySelectorAll(`ConnectivityNode[pathName="${terminal.getAttribute("connectivityNode")}"]`));
9
+ }
10
+ function terminalPerCNode(cNode) {
11
+ return Array.from(cNode.ownerDocument.querySelectorAll(`Terminal[connectivityNode="${cNode.getAttribute("pathName")}"]`));
12
+ }
13
+ function outOfScopeTerminal(root, terminal) {
14
+ return !Array.from(root.querySelectorAll("Terminal")).find((ancestorTerminal) => ancestorTerminal === terminal);
15
+ }
16
+ function outOfScopeCNode(root, cNode) {
17
+ return !Array.from(root.querySelectorAll("ConnectivityNode")).find((ancestorCNode) => ancestorCNode === cNode);
18
+ }
19
+ /** Updates remove edit for process type element
20
+ * includes orphan Terminal's and orphan ConnectivityNode's
21
+ * > NOTE: Process type element potentially hold `ConnectivityNode` and
22
+ * > `Terminal`. Removing those can leave orphan elements
23
+ * @param remove - remove edit on precess level elements
24
+ * @return - enriched remove edit array
25
+ */
26
+ export function removeProcessElement(remove) {
27
+ const element = remove.node;
28
+ const cNodes = Array.from(element.querySelectorAll("ConnectivityNode"));
29
+ const removeTerminals = cNodes.flatMap((cNode) => {
30
+ return terminalPerCNode(cNode)
31
+ .filter((terminal) => outOfScopeTerminal(element, terminal))
32
+ .map((terminal) => {
33
+ return {
34
+ node: terminal,
35
+ };
36
+ });
37
+ });
38
+ const terminals = Array.from(element.querySelectorAll("Terminal"));
39
+ const removeCNodes = terminals.flatMap((terminal) => {
40
+ return cNodesPerTerminal(terminal)
41
+ .filter((cNode) => outOfScopeCNode(element, cNode))
42
+ .filter((cNode) => existOtherTerminalConnection(cNode, terminal))
43
+ .filter((cNode) => !isBusBasCNode(cNode))
44
+ .map((cNode) => {
45
+ return { node: cNode };
46
+ });
47
+ });
48
+ return [remove, ...removeTerminals, ...removeCNodes];
49
+ }
50
+ //# sourceMappingURL=removeProcessElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeProcessElement.js","sourceRoot":"","sources":["../../tSubstation/removeProcessElement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Remove } from "@openscd/oscd-api";
2
+ /**
3
+ * Removes LNode children DOS, SDS or DAS when missing in the corresponding data type LNodeType
4
+ * @param lNodeType the data structure for the LNode instance
5
+ * @param targetDoc the target XML document where the LNode instance is located
6
+ * @returns an array of Remove edits for the missing elements
7
+ */
8
+ export declare function updateLnType(lNodeType: Element, targetDoc: XMLDocument): Remove[];
@@ -0,0 +1,96 @@
1
+ function getDataType(data) {
2
+ const dataTypeTemplates = data.closest("DataTypeTemplates");
3
+ if (!dataTypeTemplates)
4
+ return null;
5
+ const type = data.getAttribute("type");
6
+ return dataTypeTemplates.querySelector(`DAType[id="${type}"], DOType[id="${type}"]`);
7
+ }
8
+ function removeMissingSdsOrDas(dataType, dosOrSds) {
9
+ const removes = [];
10
+ dosOrSds.querySelectorAll(":scope > SDS, :scope > DAS").forEach((sdsOrDas) => {
11
+ const name = sdsOrDas.getAttribute("name");
12
+ const childData = dataType.querySelector(`:scope > DA[name="${name}"], :scope > BDA[name="${name}"], :scope > SDO[name="${name}"]`);
13
+ if (!childData)
14
+ removes.push({ node: sdsOrDas });
15
+ else {
16
+ const childDataType = getDataType(childData);
17
+ if (childDataType)
18
+ removes.push(...removeMissingSdsOrDas(childDataType, sdsOrDas));
19
+ }
20
+ });
21
+ return removes;
22
+ }
23
+ function removeMissingDos(lNodeType, lNode) {
24
+ const removes = [];
25
+ lNode.querySelectorAll(":scope > Private > DOS").forEach((dos) => {
26
+ const doElement = lNodeType.querySelector(`:scope > DO[name="${dos.getAttribute("name")}"]`);
27
+ if (!doElement)
28
+ removes.push({ node: dos });
29
+ else {
30
+ const dataType = getDataType(doElement);
31
+ if (dataType)
32
+ removes.push(...removeMissingSdsOrDas(dataType, dos));
33
+ }
34
+ });
35
+ return removes;
36
+ }
37
+ function lNodeReference(lNode) {
38
+ let reference = "";
39
+ const lNodeTag = `${lNode.getAttribute("prefix") || ""}${lNode.getAttribute("lnClass") || ""}${lNode.getAttribute("lnInst") || ""}`;
40
+ reference = lNodeTag;
41
+ let child = lNode;
42
+ while (child.parentElement !== null) {
43
+ if (child.parentElement.tagName === "SCL")
44
+ break;
45
+ const name = child.parentElement.getAttribute("name");
46
+ // refix the name to the existing prefix seperated by /
47
+ if (name)
48
+ reference = `${name}/${reference}`;
49
+ child = child.parentElement;
50
+ }
51
+ return reference;
52
+ }
53
+ function invalidPath(path, dataType, index = 0) {
54
+ const dataName = path[index];
55
+ const doElement = dataType.querySelector(`:scope > DO[name="${dataName}"], :scope > SDO[name="${dataName}"], :scope > DA[name="${dataName}"], :scope > BDA[name="${dataName}"]`);
56
+ if (!doElement)
57
+ return true;
58
+ const childDataType = getDataType(doElement);
59
+ if (!childDataType)
60
+ return false;
61
+ if (index + 1 < path.length)
62
+ return invalidPath(path, childDataType, index + 1);
63
+ return false;
64
+ }
65
+ function removeInvalidSourceRef(lNodeType, lNode) {
66
+ const removes = [];
67
+ const lNodeRef = lNodeReference(lNode);
68
+ const srcRefs = Array.from(lNode.ownerDocument.querySelectorAll(":root Private SourceRef")).filter(srcRef => srcRef.getAttribute("source")?.startsWith(lNodeRef));
69
+ srcRefs.forEach((srcRef) => {
70
+ // source without the starting lNodeRef
71
+ const srcRefPath = srcRef.getAttribute("source").substring(lNodeRef.length + 1);
72
+ const path = srcRefPath.split('.');
73
+ if (invalidPath(path, lNodeType))
74
+ removes.push({ node: srcRef });
75
+ });
76
+ return removes;
77
+ }
78
+ /**
79
+ * Removes LNode children DOS, SDS or DAS when missing in the corresponding data type LNodeType
80
+ * @param lNodeType the data structure for the LNode instance
81
+ * @param targetDoc the target XML document where the LNode instance is located
82
+ * @returns an array of Remove edits for the missing elements
83
+ */
84
+ export function updateLnType(lNodeType, targetDoc) {
85
+ // find all LNode instances in targetDoc with the same lnType
86
+ const lnType = lNodeType.getAttribute("id");
87
+ const lNodes = Array.from(targetDoc.querySelectorAll(`:root > Substation LNode[lnType="${lnType}"], :root > Substation > LNode[lnType="${lnType}"]`));
88
+ if (lNodes.length === 0)
89
+ return [];
90
+ // for each LNode instance remove missing DOS, SDS or DAS
91
+ const removeInstanceData = lNodes.flatMap((lNode) => removeMissingDos(lNodeType, lNode));
92
+ // remove SourceRef when reference is invalid
93
+ const removeSrcRef = lNodes.flatMap(lNode => removeInvalidSourceRef(lNodeType, lNode));
94
+ return [...removeInstanceData, ...removeSrcRef];
95
+ }
96
+ //# sourceMappingURL=updateLnType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateLnType.js","sourceRoot":"","sources":["../../tSubstation/updateLnType.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { SetAttributes } from "@openscd/oscd-api";
2
+ /** Updates `Substation` attributes and cross-referenced elements
3
+ * @param update - update edit on `Substation` attributes
4
+ * @returns Completed update edit array */
5
+ export declare function updateSubstation(update: SetAttributes): SetAttributes[];
@@ -0,0 +1,75 @@
1
+ function updateSourceRef(element, { oldSubstation, newSubstation, }) {
2
+ const sourceRefs = Array.from(element.ownerDocument.querySelectorAll('Private[type="eIEC61850-6-100"]>LNodeInputs>SourceRef'));
3
+ const updates = [];
4
+ sourceRefs.forEach((srcRef) => {
5
+ const source = srcRef.getAttribute("source");
6
+ if (!source)
7
+ return;
8
+ const oldPath = `${oldSubstation}`;
9
+ if (!source.startsWith(oldPath))
10
+ return;
11
+ const newPath = `${newSubstation}`;
12
+ updates.push({
13
+ element: srcRef,
14
+ attributes: { source: source.replace(oldPath, newPath) },
15
+ });
16
+ });
17
+ return updates.filter((update) => update);
18
+ }
19
+ function updateConnectivityNodes(substation, substationName) {
20
+ const cNodes = Array.from(substation.getElementsByTagName("ConnectivityNode"));
21
+ const updates = [];
22
+ cNodes.forEach((cNode) => {
23
+ const cNodeName = cNode.getAttribute("name");
24
+ const bayName = cNode.parentElement?.getAttribute("name");
25
+ const voltageLevelName = cNode.parentElement?.parentElement?.getAttribute("name");
26
+ if (!cNodeName || !bayName || !voltageLevelName)
27
+ return;
28
+ const connectivityNode = `${substationName}/${voltageLevelName}/${bayName}/${cNodeName}`;
29
+ updates.push({
30
+ element: cNode,
31
+ attributes: { pathName: connectivityNode },
32
+ });
33
+ const oldConnectivityNode = cNode.getAttribute("pathName");
34
+ if (!oldConnectivityNode)
35
+ return;
36
+ updates.push(...updateTerminals(substation, {
37
+ oldConnectivityNode,
38
+ connectivityNode,
39
+ substationName,
40
+ }));
41
+ });
42
+ return updates.filter((update) => update);
43
+ }
44
+ function updateTerminals(element, { oldConnectivityNode, connectivityNode, substationName, }) {
45
+ const terminals = Array.from(element.closest("Substation").querySelectorAll(`Terminal[connectivityNode="${oldConnectivityNode}"],
46
+ NeutralPoint[connectivityNode="${oldConnectivityNode}"]`));
47
+ const updates = terminals.map((terminal) => ({
48
+ element: terminal,
49
+ attributes: {
50
+ connectivityNode,
51
+ substationName,
52
+ },
53
+ }));
54
+ return updates;
55
+ }
56
+ /** Updates `Substation` attributes and cross-referenced elements
57
+ * @param update - update edit on `Substation` attributes
58
+ * @returns Completed update edit array */
59
+ export function updateSubstation(update) {
60
+ if (update.element.tagName !== "Substation")
61
+ return [update];
62
+ const substation = update.element;
63
+ const attributes = update.attributes;
64
+ if (!attributes?.name)
65
+ return [update];
66
+ const oldName = substation.getAttribute("name");
67
+ const newName = attributes.name;
68
+ if (!oldName || oldName === newName)
69
+ return [update];
70
+ return [update].concat(...updateConnectivityNodes(substation, newName), ...updateSourceRef(substation, {
71
+ oldSubstation: oldName,
72
+ newSubstation: newName,
73
+ }));
74
+ }
75
+ //# sourceMappingURL=updateSubstation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateSubstation.js","sourceRoot":"","sources":["../../tSubstation/updateSubstation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { SetAttributes } from "@openscd/oscd-api";
2
+ /** Updates `VoltageLevel` attributes and cross-referenced elements
3
+ * @param setAttributes - update edit on `VoltageLevel` attributes
4
+ * @returns Completed update edit array */
5
+ export declare function updateVoltageLevel(setAttributes: SetAttributes): SetAttributes[];
@@ -0,0 +1,83 @@
1
+ function updateSourceRef(element, { oldSubstation, oldVoltageLevel, newVoltageLevel, }) {
2
+ const sourceRefs = Array.from(element.ownerDocument.querySelectorAll('Private[type="eIEC61850-6-100"]>LNodeInputs>SourceRef'));
3
+ const updates = [];
4
+ sourceRefs.forEach((srcRef) => {
5
+ const source = srcRef.getAttribute("source");
6
+ if (!source)
7
+ return;
8
+ const oldPath = `${oldSubstation}/${oldVoltageLevel}`;
9
+ if (!source.startsWith(oldPath))
10
+ return;
11
+ const newPath = `${oldSubstation}/${newVoltageLevel}`;
12
+ updates.push({
13
+ element: srcRef,
14
+ attributes: { source: source.replace(oldPath, newPath) },
15
+ });
16
+ });
17
+ return updates.filter((update) => update);
18
+ }
19
+ function updateConnectivityNodes(element, { substation, voltageLevelName, }) {
20
+ const cNodes = Array.from(element.getElementsByTagName("ConnectivityNode"));
21
+ const updates = [];
22
+ cNodes.forEach((cNode) => {
23
+ const cNodeName = cNode.getAttribute("name");
24
+ const bayName = cNode.parentElement?.getAttribute("name");
25
+ if (!cNodeName || !bayName)
26
+ return;
27
+ const connectivityNode = `${substation}/${voltageLevelName}/${bayName}/${cNodeName}`;
28
+ updates.push({
29
+ element: cNode,
30
+ attributes: { pathName: connectivityNode },
31
+ });
32
+ const oldConnectivityNode = cNode.getAttribute("pathName");
33
+ if (!oldConnectivityNode)
34
+ return;
35
+ updates.push(...updateTerminals(element, {
36
+ oldConnectivityNode,
37
+ connectivityNode,
38
+ voltageLevelName,
39
+ }));
40
+ });
41
+ return updates;
42
+ }
43
+ function updateTerminals(element, { oldConnectivityNode, connectivityNode, voltageLevelName, }) {
44
+ const terminals = Array.from(element.closest("Substation").querySelectorAll(`Terminal[connectivityNode="${oldConnectivityNode}"],
45
+ NeutralPoint[connectivityNode="${oldConnectivityNode}"]`));
46
+ const updates = terminals.map((terminal) => {
47
+ return {
48
+ element: terminal,
49
+ attributes: {
50
+ connectivityNode,
51
+ voltageLevelName,
52
+ },
53
+ };
54
+ });
55
+ return updates;
56
+ }
57
+ /** Updates `VoltageLevel` attributes and cross-referenced elements
58
+ * @param setAttributes - update edit on `VoltageLevel` attributes
59
+ * @returns Completed update edit array */
60
+ export function updateVoltageLevel(setAttributes) {
61
+ if (setAttributes.element.tagName !== "VoltageLevel")
62
+ return [setAttributes];
63
+ const voltageLevel = setAttributes.element;
64
+ const attributes = setAttributes.attributes;
65
+ if (!attributes?.name)
66
+ return [setAttributes];
67
+ const oldName = voltageLevel.getAttribute("name");
68
+ const substationName = voltageLevel
69
+ .closest("Substation")
70
+ ?.getAttribute("name");
71
+ const newName = attributes.name;
72
+ if (!substationName || !oldName || oldName === newName)
73
+ return [setAttributes];
74
+ return [setAttributes].concat(...updateConnectivityNodes(voltageLevel, {
75
+ substation: substationName,
76
+ voltageLevelName: newName,
77
+ }), ...updateSourceRef(voltageLevel, {
78
+ oldSubstation: substationName,
79
+ oldVoltageLevel: oldName,
80
+ newVoltageLevel: newName,
81
+ }));
82
+ }
83
+ //# sourceMappingURL=updateVoltageLevel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateVoltageLevel.js","sourceRoot":"","sources":["../../tVoltageLevel/updateVoltageLevel.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@openscd/scl-lib",
3
+ "description": "Function library supporting SCL editing",
4
+ "license": "Apache-2.0",
5
+ "author": "Jakob Vogelsang",
6
+ "version": "2.0.0",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "files": [
11
+ "/dist/"
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/openscd/scl-lib.git"
16
+ },
17
+ "scripts": {
18
+ "lint": "eslint --ext .ts,.html . --ignore-path .gitignore && prettier \"**/*.ts\" --check --ignore-path .gitignore",
19
+ "format": "eslint --ext .ts,.html . --fix --ignore-path .gitignore && prettier \"**/*.ts\" --write --ignore-path .gitignore",
20
+ "test": "wtr --coverage",
21
+ "test:watch": "wtr --watch --coverage",
22
+ "doc": "npx rimraf doc && typedoc --out doc index.ts",
23
+ "deploy": "npm run doc && gh-pages --dist 'doc'",
24
+ "build": "npx rimraf dist && tsc"
25
+ },
26
+ "dependencies": {
27
+ "@openscd/oscd-api": "0.1.5"
28
+ },
29
+ "devDependencies": {
30
+ "@types/mocha": "^10.0.1",
31
+ "@typescript-eslint/eslint-plugin": "^5.59.5",
32
+ "@typescript-eslint/parser": "^5.59.5",
33
+ "@web/dev-server-esbuild": "^1.0.4",
34
+ "@web/test-runner": "^0.20.2",
35
+ "chai": "npm:@esm-bundle/chai@^4.3.4-fix.0",
36
+ "concurrently": "^8.0.1",
37
+ "eslint": "^8.40.0",
38
+ "gh-pages": "^5.0.0",
39
+ "prettier": "^3.1.0",
40
+ "typedoc": "^0.24.7",
41
+ "typescript": "^5.0.4"
42
+ }
43
+ }