@vessel-dsp/core 0.6.24 → 0.6.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/formats/document.d.ts +9 -0
  2. package/dist/formats/document.d.ts.map +1 -1
  3. package/dist/formats/document.js +6 -0
  4. package/dist/formats/document.js.map +1 -1
  5. package/dist/formats/interchange/contract.d.ts +19 -0
  6. package/dist/formats/interchange/contract.d.ts.map +1 -0
  7. package/dist/formats/interchange/contract.js +19 -0
  8. package/dist/formats/interchange/contract.js.map +1 -0
  9. package/dist/formats/interchange/parser.d.ts.map +1 -1
  10. package/dist/formats/interchange/parser.js +78 -7
  11. package/dist/formats/interchange/parser.js.map +1 -1
  12. package/dist/formats/interchange/serializer.d.ts +16 -0
  13. package/dist/formats/interchange/serializer.d.ts.map +1 -1
  14. package/dist/formats/interchange/serializer.js +5 -4
  15. package/dist/formats/interchange/serializer.js.map +1 -1
  16. package/dist/formats/interchange/source-type-names.d.ts +40 -0
  17. package/dist/formats/interchange/source-type-names.d.ts.map +1 -0
  18. package/dist/formats/interchange/source-type-names.js +184 -0
  19. package/dist/formats/interchange/source-type-names.js.map +1 -0
  20. package/dist/formats/schx/catalog.d.ts.map +1 -1
  21. package/dist/formats/schx/catalog.js +49 -7
  22. package/dist/formats/schx/catalog.js.map +1 -1
  23. package/dist/index.d.ts +4 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/model/terminal-roles.d.ts +70 -0
  28. package/dist/model/terminal-roles.d.ts.map +1 -0
  29. package/dist/model/terminal-roles.js +204 -0
  30. package/dist/model/terminal-roles.js.map +1 -0
  31. package/dist/model/tokens.d.ts +10 -0
  32. package/dist/model/tokens.d.ts.map +1 -0
  33. package/dist/model/tokens.js +15 -0
  34. package/dist/model/tokens.js.map +1 -0
  35. package/dist/model/validation.d.ts.map +1 -1
  36. package/dist/model/validation.js +1 -6
  37. package/dist/model/validation.js.map +1 -1
  38. package/dist/panel/extract.d.ts.map +1 -1
  39. package/dist/panel/extract.js +1 -6
  40. package/dist/panel/extract.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,204 @@
