@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,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
|
+
}
|