@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.
- package/LICENCE +201 -0
- package/README.md +20 -0
- package/dist/foundation/codecomponents/nsds.d.ts +5 -0
- package/dist/foundation/codecomponents/nsds.js +22435 -0
- package/dist/foundation/codecomponents/nsds.js.map +1 -0
- package/dist/foundation/nsd.json +137748 -0
- package/dist/foundation/uniqueElementName.d.ts +2 -0
- package/dist/foundation/uniqueElementName.js +18 -0
- package/dist/foundation/uniqueElementName.js.map +1 -0
- package/dist/foundation/utils.d.ts +20 -0
- package/dist/foundation/utils.js +14 -0
- package/dist/foundation/utils.js.map +1 -0
- package/dist/generator/appIdGenerator.d.ts +21 -0
- package/dist/generator/appIdGenerator.js +53 -0
- package/dist/generator/appIdGenerator.js.map +1 -0
- package/dist/generator/lnInstGenerator.d.ts +16 -0
- package/dist/generator/lnInstGenerator.js +41 -0
- package/dist/generator/lnInstGenerator.js.map +1 -0
- package/dist/generator/macAddressGenerator.d.ts +14 -0
- package/dist/generator/macAddressGenerator.js +39 -0
- package/dist/generator/macAddressGenerator.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/tAddress/changeGseOrSmvAddress.d.ts +14 -0
- package/dist/tAddress/changeGseOrSmvAddress.js +43 -0
- package/dist/tAddress/changeGseOrSmvAddress.js.map +1 -0
- package/dist/tBaseElement/find.d.ts +6 -0
- package/dist/tBaseElement/find.js +529 -0
- package/dist/tBaseElement/find.js.map +1 -0
- package/dist/tBaseElement/getChildren.d.ts +5 -0
- package/dist/tBaseElement/getChildren.js +12 -0
- package/dist/tBaseElement/getChildren.js.map +1 -0
- package/dist/tBaseElement/getReference.d.ts +9 -0
- package/dist/tBaseElement/getReference.js +31 -0
- package/dist/tBaseElement/getReference.js.map +1 -0
- package/dist/tBaseElement/identity.d.ts +2 -0
- package/dist/tBaseElement/identity.js +566 -0
- package/dist/tBaseElement/identity.js.map +1 -0
- package/dist/tBaseElement/isPublic.d.ts +2 -0
- package/dist/tBaseElement/isPublic.js +5 -0
- package/dist/tBaseElement/isPublic.js.map +1 -0
- package/dist/tBaseElement/parentTags.d.ts +3 -0
- package/dist/tBaseElement/parentTags.js +8 -0
- package/dist/tBaseElement/parentTags.js.map +1 -0
- package/dist/tBaseElement/tags.d.ts +8 -0
- package/dist/tBaseElement/tags.js +807 -0
- package/dist/tBaseElement/tags.js.map +1 -0
- package/dist/tBay/updateBay.d.ts +5 -0
- package/dist/tBay/updateBay.js +81 -0
- package/dist/tBay/updateBay.js.map +1 -0
- package/dist/tControl/controlBlockGseOrSmv.d.ts +7 -0
- package/dist/tControl/controlBlockGseOrSmv.js +26 -0
- package/dist/tControl/controlBlockGseOrSmv.js.map +1 -0
- package/dist/tControl/controlBlockObjRef.d.ts +2 -0
- package/dist/tControl/controlBlockObjRef.js +14 -0
- package/dist/tControl/controlBlockObjRef.js.map +1 -0
- package/dist/tControl/controlBlocks.d.ts +2 -0
- package/dist/tControl/controlBlocks.js +9 -0
- package/dist/tControl/controlBlocks.js.map +1 -0
- package/dist/tControl/findControlSubscription.d.ts +2 -0
- package/dist/tControl/findControlSubscription.js +8 -0
- package/dist/tControl/findControlSubscription.js.map +1 -0
- package/dist/tControl/pathId.d.ts +1 -0
- package/dist/tControl/pathId.js +9 -0
- package/dist/tControl/pathId.js.map +1 -0
- package/dist/tControl/removeControlBlock.d.ts +14 -0
- package/dist/tControl/removeControlBlock.js +35 -0
- package/dist/tControl/removeControlBlock.js.map +1 -0
- package/dist/tControl/updateConfRev.d.ts +2 -0
- package/dist/tControl/updateConfRev.js +8 -0
- package/dist/tControl/updateConfRev.js.map +1 -0
- package/dist/tControl/updateDatSet.d.ts +6 -0
- package/dist/tControl/updateDatSet.js +22 -0
- package/dist/tControl/updateDatSet.js.map +1 -0
- package/dist/tControlWithIEDName/connctedAp.d.ts +2 -0
- package/dist/tControlWithIEDName/connctedAp.js +7 -0
- package/dist/tControlWithIEDName/connctedAp.js.map +1 -0
- package/dist/tDataSet/canAddDataSet.d.ts +4 -0
- package/dist/tDataSet/canAddDataSet.js +44 -0
- package/dist/tDataSet/canAddDataSet.js.map +1 -0
- package/dist/tDataSet/createDataSet.d.ts +9 -0
- package/dist/tDataSet/createDataSet.js +33 -0
- package/dist/tDataSet/createDataSet.js.map +1 -0
- package/dist/tDataSet/removeDataSet.d.ts +10 -0
- package/dist/tDataSet/removeDataSet.js +27 -0
- package/dist/tDataSet/removeDataSet.js.map +1 -0
- package/dist/tDataSet/updateDataSet.d.ts +7 -0
- package/dist/tDataSet/updateDataSet.js +28 -0
- package/dist/tDataSet/updateDataSet.js.map +1 -0
- package/dist/tDataTypeTemplates/foundation.d.ts +2 -0
- package/dist/tDataTypeTemplates/foundation.js +118 -0
- package/dist/tDataTypeTemplates/foundation.js.map +1 -0
- package/dist/tDataTypeTemplates/importLNodeType.d.ts +13 -0
- package/dist/tDataTypeTemplates/importLNodeType.js +88 -0
- package/dist/tDataTypeTemplates/importLNodeType.js.map +1 -0
- package/dist/tDataTypeTemplates/insertSelectedLNodeType.d.ts +20 -0
- package/dist/tDataTypeTemplates/insertSelectedLNodeType.js +187 -0
- package/dist/tDataTypeTemplates/insertSelectedLNodeType.js.map +1 -0
- package/dist/tDataTypeTemplates/lNodeTypeToSelection.d.ts +8 -0
- package/dist/tDataTypeTemplates/lNodeTypeToSelection.js +67 -0
- package/dist/tDataTypeTemplates/lNodeTypeToSelection.js.map +1 -0
- package/dist/tDataTypeTemplates/nsdToJson.d.ts +101 -0
- package/dist/tDataTypeTemplates/nsdToJson.js +433 -0
- package/dist/tDataTypeTemplates/nsdToJson.js.map +1 -0
- package/dist/tDataTypeTemplates/removeDataType.d.ts +12 -0
- package/dist/tDataTypeTemplates/removeDataType.js +62 -0
- package/dist/tDataTypeTemplates/removeDataType.js.map +1 -0
- package/dist/tDataTypeTemplates/updateLNodeType.d.ts +2 -0
- package/dist/tDataTypeTemplates/updateLNodeType.js +22 -0
- package/dist/tDataTypeTemplates/updateLNodeType.js.map +1 -0
- package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.d.ts +16 -0
- package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.js +52 -0
- package/dist/tExtRef/doesFcdaMeetExtRefRestrictions.js.map +1 -0
- package/dist/tExtRef/extRefTypeRestrictions.d.ts +17 -0
- package/dist/tExtRef/extRefTypeRestrictions.js +32 -0
- package/dist/tExtRef/extRefTypeRestrictions.js.map +1 -0
- package/dist/tExtRef/isSubscribed.d.ts +7 -0
- package/dist/tExtRef/isSubscribed.js +23 -0
- package/dist/tExtRef/isSubscribed.js.map +1 -0
- package/dist/tExtRef/matchDataAttributes.d.ts +2 -0
- package/dist/tExtRef/matchDataAttributes.js +13 -0
- package/dist/tExtRef/matchDataAttributes.js.map +1 -0
- package/dist/tExtRef/matchSrcAttributes.d.ts +2 -0
- package/dist/tExtRef/matchSrcAttributes.js +28 -0
- package/dist/tExtRef/matchSrcAttributes.js.map +1 -0
- package/dist/tExtRef/sourceControlBlock.d.ts +8 -0
- package/dist/tExtRef/sourceControlBlock.js +52 -0
- package/dist/tExtRef/sourceControlBlock.js.map +1 -0
- package/dist/tExtRef/subscribe.d.ts +47 -0
- package/dist/tExtRef/subscribe.js +187 -0
- package/dist/tExtRef/subscribe.js.map +1 -0
- package/dist/tExtRef/unsubscribe.d.ts +27 -0
- package/dist/tExtRef/unsubscribe.js +55 -0
- package/dist/tExtRef/unsubscribe.js.map +1 -0
- package/dist/tFCDA/canAddFCDA.d.ts +10 -0
- package/dist/tFCDA/canAddFCDA.js +42 -0
- package/dist/tFCDA/canAddFCDA.js.map +1 -0
- package/dist/tFCDA/fcdaBaseTypes.d.ts +11 -0
- package/dist/tFCDA/fcdaBaseTypes.js +56 -0
- package/dist/tFCDA/fcdaBaseTypes.js.map +1 -0
- package/dist/tFCDA/removeFCDA.d.ts +8 -0
- package/dist/tFCDA/removeFCDA.js +33 -0
- package/dist/tFCDA/removeFCDA.js.map +1 -0
- package/dist/tGSE/changeGSEContent.d.ts +17 -0
- package/dist/tGSE/changeGSEContent.js +53 -0
- package/dist/tGSE/changeGSEContent.js.map +1 -0
- package/dist/tGSE/createGSE.d.ts +20 -0
- package/dist/tGSE/createGSE.js +44 -0
- package/dist/tGSE/createGSE.js.map +1 -0
- package/dist/tGSEControl/canAddGSEControl.d.ts +4 -0
- package/dist/tGSEControl/canAddGSEControl.js +27 -0
- package/dist/tGSEControl/canAddGSEControl.js.map +1 -0
- package/dist/tGSEControl/createGSEControl.d.ts +49 -0
- package/dist/tGSEControl/createGSEControl.js +65 -0
- package/dist/tGSEControl/createGSEControl.js.map +1 -0
- package/dist/tGSEControl/updateGSEControl.d.ts +15 -0
- package/dist/tGSEControl/updateGSEControl.js +61 -0
- package/dist/tGSEControl/updateGSEControl.js.map +1 -0
- package/dist/tIED/insertIED.d.ts +13 -0
- package/dist/tIED/insertIED.js +245 -0
- package/dist/tIED/insertIED.js.map +1 -0
- package/dist/tIED/removeIED.d.ts +14 -0
- package/dist/tIED/removeIED.js +70 -0
- package/dist/tIED/removeIED.js.map +1 -0
- package/dist/tIED/updateIED.d.ts +17 -0
- package/dist/tIED/updateIED.js +185 -0
- package/dist/tIED/updateIED.js.map +1 -0
- package/dist/tInputs/removeInputs.d.ts +7 -0
- package/dist/tInputs/removeInputs.js +25 -0
- package/dist/tInputs/removeInputs.js.map +1 -0
- package/dist/tLN/removeSubscriptionSupervision.d.ts +7 -0
- package/dist/tLN/removeSubscriptionSupervision.js +94 -0
- package/dist/tLN/removeSubscriptionSupervision.js.map +1 -0
- package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.d.ts +13 -0
- package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.js +116 -0
- package/dist/tLN/supervision/canInstantiateSubscriptionSupervision.js.map +1 -0
- package/dist/tLN/supervision/createSupervisionEdit.d.ts +20 -0
- package/dist/tLN/supervision/createSupervisionEdit.js +129 -0
- package/dist/tLN/supervision/createSupervisionEdit.js.map +1 -0
- package/dist/tLN/supervision/findControlBlockOnSrcAttributes.d.ts +10 -0
- package/dist/tLN/supervision/findControlBlockOnSrcAttributes.js +13 -0
- package/dist/tLN/supervision/findControlBlockOnSrcAttributes.js.map +1 -0
- package/dist/tLN/supervision/foundation.d.ts +37 -0
- package/dist/tLN/supervision/foundation.js +43 -0
- package/dist/tLN/supervision/foundation.js.map +1 -0
- package/dist/tLN/supervision/insertSubscriptionSupervisions.d.ts +11 -0
- package/dist/tLN/supervision/insertSubscriptionSupervisions.js +98 -0
- package/dist/tLN/supervision/insertSubscriptionSupervisions.js.map +1 -0
- package/dist/tLN/supervision/instantiateSubscriptionSupervision.d.ts +10 -0
- package/dist/tLN/supervision/instantiateSubscriptionSupervision.js +36 -0
- package/dist/tLN/supervision/instantiateSubscriptionSupervision.js.map +1 -0
- package/dist/tLN/supervision/removeSupervision.d.ts +7 -0
- package/dist/tLN/supervision/removeSupervision.js +39 -0
- package/dist/tLN/supervision/removeSupervision.js.map +1 -0
- package/dist/tReportControl/canAddReportControl.d.ts +11 -0
- package/dist/tReportControl/canAddReportControl.js +24 -0
- package/dist/tReportControl/canAddReportControl.js.map +1 -0
- package/dist/tReportControl/createReportControl.d.ts +68 -0
- package/dist/tReportControl/createReportControl.js +78 -0
- package/dist/tReportControl/createReportControl.js.map +1 -0
- package/dist/tReportControl/numberReportControlInstances.d.ts +5 -0
- package/dist/tReportControl/numberReportControlInstances.js +19 -0
- package/dist/tReportControl/numberReportControlInstances.js.map +1 -0
- package/dist/tReportControl/updateReportControl.d.ts +5 -0
- package/dist/tReportControl/updateReportControl.js +24 -0
- package/dist/tReportControl/updateReportControl.js.map +1 -0
- package/dist/tSMV/changeSMVContent.d.ts +3 -0
- package/dist/tSMV/changeSMVContent.js +5 -0
- package/dist/tSMV/changeSMVContent.js.map +1 -0
- package/dist/tSMV/createSMV.d.ts +16 -0
- package/dist/tSMV/createSMV.js +32 -0
- package/dist/tSMV/createSMV.js.map +1 -0
- package/dist/tSampledValueControl/canAddSampledValueControl.d.ts +4 -0
- package/dist/tSampledValueControl/canAddSampledValueControl.js +27 -0
- package/dist/tSampledValueControl/canAddSampledValueControl.js.map +1 -0
- package/dist/tSampledValueControl/createSampledValueControl.d.ts +66 -0
- package/dist/tSampledValueControl/createSampledValueControl.js +74 -0
- package/dist/tSampledValueControl/createSampledValueControl.js.map +1 -0
- package/dist/tSampledValueControl/updateSampledValueControl.d.ts +14 -0
- package/dist/tSampledValueControl/updateSampledValueControl.js +60 -0
- package/dist/tSampledValueControl/updateSampledValueControl.js.map +1 -0
- package/dist/tServices/tConfReportControl/maxReportControl.d.ts +9 -0
- package/dist/tServices/tConfReportControl/maxReportControl.js +14 -0
- package/dist/tServices/tConfReportControl/maxReportControl.js.map +1 -0
- package/dist/tSubstation/removeProcessElement.d.ts +9 -0
- package/dist/tSubstation/removeProcessElement.js +50 -0
- package/dist/tSubstation/removeProcessElement.js.map +1 -0
- package/dist/tSubstation/updateLnType.d.ts +8 -0
- package/dist/tSubstation/updateLnType.js +96 -0
- package/dist/tSubstation/updateLnType.js.map +1 -0
- package/dist/tSubstation/updateSubstation.d.ts +5 -0
- package/dist/tSubstation/updateSubstation.js +75 -0
- package/dist/tSubstation/updateSubstation.js.map +1 -0
- package/dist/tVoltageLevel/updateVoltageLevel.d.ts +5 -0
- package/dist/tVoltageLevel/updateVoltageLevel.js +83 -0
- package/dist/tVoltageLevel/updateVoltageLevel.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { createElement } from "../foundation/utils.js";
|
|
2
|
+
import { getReference } from "../tBaseElement/getReference.js";
|
|
3
|
+
/**
|
|
4
|
+
* Copies an SCL SubNetwork element but without its ConnectedAP children.
|
|
5
|
+
* @param subNetwork - SCL SubNetwork element.
|
|
6
|
+
* @returns cloned SubNetwork without Element children.
|
|
7
|
+
*/
|
|
8
|
+
function getNewSubNetwork(subNetwork) {
|
|
9
|
+
const newSubNetwork = subNetwork.cloneNode(true);
|
|
10
|
+
newSubNetwork.childNodes.forEach((childNode) => {
|
|
11
|
+
if (childNode.nodeType === Node.ELEMENT_NODE &&
|
|
12
|
+
childNode.nodeName === "ConnectedAP")
|
|
13
|
+
newSubNetwork.removeChild(childNode);
|
|
14
|
+
});
|
|
15
|
+
return newSubNetwork;
|
|
16
|
+
}
|
|
17
|
+
function addCommunicationElements(newIed, scl) {
|
|
18
|
+
const edits = [];
|
|
19
|
+
const existingCommunication = scl.querySelector(":root > Communication");
|
|
20
|
+
const communication = existingCommunication
|
|
21
|
+
? existingCommunication
|
|
22
|
+
: createElement(scl.ownerDocument, "Communication", {});
|
|
23
|
+
if (!existingCommunication)
|
|
24
|
+
edits.push({
|
|
25
|
+
parent: scl,
|
|
26
|
+
node: communication,
|
|
27
|
+
reference: getReference(scl, "Communication"),
|
|
28
|
+
});
|
|
29
|
+
const subNetworks = Array.from(newIed.ownerDocument.querySelectorAll(":root > Communication > SubNetwork")).filter((subNetwork) => subNetwork.querySelector(`:scope > ConnectedAP[iedName="${newIed.getAttribute("name")}"]`));
|
|
30
|
+
subNetworks.forEach((subNetwork) => {
|
|
31
|
+
const connectedAps = Array.from(subNetwork.querySelectorAll(`:scope > ConnectedAP[iedName="${newIed.getAttribute("name")}"]`));
|
|
32
|
+
const existingSubNetwork = communication.querySelector(`:root > Communication > SubNetwork[name="${subNetwork?.getAttribute("name")}"]`);
|
|
33
|
+
const usedSubNetwork = existingSubNetwork
|
|
34
|
+
? existingSubNetwork
|
|
35
|
+
: getNewSubNetwork(subNetwork);
|
|
36
|
+
if (!existingSubNetwork)
|
|
37
|
+
edits.push({
|
|
38
|
+
parent: communication,
|
|
39
|
+
node: usedSubNetwork,
|
|
40
|
+
reference: getReference(communication, "SubNetwork"),
|
|
41
|
+
});
|
|
42
|
+
connectedAps.forEach((connectedAp) => {
|
|
43
|
+
const iedName = newIed.getAttribute("name");
|
|
44
|
+
const apName = connectedAp.getAttribute("apName");
|
|
45
|
+
const existingConnectedAp = existingSubNetwork?.querySelector(`:scope > ConnectedAP[iedName="${iedName}"][apName="${apName}"]`);
|
|
46
|
+
if (!existingConnectedAp) {
|
|
47
|
+
const connectedAP = connectedAp.cloneNode(true);
|
|
48
|
+
edits.push({
|
|
49
|
+
parent: usedSubNetwork,
|
|
50
|
+
node: connectedAP,
|
|
51
|
+
reference: getReference(usedSubNetwork, "ConnectedAP"),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
return edits;
|
|
57
|
+
}
|
|
58
|
+
function isDataTypeConnectionToIed(dataType, newIed) {
|
|
59
|
+
const dataTypeTemplates = dataType.parentElement;
|
|
60
|
+
const id = dataType.getAttribute("id");
|
|
61
|
+
if (!dataTypeTemplates || !id)
|
|
62
|
+
return false;
|
|
63
|
+
if (dataType.tagName === "EnumType")
|
|
64
|
+
return Array.from(dataTypeTemplates.querySelectorAll(`DOType > DA[type="${id}"],DAType > BDA[type="${id}"]`)).some((typeChild) => isDataTypeConnectionToIed(typeChild.parentElement, newIed));
|
|
65
|
+
if (dataType.tagName === "DAType")
|
|
66
|
+
return Array.from(dataTypeTemplates.querySelectorAll(`DOType > DA[type="${id}"],DAType > BDA[type="${id}"]`)).some((typeChild) => isDataTypeConnectionToIed(typeChild.parentElement, newIed));
|
|
67
|
+
if (dataType.tagName === "DOType")
|
|
68
|
+
return Array.from(dataTypeTemplates.querySelectorAll(`LNodeType > DO[type="${id}"], DOType > SDO[type="${id}"]`)).some((typeChild) => isDataTypeConnectionToIed(typeChild.parentElement, newIed));
|
|
69
|
+
return Array.from(newIed.getElementsByTagName("LN0"))
|
|
70
|
+
.concat(Array.from(newIed.getElementsByTagName("LN")))
|
|
71
|
+
.some((anyLn) => anyLn.getAttribute("lnType") === id);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Generates a new DTT section id in case of a collision by adding a number in hex
|
|
75
|
+
* prefixed with an underscore to the existing id.
|
|
76
|
+
*
|
|
77
|
+
* @param existingId - Existing string for id attribute.
|
|
78
|
+
* @param existingLNodeType - Existing LNodeType for which a new ID is required.
|
|
79
|
+
* @param dataTypeTemplates - Existing Element of DTTs from the SCL file.
|
|
80
|
+
* @returns New string which is unique in the DTT section.
|
|
81
|
+
*/
|
|
82
|
+
function generateNewId(existingId, newIed, existingLNodeType, dataTypeTemplates) {
|
|
83
|
+
const iedName = newIed.getAttribute("name");
|
|
84
|
+
const tagType = existingLNodeType.tagName;
|
|
85
|
+
const duplicatesFound = function (counter) {
|
|
86
|
+
return !!dataTypeTemplates.querySelector(`${tagType}[id="${existingId}@${iedName}#${counter.toString(10)}"]`);
|
|
87
|
+
};
|
|
88
|
+
let counter = 1;
|
|
89
|
+
// 2,000 limit reasonable way to avoid infinite loop
|
|
90
|
+
while (duplicatesFound(counter) && counter < 2000) {
|
|
91
|
+
counter += 1;
|
|
92
|
+
}
|
|
93
|
+
return `${existingId}@${iedName}#${counter.toString(10)}`;
|
|
94
|
+
}
|
|
95
|
+
function addEnumType(newIed, newEnumType, oldDataTypeTemplates) {
|
|
96
|
+
if (!isDataTypeConnectionToIed(newEnumType, newIed))
|
|
97
|
+
return;
|
|
98
|
+
const existEnumType = oldDataTypeTemplates.querySelector(`EnumType[id="${newEnumType.getAttribute("id")}"]`);
|
|
99
|
+
if (existEnumType && newEnumType.isEqualNode(existEnumType))
|
|
100
|
+
return;
|
|
101
|
+
if (existEnumType) {
|
|
102
|
+
// There is an `id` conflict in the project that must be resolved by
|
|
103
|
+
// concatenating the IED name with the id
|
|
104
|
+
const data = newEnumType.parentElement;
|
|
105
|
+
const idOld = newEnumType.getAttribute("id");
|
|
106
|
+
const idNew = generateNewId(idOld, newIed, existEnumType, oldDataTypeTemplates);
|
|
107
|
+
newEnumType.setAttribute("id", idNew);
|
|
108
|
+
data
|
|
109
|
+
.querySelectorAll(`DOType > DA[type="${idOld}"],DAType > BDA[type="${idOld}"]`)
|
|
110
|
+
.forEach((type) => type.setAttribute("type", idNew));
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
parent: oldDataTypeTemplates,
|
|
114
|
+
node: newEnumType,
|
|
115
|
+
reference: getReference(oldDataTypeTemplates, "EnumType"),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function addDAType(newIed, newDAType, oldDataTypeTemplates) {
|
|
119
|
+
if (!isDataTypeConnectionToIed(newDAType, newIed))
|
|
120
|
+
return;
|
|
121
|
+
const existDAType = oldDataTypeTemplates.querySelector(`DAType[id="${newDAType.getAttribute("id")}"]`);
|
|
122
|
+
if (existDAType && newDAType.isEqualNode(existDAType))
|
|
123
|
+
return;
|
|
124
|
+
if (existDAType) {
|
|
125
|
+
// There is an `id` conflict in the project that must be resolved by
|
|
126
|
+
// concatenating the IED name with the id
|
|
127
|
+
const data = newDAType.parentElement;
|
|
128
|
+
const idOld = newDAType.getAttribute("id");
|
|
129
|
+
const idNew = generateNewId(idOld, newIed, existDAType, oldDataTypeTemplates);
|
|
130
|
+
newDAType.setAttribute("id", idNew);
|
|
131
|
+
data
|
|
132
|
+
.querySelectorAll(`DOType > DA[type="${idOld}"],DAType > BDA[type="${idOld}"]`)
|
|
133
|
+
.forEach((type) => type.setAttribute("type", idNew));
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
parent: oldDataTypeTemplates,
|
|
137
|
+
node: newDAType,
|
|
138
|
+
reference: getReference(oldDataTypeTemplates, "DAType"),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function addDOType(newIed, newDOType, oldDataTypeTemplates) {
|
|
142
|
+
if (!isDataTypeConnectionToIed(newDOType, newIed))
|
|
143
|
+
return;
|
|
144
|
+
const existDOType = oldDataTypeTemplates.querySelector(`DOType[id="${newDOType.getAttribute("id")}"]`);
|
|
145
|
+
if (existDOType && newDOType.isEqualNode(existDOType))
|
|
146
|
+
return;
|
|
147
|
+
if (existDOType) {
|
|
148
|
+
// There is an `id` conflict in the project that must be resolved by
|
|
149
|
+
// concatenating the IED name with the id
|
|
150
|
+
const data = newDOType.parentElement;
|
|
151
|
+
const idOld = newDOType.getAttribute("id");
|
|
152
|
+
const idNew = generateNewId(idOld, newIed, existDOType, oldDataTypeTemplates);
|
|
153
|
+
newDOType.setAttribute("id", idNew);
|
|
154
|
+
data
|
|
155
|
+
.querySelectorAll(`LNodeType > DO[type="${idOld}"], DOType > SDO[type="${idOld}"]`)
|
|
156
|
+
.forEach((type) => type.setAttribute("type", idNew));
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
parent: oldDataTypeTemplates,
|
|
160
|
+
node: newDOType,
|
|
161
|
+
reference: getReference(oldDataTypeTemplates, "DOType"),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function addLNodeType(newIed, newLNodeType, oldDataTypeTemplates) {
|
|
165
|
+
if (!isDataTypeConnectionToIed(newLNodeType, newIed))
|
|
166
|
+
return;
|
|
167
|
+
const existLNodeType = oldDataTypeTemplates.querySelector(`LNodeType[id="${newLNodeType.getAttribute("id")}"]`);
|
|
168
|
+
if (existLNodeType && newLNodeType.isEqualNode(existLNodeType))
|
|
169
|
+
return;
|
|
170
|
+
if (existLNodeType) {
|
|
171
|
+
// There is an `id` conflict in the project that must be resolved by
|
|
172
|
+
// concatenating the IED name with the id
|
|
173
|
+
const idOld = newLNodeType.getAttribute("id");
|
|
174
|
+
const idNew = generateNewId(idOld, newIed, existLNodeType, oldDataTypeTemplates);
|
|
175
|
+
newLNodeType.setAttribute("id", idNew);
|
|
176
|
+
Array.from(newIed.querySelectorAll(`LN0[lnType="${idOld}"],LN[lnType="${idOld}"]`))
|
|
177
|
+
.filter((anyLn) => !anyLn.closest("Private"))
|
|
178
|
+
.forEach((ln) => ln.setAttribute("lnType", idNew));
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
parent: oldDataTypeTemplates,
|
|
182
|
+
node: newLNodeType,
|
|
183
|
+
reference: getReference(oldDataTypeTemplates, "LNodeType"),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function addDataTypeTemplates(newIed, scl) {
|
|
187
|
+
const dataTypeEdit = [];
|
|
188
|
+
const dataTypeTemplates = scl.querySelector(":root > DataTypeTemplates")
|
|
189
|
+
? scl.querySelector(":root > DataTypeTemplates")
|
|
190
|
+
: createElement(scl.ownerDocument, "DataTypeTemplates", {});
|
|
191
|
+
if (!dataTypeTemplates.parentElement) {
|
|
192
|
+
dataTypeEdit.push({
|
|
193
|
+
parent: scl,
|
|
194
|
+
node: dataTypeTemplates,
|
|
195
|
+
reference: getReference(scl, "DataTypeTemplates"),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
const typeEdits = [];
|
|
199
|
+
newIed.ownerDocument
|
|
200
|
+
.querySelectorAll(":root > DataTypeTemplates > EnumType")
|
|
201
|
+
.forEach((enumType) => typeEdits.push(addEnumType(newIed, enumType, dataTypeTemplates)));
|
|
202
|
+
newIed.ownerDocument
|
|
203
|
+
.querySelectorAll(":root > DataTypeTemplates > DAType")
|
|
204
|
+
.forEach((daType) => typeEdits.push(addDAType(newIed, daType, dataTypeTemplates)));
|
|
205
|
+
newIed.ownerDocument
|
|
206
|
+
.querySelectorAll(":root > DataTypeTemplates > DOType")
|
|
207
|
+
.forEach((doType) => typeEdits.push(addDOType(newIed, doType, dataTypeTemplates)));
|
|
208
|
+
newIed.ownerDocument
|
|
209
|
+
.querySelectorAll(":root > DataTypeTemplates > LNodeType")
|
|
210
|
+
.forEach((lNodeType) => typeEdits.push(addLNodeType(newIed, lNodeType, dataTypeTemplates)));
|
|
211
|
+
return dataTypeEdit.concat(typeEdits.reverse().filter((item) => item !== undefined));
|
|
212
|
+
}
|
|
213
|
+
function isNameUnique(scl, ied) {
|
|
214
|
+
return !!scl.querySelector(`IED[name="${ied.getAttribute("name")}"]`);
|
|
215
|
+
}
|
|
216
|
+
function isIED(node) {
|
|
217
|
+
return node.tagName === "IED";
|
|
218
|
+
}
|
|
219
|
+
function isSCL(node) {
|
|
220
|
+
return node.tagName === "SCL";
|
|
221
|
+
}
|
|
222
|
+
/** Function to import !single IEDs with its `DataTypeTemplates` and
|
|
223
|
+
* optionally linked `Communication`section elements.
|
|
224
|
+
* >NOTE: Element are MOVED from ied document to the project not copied
|
|
225
|
+
* @param scl - the parent SCL element to insert the IED to
|
|
226
|
+
* @param ied - the new IED to be added to the project (SCL)
|
|
227
|
+
* @param options
|
|
228
|
+
* @returns An array containing diff objects representing an import IED edit
|
|
229
|
+
* section */
|
|
230
|
+
export function insertIed(scl, ied, options = { addCommunicationSection: true }) {
|
|
231
|
+
if (!isSCL(scl) || !isIED(ied) || isNameUnique(scl, ied))
|
|
232
|
+
return [];
|
|
233
|
+
const insertCommunication = [];
|
|
234
|
+
if (options.addCommunicationSection)
|
|
235
|
+
insertCommunication.push(...addCommunicationElements(ied, scl));
|
|
236
|
+
const insertDataTypes = [];
|
|
237
|
+
insertDataTypes.push(...addDataTypeTemplates(ied, scl));
|
|
238
|
+
const insertIed = {
|
|
239
|
+
parent: scl,
|
|
240
|
+
node: ied,
|
|
241
|
+
reference: getReference(scl, "IED"),
|
|
242
|
+
};
|
|
243
|
+
return [...insertCommunication, insertIed, ...insertDataTypes];
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=insertIED.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertIED.js","sourceRoot":"","sources":["../../tIED/insertIED.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Remove, SetAttributes } from "@openscd/oscd-api";
|
|
2
|
+
/**
|
|
3
|
+
* Function to remove an IED.
|
|
4
|
+
* ```md
|
|
5
|
+
* The function makes sure to also:
|
|
6
|
+
* 1. Remove all elements which should no longer exist including ClientLN,
|
|
7
|
+
* KDC, Association, ConnectedAP and IEDName
|
|
8
|
+
* 2. Remove subscriptions and supervisions
|
|
9
|
+
* 2. Update LNodes to an iedName of None
|
|
10
|
+
* ```
|
|
11
|
+
* @param remove - IED element as a Remove edit
|
|
12
|
+
* @returns - Set of additional edits to relevant SCL elements
|
|
13
|
+
*/
|
|
14
|
+
export declare function removeIED(remove: Remove): (SetAttributes | Remove)[];
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { isPublic } from "../tBaseElement/isPublic.js";
|
|
2
|
+
import { unsubscribe } from "../tExtRef/unsubscribe.js";
|
|
3
|
+
import { removeSubscriptionSupervision } from "../tLN/removeSubscriptionSupervision.js";
|
|
4
|
+
const elementsToRemove = ["Association", "ClientLN", "ConnectedAP", "KDC"];
|
|
5
|
+
const elementsToReplaceWithNone = ["LNode"];
|
|
6
|
+
function removeIEDNameTextContent(ied, iedName) {
|
|
7
|
+
return Array.from(ied.ownerDocument.getElementsByTagName("IEDName"))
|
|
8
|
+
.filter(isPublic)
|
|
9
|
+
.filter((iedNameElement) => iedNameElement.textContent === iedName)
|
|
10
|
+
.map((iedNameElement) => {
|
|
11
|
+
return { node: iedNameElement };
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function removeWithIedName(ied, iedName) {
|
|
15
|
+
const selector = elementsToRemove
|
|
16
|
+
.map((iedNameElement) => `${iedNameElement}[iedName="${iedName}"]`)
|
|
17
|
+
.join(",");
|
|
18
|
+
return Array.from(ied.ownerDocument.querySelectorAll(selector))
|
|
19
|
+
.filter(isPublic)
|
|
20
|
+
.map((element) => {
|
|
21
|
+
return { node: element };
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function removeIedSubscriptionsAndSupervisions(ied, iedName) {
|
|
25
|
+
const extRefs = Array.from(ied.ownerDocument.querySelectorAll(":root > IED"))
|
|
26
|
+
.filter((ied) => ied.getAttribute("name") !== iedName)
|
|
27
|
+
.flatMap((ied) => Array.from(ied.querySelectorAll(`:scope > AccessPoint > Server > LDevice > LN0 > Inputs > ExtRef[iedName="${iedName}"],
|
|
28
|
+
:scope > AccessPoint > Server > LDevice > LN > Inputs > ExtRef[iedName="${iedName}"]`)));
|
|
29
|
+
const supervisionRemovals = removeSubscriptionSupervision(extRefs);
|
|
30
|
+
const extRefRemovals = unsubscribe(extRefs, { ignoreSupervision: true });
|
|
31
|
+
return [...extRefRemovals, ...supervisionRemovals];
|
|
32
|
+
}
|
|
33
|
+
function updateIedNameToNone(ied, iedName) {
|
|
34
|
+
const selector = elementsToReplaceWithNone
|
|
35
|
+
.map((iedNameElement) => `${iedNameElement}[iedName="${iedName}"]`)
|
|
36
|
+
.join(",");
|
|
37
|
+
return Array.from(ied.ownerDocument.querySelectorAll(selector))
|
|
38
|
+
.filter(isPublic)
|
|
39
|
+
.map((element) => {
|
|
40
|
+
return { element, attributes: { iedName: "None" } };
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Function to remove an IED.
|
|
45
|
+
* ```md
|
|
46
|
+
* The function makes sure to also:
|
|
47
|
+
* 1. Remove all elements which should no longer exist including ClientLN,
|
|
48
|
+
* KDC, Association, ConnectedAP and IEDName
|
|
49
|
+
* 2. Remove subscriptions and supervisions
|
|
50
|
+
* 2. Update LNodes to an iedName of None
|
|
51
|
+
* ```
|
|
52
|
+
* @param remove - IED element as a Remove edit
|
|
53
|
+
* @returns - Set of additional edits to relevant SCL elements
|
|
54
|
+
*/
|
|
55
|
+
export function removeIED(remove) {
|
|
56
|
+
if (remove.node.nodeType !== Node.ELEMENT_NODE ||
|
|
57
|
+
remove.node.nodeName !== "IED" ||
|
|
58
|
+
!remove.node.hasAttribute("name"))
|
|
59
|
+
return [];
|
|
60
|
+
const ied = remove.node;
|
|
61
|
+
const name = ied.getAttribute("name");
|
|
62
|
+
return [
|
|
63
|
+
remove,
|
|
64
|
+
...removeIEDNameTextContent(ied, name),
|
|
65
|
+
...removeWithIedName(ied, name),
|
|
66
|
+
...removeIedSubscriptionsAndSupervisions(ied, name),
|
|
67
|
+
...updateIedNameToNone(ied, name),
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=removeIED.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeIED.js","sourceRoot":"","sources":["../../tIED/removeIED.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EditV2, SetAttributes } from "@openscd/oscd-api";
|
|
2
|
+
/**
|
|
3
|
+
* Function to schema valid update name and other attribute(s) in IED element
|
|
4
|
+
* (rename IED)
|
|
5
|
+
* ```md
|
|
6
|
+
* The function makes sure to also
|
|
7
|
+
* 1. Update all elements with iedName attribute referenced to the IED.name
|
|
8
|
+
* attribute such as LNode, ClientLN, ExtRef, KDC, Association, ConnectedAP
|
|
9
|
+
* 2. Update all control block object references pointing to the IED
|
|
10
|
+
* 3. Updates IEDName elements text content
|
|
11
|
+
* ```
|
|
12
|
+
* @param setAttributes - IED element and attributes to be changed in the IED element
|
|
13
|
+
* @param checkPermission - Check permission before changing object references
|
|
14
|
+
* (other than supervision node GoCBRef values).
|
|
15
|
+
* @returns - Set of addition edits updating all references SCL elements
|
|
16
|
+
*/
|
|
17
|
+
export declare function updateIED(setAttributes: SetAttributes, checkPermission?: boolean): EditV2[];
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { createElement } from "../foundation/utils.js";
|
|
2
|
+
import { controlBlockObjRef } from "../tControl/controlBlockObjRef.js";
|
|
3
|
+
function isPublic(element) {
|
|
4
|
+
return !element.closest("Private");
|
|
5
|
+
}
|
|
6
|
+
const elementsWithIedNameAttribute = [
|
|
7
|
+
"LNode",
|
|
8
|
+
"ConnectedAP",
|
|
9
|
+
"KDC",
|
|
10
|
+
"ExtRef",
|
|
11
|
+
"ClientLN",
|
|
12
|
+
"Association",
|
|
13
|
+
];
|
|
14
|
+
function updateIEDNameTextContent(ied, oldIedName, newIedName) {
|
|
15
|
+
return Array.from(ied.ownerDocument.getElementsByTagName("IEDName"))
|
|
16
|
+
.filter(isPublic)
|
|
17
|
+
.filter((iedName) => iedName.textContent === oldIedName)
|
|
18
|
+
.flatMap((iedName) => {
|
|
19
|
+
const node = Array.from(iedName.childNodes).find((node) => node.nodeType === Node.TEXT_NODE);
|
|
20
|
+
return [
|
|
21
|
+
{ node },
|
|
22
|
+
{
|
|
23
|
+
parent: iedName,
|
|
24
|
+
node: document.createTextNode(newIedName),
|
|
25
|
+
reference: null,
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/** Valid is:
|
|
31
|
+
* 1. there is an control block in the IED with the name change (ied)
|
|
32
|
+
* 2. this control block is subscribed in otherIED (iedName, srcLDInst and srcCBName match)
|
|
33
|
+
* 3. there is a LGOS/LSVS > ... > setSrcRef holding this control block object reference
|
|
34
|
+
*/
|
|
35
|
+
function validSubscriptionSupervision(ied, otherIED, oldIedName) {
|
|
36
|
+
// for GSEControl elements
|
|
37
|
+
const lgosVals = Array.from(ied.querySelectorAll("GSEControl"))
|
|
38
|
+
.filter((srcCB) => {
|
|
39
|
+
//filter out all control blocks that are not subscribed in otherIED
|
|
40
|
+
const srcLDInst = srcCB.closest("LDevice")?.getAttribute("inst");
|
|
41
|
+
return !!otherIED.querySelector(`:scope > AccessPoint > Server > LDevice
|
|
42
|
+
ExtRef[iedName="${oldIedName}"][srcLDInst="${srcLDInst}"][srcCBName="${srcCB.getAttribute("name")}"]`);
|
|
43
|
+
})
|
|
44
|
+
.map((srcCB) => {
|
|
45
|
+
const objRef = controlBlockObjRef(srcCB);
|
|
46
|
+
return Array.from(otherIED.querySelectorAll(`:scope > AccessPoint > Server > LDevice > LN[lnClass="LGOS"] >
|
|
47
|
+
DOI[name="GoCBRef"] > DAI[name="setSrcRef"] > Val`)).find((val) => val.textContent === objRef);
|
|
48
|
+
})
|
|
49
|
+
.filter((val) => val);
|
|
50
|
+
// for SampledValueControl elements
|
|
51
|
+
const lsvsVals = Array.from(ied.querySelectorAll("SampledValueControl"))
|
|
52
|
+
.filter((srcCB) => {
|
|
53
|
+
//filter out all control blocks that are not subscribed in otherIED
|
|
54
|
+
const srcLDInst = srcCB.closest("LDevice")?.getAttribute("inst");
|
|
55
|
+
return !!otherIED.querySelector(`:scope > AccessPoint > Server > LDevice
|
|
56
|
+
ExtRef[iedName="${oldIedName}"][srcLDInst="${srcLDInst}"][srcCBName="${srcCB.getAttribute("name")}"]`);
|
|
57
|
+
})
|
|
58
|
+
.map((srcCB) => {
|
|
59
|
+
const objRef = controlBlockObjRef(srcCB);
|
|
60
|
+
return Array.from(otherIED.querySelectorAll(`:scope > AccessPoint > Server > LDevice > LN[lnClass="LSVS"] >
|
|
61
|
+
DOI[name="SvCBRef"] > DAI[name="setSrcRef"] > Val`)).find((val) => val.textContent === objRef);
|
|
62
|
+
})
|
|
63
|
+
.filter((val) => val);
|
|
64
|
+
return [...lgosVals, ...lsvsVals];
|
|
65
|
+
}
|
|
66
|
+
function updateSubscriptionSupervision(ied, oldIedName, newIedName) {
|
|
67
|
+
const vals = Array.from(ied.ownerDocument.querySelectorAll(":root > IED")).flatMap((otherIED) => validSubscriptionSupervision(ied, otherIED, oldIedName));
|
|
68
|
+
return vals.flatMap((val) => {
|
|
69
|
+
const oldContent = val.textContent;
|
|
70
|
+
const newContent = oldContent.replace(oldIedName, newIedName);
|
|
71
|
+
const newTextNode = document.createTextNode(newContent);
|
|
72
|
+
const node = Array.from(val.childNodes).find((childNode) => childNode.nodeType === Node.TEXT_NODE);
|
|
73
|
+
return [{ node }, { parent: val, node: newTextNode, reference: null }];
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function updateIedNameAttributes(ied, oldIedName, newIedName) {
|
|
77
|
+
const selector = elementsWithIedNameAttribute
|
|
78
|
+
.map((iedNameElement) => `${iedNameElement}[iedName="${oldIedName}"]`)
|
|
79
|
+
.join(",");
|
|
80
|
+
return Array.from(ied.ownerDocument.querySelectorAll(selector))
|
|
81
|
+
.filter(isPublic)
|
|
82
|
+
.map((element) => {
|
|
83
|
+
return { element, attributes: { iedName: newIedName } };
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function objectReferenceToIed(dai, oldIedName) {
|
|
87
|
+
const val = dai.querySelector(":scope > Val");
|
|
88
|
+
const valContent = val.textContent;
|
|
89
|
+
if (!valContent || !valContent?.startsWith(oldIedName))
|
|
90
|
+
return false;
|
|
91
|
+
const lDeviceName = valContent.slice(oldIedName.length).split("/")[0];
|
|
92
|
+
const ied = dai.closest("IED");
|
|
93
|
+
const hasLDevice = ied?.querySelector(`:scope > AccessPoint > Server > LDevice[inst="${lDeviceName}"]`);
|
|
94
|
+
if (!hasLDevice)
|
|
95
|
+
return false;
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
function canModifyDA(daiOrdaType) {
|
|
99
|
+
const valImport = daiOrdaType.getAttribute("valImport");
|
|
100
|
+
const valKind = daiOrdaType.getAttribute("valKind");
|
|
101
|
+
return (valImport === "true" && valKind !== null && ["Conf", "RO"].includes(valKind));
|
|
102
|
+
}
|
|
103
|
+
function objRefDetails(anyLn, doName, daName) {
|
|
104
|
+
const doc = anyLn.ownerDocument;
|
|
105
|
+
const lNodeType = doc.querySelector(`:root > DataTypeTemplates > LNodeType[id="${anyLn.getAttribute("lnType")}"]`);
|
|
106
|
+
let leaf = lNodeType;
|
|
107
|
+
const dO = leaf?.querySelector(`DO[name="${doName}"], SDO[name="${doName}"]`);
|
|
108
|
+
leaf = doc.querySelector(`:root > DataTypeTemplates > DOType[id="${dO?.getAttribute("type")}"]`);
|
|
109
|
+
const dA = leaf?.querySelector(`DA[name="${daName}"]`);
|
|
110
|
+
if (!dA)
|
|
111
|
+
return undefined;
|
|
112
|
+
const bType = dA.getAttribute("bType");
|
|
113
|
+
const canModify = canModifyDA(dA);
|
|
114
|
+
return { bType, canModify };
|
|
115
|
+
}
|
|
116
|
+
/** Find references used by the IED with the basic type of object reference.
|
|
117
|
+
* Then check if they require replacement.
|
|
118
|
+
* This function does not process LGOS and LSVS GoCBRef as these are
|
|
119
|
+
* handled separately.
|
|
120
|
+
*/
|
|
121
|
+
function updateObjectReferences(ied, oldIedName, newIedName, checkPermission = false) {
|
|
122
|
+
const objRefCandidates = Array.from(ied.querySelectorAll("LN DAI > Val, LN0 DAI > Val")).filter((val) => {
|
|
123
|
+
const dai = val.parentElement;
|
|
124
|
+
const ln = dai.closest("LN, LN0");
|
|
125
|
+
const lnClass = ln?.getAttribute("lnClass");
|
|
126
|
+
const doiName = dai.closest("DOI, SDI")?.getAttribute("name");
|
|
127
|
+
const daiName = dai.getAttribute("name");
|
|
128
|
+
const isSupervision = lnClass &&
|
|
129
|
+
doiName &&
|
|
130
|
+
["LGOS", "LSVS"].includes(lnClass) &&
|
|
131
|
+
["GoCBRef", "SvCBRef"].includes(doiName);
|
|
132
|
+
if (!ln || !doiName || !daiName || isSupervision)
|
|
133
|
+
return false;
|
|
134
|
+
const objRefInfo = objRefDetails(ln, doiName, daiName);
|
|
135
|
+
return (objRefInfo?.bType === "ObjRef" &&
|
|
136
|
+
(checkPermission === false ||
|
|
137
|
+
objRefInfo?.canModify ||
|
|
138
|
+
canModifyDA(dai)) &&
|
|
139
|
+
objectReferenceToIed(dai, oldIedName));
|
|
140
|
+
});
|
|
141
|
+
return objRefCandidates.flatMap((val) => {
|
|
142
|
+
const objRef = val.textContent;
|
|
143
|
+
const textContent = `${newIedName}${objRef.slice(oldIedName.length)}`;
|
|
144
|
+
const newVal = createElement(val.ownerDocument, "Val", {});
|
|
145
|
+
newVal.textContent = textContent;
|
|
146
|
+
return [
|
|
147
|
+
{ node: val },
|
|
148
|
+
{ parent: val.parentElement, node: newVal, reference: null },
|
|
149
|
+
];
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Function to schema valid update name and other attribute(s) in IED element
|
|
154
|
+
* (rename IED)
|
|
155
|
+
* ```md
|
|
156
|
+
* The function makes sure to also
|
|
157
|
+
* 1. Update all elements with iedName attribute referenced to the IED.name
|
|
158
|
+
* attribute such as LNode, ClientLN, ExtRef, KDC, Association, ConnectedAP
|
|
159
|
+
* 2. Update all control block object references pointing to the IED
|
|
160
|
+
* 3. Updates IEDName elements text content
|
|
161
|
+
* ```
|
|
162
|
+
* @param setAttributes - IED element and attributes to be changed in the IED element
|
|
163
|
+
* @param checkPermission - Check permission before changing object references
|
|
164
|
+
* (other than supervision node GoCBRef values).
|
|
165
|
+
* @returns - Set of addition edits updating all references SCL elements
|
|
166
|
+
*/
|
|
167
|
+
export function updateIED(setAttributes, checkPermission = false) {
|
|
168
|
+
if (setAttributes.element.tagName !== "IED")
|
|
169
|
+
return [];
|
|
170
|
+
if (!setAttributes.attributes?.name)
|
|
171
|
+
return [setAttributes];
|
|
172
|
+
const ied = setAttributes.element;
|
|
173
|
+
const oldIedName = ied.getAttribute("name");
|
|
174
|
+
const newIedName = setAttributes.attributes.name;
|
|
175
|
+
if (!oldIedName)
|
|
176
|
+
return [];
|
|
177
|
+
return [
|
|
178
|
+
setAttributes,
|
|
179
|
+
...updateIedNameAttributes(ied, oldIedName, newIedName),
|
|
180
|
+
...updateSubscriptionSupervision(ied, oldIedName, newIedName),
|
|
181
|
+
...updateIEDNameTextContent(ied, oldIedName, newIedName),
|
|
182
|
+
...updateObjectReferences(ied, oldIedName, newIedName, checkPermission),
|
|
183
|
+
];
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=updateIED.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateIED.js","sourceRoot":"","sources":["../../tIED/updateIED.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,SAAS,QAAQ,CAAC,OAAgB;IAChC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,4BAA4B,GAAG;IACnC,OAAO;IACP,aAAa;IACb,KAAK;IACL,QAAQ;IACR,UAAU;IACV,aAAa;CACd,CAAC;AAEF,SAAS,wBAAwB,CAC/B,GAAY,EACZ,UAAkB,EAClB,UAAkB;IAElB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;SACjE,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,KAAK,UAAU,CAAC;SACvD,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAC9C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,CAC1C,CAAC;QAEH,OAAO;YACL,EAAE,IAAI,EAAE;YACR;gBACE,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC;gBACzC,SAAS,EAAE,IAAI;aAChB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,SAAS,4BAA4B,CACnC,GAAY,EACZ,QAAiB,EACjB,UAAkB;IAElB,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;SAC5D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAChB,mEAAmE;QACnE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAC7B;0BACkB,UAAU,iBAAiB,SAAS,iBAAiB,KAAK,CAAC,YAAY,CACvF,MAAM,CACP,IAAI,CACN,CAAC;IACJ,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,IAAI,CACf,QAAQ,CAAC,gBAAgB,CACvB;8DACoD,CACrD,CACF,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC;IAC9C,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAc,CAAC;IAErC,mCAAmC;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;SACrE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAChB,mEAAmE;QACnE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAC7B;4BACoB,UAAU,iBAAiB,SAAS,iBAAiB,KAAK,CAAC,YAAY,CACzF,MAAM,CACP,IAAI,CACN,CAAC;IACJ,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,IAAI,CACf,QAAQ,CAAC,gBAAgB,CACvB;4DACkD,CACnD,CACF,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC;IAC9C,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAc,CAAC;IAErC,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,6BAA6B,CACpC,GAAY,EACZ,UAAkB,EAClB,UAAkB;IAElB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,GAAG,CAAC,aAAa,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAClD,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CACrB,4BAA4B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CACxD,CAAC;IAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,GAAG,CAAC,WAAY,CAAC;QACpC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAC1C,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,CACpD,CAAC;QAEH,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAC9B,GAAY,EACZ,UAAkB,EAClB,UAAkB;IAElB,MAAM,QAAQ,GAAG,4BAA4B;SAC1C,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,GAAG,cAAc,aAAa,UAAU,IAAI,CAAC;SACrE,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;SAC5D,MAAM,CAAC,QAAQ,CAAC;SAChB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAY,EAAE,UAAkB;IAC5D,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,cAAc,CAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC;IAEnC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAErE,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,GAAG,EAAE,aAAa,CACnC,iDAAiD,WAAW,IAAI,CACjE,CAAC;IACF,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,WAAoB;IACvC,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACpD,OAAO,CACL,SAAS,KAAK,MAAM,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,KAAc,EACd,MAAc,EACd,MAAc;IAEd,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CACjC,6CAA6C,KAAK,CAAC,YAAY,CAC7D,QAAQ,CACT,IAAI,CACN,CAAC;IAEF,IAAI,IAAI,GAA+B,SAAS,CAAC;IAEjD,MAAM,EAAE,GAA+B,IAAI,EAAE,aAAa,CACxD,YAAY,MAAM,iBAAiB,MAAM,IAAI,CAC9C,CAAC;IACF,IAAI,GAAG,GAAG,CAAC,aAAa,CACtB,0CAA0C,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CACvE,CAAC;IAEF,MAAM,EAAE,GAA+B,IAAI,EAAE,aAAa,CACxD,YAAY,MAAM,IAAI,CACvB,CAAC;IACF,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAE1B,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAElC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,GAAY,EACZ,UAAkB,EAClB,UAAkB,EAClB,eAAe,GAAG,KAAK;IAEvB,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CACjC,GAAG,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,CACpD,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,GAAG,CAAC,aAAc,CAAC;QAC/B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,EAAE,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,aAAa,GACjB,OAAO;YACP,OAAO;YACP,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAClC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,aAAa;YAAE,OAAO,KAAK,CAAC;QAE/D,MAAM,UAAU,GAAG,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEvD,OAAO,CACL,UAAU,EAAE,KAAK,KAAK,QAAQ;YAC9B,CAAC,eAAe,KAAK,KAAK;gBACxB,UAAU,EAAE,SAAS;gBACrB,WAAW,CAAC,GAAG,CAAC,CAAC;YACnB,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAY,CAAC;QAChC,MAAM,WAAW,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAEtE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;QAEjC,OAAO;YACL,EAAE,IAAI,EAAE,GAAG,EAAE;YACb,EAAE,MAAM,EAAE,GAAG,CAAC,aAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;SAC9D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CAAC,aAA4B,EAAE,eAAe,GAAG,KAAK;IAC7E,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI;QAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAE5D,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC;IAClC,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,IAAK,CAAC;IAClD,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE3B,OAAO;QACL,aAAa;QACb,GAAG,uBAAuB,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC;QACvD,GAAG,6BAA6B,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC;QAC7D,GAAG,wBAAwB,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC;QACxD,GAAG,sBAAsB,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC;KACxE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Remove } from "@openscd/oscd-api";
|
|
2
|
+
/**
|
|
3
|
+
* Makes sure to not leave empty `Inputs` element after removing
|
|
4
|
+
* its child `ExtRef` elements using [[`extRefedits`]]
|
|
5
|
+
* @returns edits to remove `Inputs` when empty
|
|
6
|
+
* */
|
|
7
|
+
export declare function removeInputs(extRefs: Remove[]): Remove[];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function isInputLeaf(input, allInputs) {
|
|
2
|
+
let sameInputs = 0;
|
|
3
|
+
for (const value of allInputs)
|
|
4
|
+
if (value === input)
|
|
5
|
+
sameInputs++;
|
|
6
|
+
return input.querySelectorAll("ExtRef").length === sameInputs;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Makes sure to not leave empty `Inputs` element after removing
|
|
10
|
+
* its child `ExtRef` elements using [[`extRefedits`]]
|
|
11
|
+
* @returns edits to remove `Inputs` when empty
|
|
12
|
+
* */
|
|
13
|
+
export function removeInputs(extRefs) {
|
|
14
|
+
const removeInputs = [];
|
|
15
|
+
const parentInputs = extRefs
|
|
16
|
+
.map((remove) => remove.node.parentElement)
|
|
17
|
+
.filter((input) => input);
|
|
18
|
+
parentInputs.forEach((input, _index, inputs) => {
|
|
19
|
+
const inputNotRemovedYet = !removeInputs.some((removeInput) => removeInput.node === input);
|
|
20
|
+
if (isInputLeaf(input, inputs) && inputNotRemovedYet)
|
|
21
|
+
removeInputs.push({ node: input });
|
|
22
|
+
});
|
|
23
|
+
return extRefs.concat(removeInputs);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=removeInputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeInputs.js","sourceRoot":"","sources":["../../tInputs/removeInputs.ts"],"names":[],"mappings":"AAEA,SAAS,WAAW,CAAC,KAAc,EAAE,SAAoB;IACvD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,SAAS;QAAE,IAAI,KAAK,KAAK,KAAK;YAAE,UAAU,EAAE,CAAC;IAEjE,OAAO,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC;AAChE,CAAC;AAED;;;;KAIK;AACL,MAAM,UAAU,YAAY,CAAC,OAAiB;IAC5C,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,MAAM,YAAY,GAAG,OAAO;SACzB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAE,MAAM,CAAC,IAAgB,CAAC,aAAa,CAAC;SACvD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAc,CAAC;IAEzC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,kBAAkB,GAAG,CAAC,YAAY,CAAC,IAAI,CAC3C,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,CAC5C,CAAC;QAEF,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,kBAAkB;YAClD,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Remove } from "@openscd/oscd-api";
|
|
2
|
+
/** Removes subscription supervision - `LGOS` or `LSVS` - when no other data
|
|
3
|
+
* of a given `GSEControl` or `SampledValueControl`
|
|
4
|
+
* @param extRefs - An array of external reference elements
|
|
5
|
+
* @returns edits to remove subscription supervision `LGOS` or `LSVS`
|
|
6
|
+
*/
|
|
7
|
+
export declare function removeSubscriptionSupervision(extRefs: Element[]): Remove[];
|