1
+ // Canonical potentiometer terminal roles, and the spellings that resolve to them.
2
+ //
3
+ // A potentiometer's two ends are only meaningful as a *rotational* pair: which end
4
+ // the wiper travels toward as the shaft turns clockwise. A consumer needs that to
5
+ // know which way a control sweeps, and it cannot be recovered from the schematic --
6
+ // a symbol's terminal positions say which end is drawn where, not which way the
7
+ // shaft turns. So a consumer that infers it from topology or geometry produces a
8
+ // control that sweeps backwards on some documents, silently.
9
+ //
10
+ // Survey of the fixture corpus (54 documents, 65 potentiometers):
11
+ //
12
+ // 2 `.vdsp` [1, 2, 3] lug numbers -- carries the answer by convention
13
+ // 63 `.schx` [a, wiper, b] names an end without naming its rotation
14
+ // 0 cw / ccw
15
+ //
16
+ // The 63 matter less than they look: those names are core's own catalog
17
+ // (`formats/schx/catalog.ts`), because LiveSPICE files do not name pot terminals.
18
+ // They are not author drift, and warning an author about a token core invented
19
+ // would be noise.
20
+ //
21
+ // This module therefore resolves what is resolvable and refuses the rest. Lug
22
+ // numbers and spelling variants normalize silently -- the common cases cost an
23
+ // author nothing. `a`/`b` resolve to no role at all: `complete` stays false and a
24
+ // diagnostic says the source does not carry the semantics, which is the truthful
25
+ // answer and the one that stops each consumer inventing its own guess.
26
+ //
27
+ // Like the `sourceTypeName` vocabulary, this is data, not policy. It never
28
+ // rewrites a document; the resolved role is reported alongside the raw token.
29
+ import { normalizeToken } from "./tokens.js";
30
+ export const POTENTIOMETER_TERMINAL_ROLES = [
31
+ "ccw",
32
+ "wiper",
33
+ "cw",
34
+ ];
35
+ /**
36
+ * Spellings that resolve to a canonical role, keyed by normalized token.
37
+ *
38
+ * Every entry is a spelling of one of the three concepts, never a fourth concept.
39
+ * Lug numbers are included because the physical numbering is standard: lug 1 is the
40
+ * counter-clockwise end, lug 2 the wiper, lug 3 the clockwise end.
41
+ */
42
+ export const POTENTIOMETER_TERMINAL_ROLE_ALIASES = new Map([
43
+ // Canonical.
44
+ ["ccw", "ccw"],
45
+ ["wiper", "wiper"],
46
+ ["cw", "cw"],
47
+ // Physical lug numbering.
48
+ ["1", "ccw"],
49
+ ["2", "wiper"],
50
+ ["3", "cw"],
51
+ ["lug1", "ccw"],
52
+ ["lug2", "wiper"],
53
+ ["lug3", "cw"],
54
+ ["lug-1", "ccw"],
55
+ ["lug-2", "wiper"],
56
+ ["lug-3", "cw"],
57
+ ["pin1", "ccw"],
58
+ ["pin2", "wiper"],
59
+ ["pin3", "cw"],
60
+ ["pin-1", "ccw"],
61
+ ["pin-2", "wiper"],
62
+ ["pin-3", "cw"],
63
+ ["terminal1", "ccw"],
64
+ ["terminal2", "wiper"],
65
+ ["terminal3", "cw"],
66
+ ["terminal-1", "ccw"],
67
+ ["terminal-2", "wiper"],
68
+ ["terminal-3", "cw"],
69
+ // Spellings of the counter-clockwise end.
70
+ ["counterclockwise", "ccw"],
71
+ ["counter-clockwise", "ccw"],
72
+ ["anticlockwise", "ccw"],
73
+ ["anti-clockwise", "ccw"],
74
+ ["acw", "ccw"],
75
+ ["ccw-end", "ccw"],
76
+ // Spellings of the clockwise end.
77
+ ["clockwise", "cw"],
78
+ ["cw-end", "cw"],
79
+ // Spellings of the wiper.
80
+ ["w", "wiper"],
81
+ ["wpr", "wiper"],
82
+ ["wip", "wiper"],
83
+ ["slider", "wiper"],
84
+ ["tap", "wiper"],
85
+ ["center-tap", "wiper"],
86
+ ["centre-tap", "wiper"],
87
+ ]);
88
+ /**
89
+ * Tokens that name one of the two ends without saying which rotation it is.
90
+ *
91
+ * These are not misspellings -- there is nothing to correct in `a`. They are
92
+ * under-specified, so they resolve to no role rather than to a guessed one. An
93
+ * author fixes one by writing which end the shaft turns toward.
94
+ */
95
+ export const AMBIGUOUS_POTENTIOMETER_END_TOKENS = new Set([
96
+ "a",
97
+ "b",
98
+ "end",
99
+ "end1",
100
+ "end2",
101
+ "end-1",
102
+ "end-2",
103
+ "x",
104
+ "y",
105
+ "0",
106
+ "left",
107
+ "right",
108
+ "top",
109
+ "bottom",
110
+ "start",
111
+ "finish",
112
+ "in",
113
+ "out",
114
+ "input",
115
+ "output",
116
+ ]);
117
+ /** Classify one potentiometer terminal name. */
118
+ export function classifyPotentiometerTerminalRole(terminalName) {
119
+ const token = normalizeToken(terminalName);
120
+ const role = POTENTIOMETER_TERMINAL_ROLE_ALIASES.get(token);
121
+ if (role !== undefined) {
122
+ return token === role
123
+ ? { status: "canonical", role }
124
+ : { status: "alias", role };
125
+ }
126
+ if (AMBIGUOUS_POTENTIOMETER_END_TOKENS.has(token)) {
127
+ return { status: "ambiguous" };
128
+ }
129
+ return { status: "unrecognized" };
130
+ }
131
+ /**
132
+ * Resolve a potentiometer's terminal roles, or `null` for a component that has no
133
+ * rotational ends to resolve.
134
+ *
135
+ * Refuses rather than guesses. A terminal naming an end without its rotation
136
+ * contributes no role, and two terminals claiming the same role cancel: an
137
+ * incomplete resolution is reported, never completed by inference.
138
+ */
139
+ export function resolvePotentiometerTerminalRoles(component) {
140
+ if (component.kind !== "potentiometer")
141
+ return null;
142
+ const roles = new Map();
143
+ const claims = new Map();
144
+ const diagnostics = [];
145
+ for (const terminal of component.terminals) {
146
+ const verdict = classifyPotentiometerTerminalRole(terminal.name);
147
+ if (verdict.status === "ambiguous") {
148
+ diagnostics.push({
149
+ code: "potentiometer-terminal-role-ambiguous",
150
+ message: `terminal "${terminal.name}" names an end of ${component.id} without saying which way the shaft turns toward it. Write "cw" or "ccw" (or lug numbers 1/2/3); rotation cannot be recovered from the schematic.`,
151
+ componentId: component.id,
152
+ });
153
+ continue;
154
+ }
155
+ if (verdict.status === "unrecognized") {
156
+ diagnostics.push({
157
+ code: "potentiometer-terminal-role-unrecognized",
158
+ message: `terminal "${terminal.name}" on ${component.id} is not a recognised potentiometer terminal role. Expected "ccw", "wiper" or "cw", a lug number 1/2/3, or a known spelling of one of those.`,
159
+ componentId: component.id,
160
+ });
161
+ continue;
162
+ }
163
+ roles.set(terminal.name, verdict.role);
164
+ claims.set(verdict.role, [
165
+ ...(claims.get(verdict.role) ?? []),
166
+ terminal.name,
167
+ ]);
168
+ }
169
+ const terminals = new Map();
170
+ for (const [role, names] of claims) {
171
+ const [first, ...rest] = names;
172
+ if (first === undefined)
173
+ continue;
174
+ if (rest.length > 0) {
175
+ diagnostics.push({
176
+ code: "potentiometer-terminal-role-duplicate",
177
+ message: `terminals ${names.map((name) => `"${name}"`).join(", ")} on ${component.id} all resolve to role "${role}". One terminal per role; the duplicate claims are dropped rather than ordered arbitrarily.`,
178
+ componentId: component.id,
179
+ });
180
+ for (const name of names)
181
+ roles.delete(name);
182
+ continue;
183
+ }
184
+ terminals.set(role, first);
185
+ }
186
+ return {
187
+ componentId: component.id,
188
+ roles,
189
+ terminals,
190
+ complete: POTENTIOMETER_TERMINAL_ROLES.every((role) => terminals.has(role)),
191
+ diagnostics,
192
+ };
193
+ }
194
+ /** Resolve every potentiometer in a document, in document order. */
195
+ export function resolveDocumentPotentiometerTerminalRoles(document) {
196
+ const out = [];
197
+ for (const component of document.components) {
198
+ const resolution = resolvePotentiometerTerminalRoles(component);
199
+ if (resolution !== null)
200
+ out.push(resolution);
201
+ }
202
+ return out;
203
+ }
204
+ //# sourceMappingURL=terminal-roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-roles.js","sourceRoot":"","sources":["../../src/model/terminal-roles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared token normalization for vocabulary lookups.
3
+ *
4
+ * Consumers and authors vary case, spacing and separators for the same token, so
5
+ * every vocabulary in the model compares normalized forms. Extracted because the
6
+ * same four lines were duplicated in `validation.ts` and `panel/extract.ts`, and
7
+ * a second copy is how two vocabularies drift apart.
8
+ */
9
+ export declare function normalizeToken(value: string): string;
10
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/model/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shared token normalization for vocabulary lookups.
3
+ *
4
+ * Consumers and authors vary case, spacing and separators for the same token, so
5
+ * every vocabulary in the model compares normalized forms. Extracted because the
6
+ * same four lines were duplicated in `validation.ts` and `panel/extract.ts`, and
7
+ * a second copy is how two vocabularies drift apart.
8
+ */
9
+ export function normalizeToken(value) {
10
+ return value
11
+ .trim()
12
+ .toLowerCase()
13
+ .replace(/[\s_]+/g, "-");
14
+ }
15
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/model/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC3C,OAAO,KAAK;SACV,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/model/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/model/validation.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { extractPanel } from "../panel/extract.js";
2
+ import { normalizeToken } from "./tokens.js";
2
3
  import { isPropertyObject, propertyNumericValue, propertyQuantityValue, propertyStringValue, } from "./properties.js";
3
4
  export const CONTROL_ROLE_VALUES = [
4
5
  "direct-output",
@@ -1328,12 +1329,6 @@ function parsePositiveInteger(value) {
1328
1329
  const count = Number(trimmed);
1329
1330
  return Number.isInteger(count) && count > 0 ? count : undefined;
1330
1331
  }
1331
- function normalizeToken(value) {
1332
- return value
1333
- .trim()
1334
- .toLowerCase()
1335
- .replace(/[\s_]+/g, "-");
1336
- }
1337
1332
  function validateDeviceInterface(doc, componentIds) {
1338
1333
  const issues = [];
1339
1334
  const groupIds = new Set(doc.controlGroups?.map((group) => group.id) ?? []);