@vessel-dsp/core 0.6.0 → 0.6.2
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/dist/editor/commands.d.ts +48 -0
- package/dist/editor/commands.d.ts.map +1 -0
- package/{src/editor/commands.ts → dist/editor/commands.js} +44 -91
- package/dist/editor/commands.js.map +1 -0
- package/dist/editor/factory.d.ts +10 -0
- package/dist/editor/factory.d.ts.map +1 -0
- package/{src/editor/factory.ts → dist/editor/factory.js} +11 -27
- package/dist/editor/factory.js.map +1 -0
- package/dist/editor/history.d.ts +29 -0
- package/dist/editor/history.d.ts.map +1 -0
- package/{src/editor/history.ts → dist/editor/history.js} +12 -42
- package/dist/editor/history.js.map +1 -0
- package/{src/editor/index.ts → dist/editor/index.d.ts} +1 -3
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +5 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/editor/layout.d.ts +8 -0
- package/dist/editor/layout.d.ts.map +1 -0
- package/{src/editor/layout.ts → dist/editor/layout.js} +36 -90
- package/dist/editor/layout.js.map +1 -0
- package/dist/formats/circuit-json/serializer.d.ts +101 -0
- package/dist/formats/circuit-json/serializer.d.ts.map +1 -0
- package/{src/formats/circuit-json/serializer.ts → dist/formats/circuit-json/serializer.js} +352 -418
- package/dist/formats/circuit-json/serializer.js.map +1 -0
- package/dist/formats/document.d.ts +64 -0
- package/dist/formats/document.d.ts.map +1 -0
- package/{src/formats/document.ts → dist/formats/document.js} +43 -159
- package/dist/formats/document.js.map +1 -0
- package/dist/formats/interchange/parser.d.ts +3 -0
- package/dist/formats/interchange/parser.d.ts.map +1 -0
- package/{src/formats/interchange/parser.ts → dist/formats/interchange/parser.js} +157 -463
- package/dist/formats/interchange/parser.js.map +1 -0
- package/dist/formats/interchange/serializer.d.ts +9 -0
- package/dist/formats/interchange/serializer.d.ts.map +1 -0
- package/{src/formats/interchange/serializer.ts → dist/formats/interchange/serializer.js} +84 -186
- package/dist/formats/interchange/serializer.js.map +1 -0
- package/dist/formats/ltspice/catalog.d.ts +19 -0
- package/dist/formats/ltspice/catalog.d.ts.map +1 -0
- package/{src/formats/ltspice/catalog.ts → dist/formats/ltspice/catalog.js} +18 -52
- package/dist/formats/ltspice/catalog.js.map +1 -0
- package/dist/formats/ltspice/encoding.d.ts +2 -0
- package/dist/formats/ltspice/encoding.d.ts.map +1 -0
- package/{src/formats/ltspice/encoding.ts → dist/formats/ltspice/encoding.js} +17 -41
- package/dist/formats/ltspice/encoding.js.map +1 -0
- package/dist/formats/ltspice/parser.d.ts +3 -0
- package/dist/formats/ltspice/parser.d.ts.map +1 -0
- package/{src/formats/ltspice/parser.ts → dist/formats/ltspice/parser.js} +39 -141
- package/dist/formats/ltspice/parser.js.map +1 -0
- package/dist/formats/ltspice/serializer.d.ts +7 -0
- package/dist/formats/ltspice/serializer.d.ts.map +1 -0
- package/{src/formats/ltspice/serializer.ts → dist/formats/ltspice/serializer.js} +18 -45
- package/dist/formats/ltspice/serializer.js.map +1 -0
- package/dist/formats/schx/catalog.d.ts +19 -0
- package/dist/formats/schx/catalog.d.ts.map +1 -0
- package/{src/formats/schx/catalog.ts → dist/formats/schx/catalog.js} +48 -101
- package/dist/formats/schx/catalog.js.map +1 -0
- package/dist/formats/schx/parser.d.ts +3 -0
- package/dist/formats/schx/parser.d.ts.map +1 -0
- package/{src/formats/schx/parser.ts → dist/formats/schx/parser.js} +31 -86
- package/dist/formats/schx/parser.js.map +1 -0
- package/dist/formats/schx/runtime-descriptors.d.ts +3 -0
- package/dist/formats/schx/runtime-descriptors.d.ts.map +1 -0
- package/{src/formats/schx/runtime-descriptors.ts → dist/formats/schx/runtime-descriptors.js} +36 -123
- package/dist/formats/schx/runtime-descriptors.js.map +1 -0
- package/dist/formats/schx/serializer.d.ts +5 -0
- package/dist/formats/schx/serializer.d.ts.map +1 -0
- package/{src/formats/schx/serializer.ts → dist/formats/schx/serializer.js} +17 -42
- package/dist/formats/schx/serializer.js.map +1 -0
- package/dist/formats/schx/transforms.d.ts +4 -0
- package/dist/formats/schx/transforms.d.ts.map +1 -0
- package/{src/formats/schx/transforms.ts → dist/formats/schx/transforms.js} +6 -10
- package/dist/formats/schx/transforms.js.map +1 -0
- package/dist/formats/spice/parser.d.ts +3 -0
- package/dist/formats/spice/parser.d.ts.map +1 -0
- package/{src/formats/spice/parser.ts → dist/formats/spice/parser.js} +50 -96
- package/dist/formats/spice/parser.js.map +1 -0
- package/dist/formats/spice/serializer.d.ts +3 -0
- package/dist/formats/spice/serializer.d.ts.map +1 -0
- package/{src/formats/spice/serializer.ts → dist/formats/spice/serializer.js} +20 -16
- package/dist/formats/spice/serializer.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/model/connectivity.d.ts +16 -0
- package/dist/model/connectivity.d.ts.map +1 -0
- package/{src/model/connectivity.ts → dist/model/connectivity.js} +28 -63
- package/dist/model/connectivity.js.map +1 -0
- package/dist/model/netlist.d.ts +24 -0
- package/dist/model/netlist.d.ts.map +1 -0
- package/{src/model/netlist.ts → dist/model/netlist.js} +42 -110
- package/dist/model/netlist.js.map +1 -0
- package/dist/model/properties.d.ts +9 -0
- package/dist/model/properties.d.ts.map +1 -0
- package/{src/model/properties.ts → dist/model/properties.js} +10 -18
- package/dist/model/properties.js.map +1 -0
- package/dist/model/quantity.d.ts +3 -0
- package/dist/model/quantity.d.ts.map +1 -0
- package/{src/model/quantity.ts → dist/model/quantity.js} +7 -30
- package/dist/model/quantity.js.map +1 -0
- package/{src/model/types.ts → dist/model/types.d.ts} +17 -196
- package/dist/model/types.d.ts.map +1 -0
- package/dist/model/types.js +10 -0
- package/dist/model/types.js.map +1 -0
- package/dist/model/validation.d.ts +32 -0
- package/dist/model/validation.d.ts.map +1 -0
- package/{src/model/validation.ts → dist/model/validation.js} +172 -653
- package/dist/model/validation.js.map +1 -0
- package/dist/model/wires.d.ts +3 -0
- package/dist/model/wires.d.ts.map +1 -0
- package/{src/model/wires.ts → dist/model/wires.js} +10 -16
- package/dist/model/wires.js.map +1 -0
- package/dist/panel/extract.d.ts +5 -0
- package/dist/panel/extract.d.ts.map +1 -0
- package/{src/panel/extract.ts → dist/panel/extract.js} +146 -235
- package/dist/panel/extract.js.map +1 -0
- package/dist/panel/index.d.ts +6 -0
- package/dist/panel/index.d.ts.map +1 -0
- package/dist/panel/index.js +5 -0
- package/dist/panel/index.js.map +1 -0
- package/dist/panel/knobs.d.ts +7 -0
- package/dist/panel/knobs.d.ts.map +1 -0
- package/{src/panel/knobs.ts → dist/panel/knobs.js} +7 -18
- package/dist/panel/knobs.js.map +1 -0
- package/dist/panel/protocol.d.ts +9 -0
- package/dist/panel/protocol.d.ts.map +1 -0
- package/{src/panel/protocol.ts → dist/panel/protocol.js} +10 -26
- package/dist/panel/protocol.js.map +1 -0
- package/{src/panel/types.ts → dist/panel/types.d.ts} +50 -89
- package/dist/panel/types.d.ts.map +1 -0
- package/dist/panel/types.js +2 -0
- package/dist/panel/types.js.map +1 -0
- package/dist/preview/bounds.d.ts +12 -0
- package/dist/preview/bounds.d.ts.map +1 -0
- package/{src/preview/bounds.ts → dist/preview/bounds.js} +15 -29
- package/dist/preview/bounds.js.map +1 -0
- package/dist/preview/box-layout.d.ts +4 -0
- package/dist/preview/box-layout.d.ts.map +1 -0
- package/{src/preview/box-layout.ts → dist/preview/box-layout.js} +2 -6
- package/dist/preview/box-layout.js.map +1 -0
- package/dist/preview/colors.d.ts +3 -0
- package/dist/preview/colors.d.ts.map +1 -0
- package/{src/preview/colors.ts → dist/preview/colors.js} +3 -5
- package/dist/preview/colors.js.map +1 -0
- package/dist/preview/hanging.d.ts +8 -0
- package/dist/preview/hanging.d.ts.map +1 -0
- package/{src/preview/hanging.ts → dist/preview/hanging.js} +9 -28
- package/dist/preview/hanging.js.map +1 -0
- package/dist/preview/junctions.d.ts +3 -0
- package/dist/preview/junctions.d.ts.map +1 -0
- package/{src/preview/junctions.ts → dist/preview/junctions.js} +9 -24
- package/dist/preview/junctions.js.map +1 -0
- package/dist/preview/label-layout.d.ts +12 -0
- package/dist/preview/label-layout.d.ts.map +1 -0
- package/{src/preview/label-layout.ts → dist/preview/label-layout.js} +15 -36
- package/dist/preview/label-layout.js.map +1 -0
- package/dist/preview/ports.d.ts +17 -0
- package/dist/preview/ports.d.ts.map +1 -0
- package/{src/preview/ports.ts → dist/preview/ports.js} +10 -37
- package/dist/preview/ports.js.map +1 -0
- package/dist/preview/renderable-wires.d.ts +3 -0
- package/dist/preview/renderable-wires.d.ts.map +1 -0
- package/{src/preview/renderable-wires.ts → dist/preview/renderable-wires.js} +12 -29
- package/dist/preview/renderable-wires.js.map +1 -0
- package/dist/preview/routing.d.ts +4 -0
- package/dist/preview/routing.d.ts.map +1 -0
- package/dist/preview/routing.js +13 -0
- package/dist/preview/routing.js.map +1 -0
- package/dist/preview/snap.d.ts +9 -0
- package/dist/preview/snap.d.ts.map +1 -0
- package/{src/preview/snap.ts → dist/preview/snap.js} +9 -31
- package/dist/preview/snap.js.map +1 -0
- package/dist/preview/symbols/svg-content.d.ts +7 -0
- package/dist/preview/symbols/svg-content.d.ts.map +1 -0
- package/{src/preview/symbols/svg-content.ts → dist/preview/symbols/svg-content.js} +3 -6
- package/dist/preview/symbols/svg-content.js.map +1 -0
- package/dist/preview/symbols.d.ts +7 -0
- package/dist/preview/symbols.d.ts.map +1 -0
- package/{src/preview/symbols.ts → dist/preview/symbols.js} +18 -43
- package/dist/preview/symbols.js.map +1 -0
- package/dist/preview/wire-chains.d.ts +4 -0
- package/dist/preview/wire-chains.d.ts.map +1 -0
- package/{src/preview/wire-chains.ts → dist/preview/wire-chains.js} +37 -37
- package/dist/preview/wire-chains.js.map +1 -0
- package/package.json +3 -3
- package/src/index.ts +0 -255
- package/src/panel/index.ts +0 -39
- package/src/preview/routing.ts +0 -15
- package/src/preview/symbols/analog-switch.svg +0 -17
- package/src/preview/symbols/battery.svg +0 -16
- package/src/preview/symbols/bbd.svg +0 -21
- package/src/preview/symbols/bjt-npn.svg +0 -16
- package/src/preview/symbols/bjt-pnp.svg +0 -17
- package/src/preview/symbols/capacitor-electrolytic.svg +0 -13
- package/src/preview/symbols/capacitor.svg +0 -12
- package/src/preview/symbols/current-source.svg +0 -14
- package/src/preview/symbols/delay-ic.svg +0 -22
- package/src/preview/symbols/diode-schottky.svg +0 -12
- package/src/preview/symbols/diode-zener.svg +0 -12
- package/src/preview/symbols/diode.svg +0 -13
- package/src/preview/symbols/flipflop.svg +0 -20
- package/src/preview/symbols/ground.svg +0 -12
- package/src/preview/symbols/ic-block.svg +0 -20
- package/src/preview/symbols/ic.svg +0 -19
- package/src/preview/symbols/inductor.svg +0 -11
- package/src/preview/symbols/jack-input.svg +0 -16
- package/src/preview/symbols/jack-output.svg +0 -16
- package/src/preview/symbols/jfet-junction-n.svg +0 -17
- package/src/preview/symbols/jfet-n.svg +0 -17
- package/src/preview/symbols/jfet-p.svg +0 -17
- package/src/preview/symbols/label.svg +0 -8
- package/src/preview/symbols/led.svg +0 -18
- package/src/preview/symbols/mosfet-n.svg +0 -21
- package/src/preview/symbols/mosfet-p.svg +0 -21
- package/src/preview/symbols/named-wire.svg +0 -11
- package/src/preview/symbols/opamp.svg +0 -21
- package/src/preview/symbols/optocoupler.svg +0 -30
- package/src/preview/symbols/ota.svg +0 -20
- package/src/preview/symbols/pentode.svg +0 -25
- package/src/preview/symbols/photoresistor.svg +0 -19
- package/src/preview/symbols/port.svg +0 -8
- package/src/preview/symbols/potentiometer.svg +0 -15
- package/src/preview/symbols/power-amp.svg +0 -20
- package/src/preview/symbols/rail.svg +0 -11
- package/src/preview/symbols/regulator.svg +0 -13
- package/src/preview/symbols/relay.svg +0 -20
- package/src/preview/symbols/resistor.svg +0 -11
- package/src/preview/symbols/switch-3pdt.svg +0 -32
- package/src/preview/symbols/switch-rotary.svg +0 -23
- package/src/preview/symbols/switch-spdt.svg +0 -16
- package/src/preview/symbols/switch-spst.svg +0 -14
- package/src/preview/symbols/switch-toggle.svg +0 -14
- package/src/preview/symbols/transformer.svg +0 -17
- package/src/preview/symbols/triode.svg +0 -17
- package/src/preview/symbols/tube-diode.svg +0 -13
- package/src/preview/symbols/unsupported.svg +0 -8
- package/src/preview/symbols/variable-resistor.svg +0 -13
- package/src/preview/symbols/voltage-source.svg +0 -15
|
@@ -1,29 +1,7 @@
|
|
|
1
|
-
import { getPinNode, resolveConnectivity
|
|
2
|
-
import { parseQuantity } from './quantity';
|
|
3
|
-
import { propertyQuantityValue, propertyStringValue } from './properties';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export type SpiceLetter = 'R' | 'C' | 'L' | 'D' | 'Q' | 'J' | 'M' | 'V' | 'I';
|
|
7
|
-
|
|
8
|
-
export type NetlistComponent = Readonly<{
|
|
9
|
-
id: string;
|
|
10
|
-
kind: ComponentKind;
|
|
11
|
-
spiceLetter: SpiceLetter | null;
|
|
12
|
-
value: ParsedQuantity | null;
|
|
13
|
-
nodes: readonly NodeId[];
|
|
14
|
-
model: string | null;
|
|
15
|
-
extras: Readonly<Record<string, string>>;
|
|
16
|
-
}>;
|
|
17
|
-
|
|
18
|
-
export type NetlistView = Readonly<{
|
|
19
|
-
components: readonly NetlistComponent[];
|
|
20
|
-
nodeCount: number;
|
|
21
|
-
groundNodeId: NodeId | null;
|
|
22
|
-
directives: readonly string[];
|
|
23
|
-
warnings: readonly string[];
|
|
24
|
-
}>;
|
|
25
|
-
|
|
26
|
-
const SPICE_LETTER: Partial<Record<ComponentKind, SpiceLetter>> = {
|
|
1
|
+
import { getPinNode, resolveConnectivity } from './connectivity.js';
|
|
2
|
+
import { parseQuantity } from './quantity.js';
|
|
3
|
+
import { propertyQuantityValue, propertyStringValue } from './properties.js';
|
|
4
|
+
const SPICE_LETTER = {
|
|
27
5
|
resistor: 'R',
|
|
28
6
|
'variable-resistor': 'R',
|
|
29
7
|
capacitor: 'C',
|
|
@@ -38,8 +16,7 @@ const SPICE_LETTER: Partial<Record<ComponentKind, SpiceLetter>> = {
|
|
|
38
16
|
battery: 'V',
|
|
39
17
|
rail: 'V',
|
|
40
18
|
};
|
|
41
|
-
|
|
42
|
-
const NODE_ORDER: Partial<Record<ComponentKind, readonly string[]>> = {
|
|
19
|
+
const NODE_ORDER = {
|
|
43
20
|
resistor: ['a', 'b'],
|
|
44
21
|
'variable-resistor': ['a', 'b'],
|
|
45
22
|
capacitor: ['a', 'b'],
|
|
@@ -60,8 +37,7 @@ const NODE_ORDER: Partial<Record<ComponentKind, readonly string[]>> = {
|
|
|
60
37
|
triode: ['plate', 'grid', 'cathode'],
|
|
61
38
|
pentode: ['plate', 'screen', 'grid', 'cathode', 'suppressor'],
|
|
62
39
|
};
|
|
63
|
-
|
|
64
|
-
const VALUE_PROPERTY: Partial<Record<ComponentKind, string>> = {
|
|
40
|
+
const VALUE_PROPERTY = {
|
|
65
41
|
resistor: 'R',
|
|
66
42
|
'variable-resistor': 'R',
|
|
67
43
|
capacitor: 'C',
|
|
@@ -71,10 +47,9 @@ const VALUE_PROPERTY: Partial<Record<ComponentKind, string>> = {
|
|
|
71
47
|
battery: 'V',
|
|
72
48
|
rail: 'V',
|
|
73
49
|
};
|
|
74
|
-
|
|
75
50
|
// Source-format aliases for the value property (e.g. LiveSPICE stores R as "Resistance").
|
|
76
51
|
// Keep in sync with the alias lists in src/model/validation.ts until both fold into the catalog.
|
|
77
|
-
const VALUE_PROPERTY_ALIASES
|
|
52
|
+
const VALUE_PROPERTY_ALIASES = {
|
|
78
53
|
resistor: ['Resistance', 'resistance'],
|
|
79
54
|
'variable-resistor': ['Resistance', 'resistance'],
|
|
80
55
|
capacitor: ['Capacitance', 'capacitance'],
|
|
@@ -84,8 +59,7 @@ const VALUE_PROPERTY_ALIASES: Partial<Record<ComponentKind, readonly string[]>>
|
|
|
84
59
|
battery: ['Voltage', 'voltage'],
|
|
85
60
|
rail: ['Voltage', 'voltage'],
|
|
86
61
|
};
|
|
87
|
-
|
|
88
|
-
const REQUIRES_VALUE: ReadonlySet<ComponentKind> = new Set<ComponentKind>([
|
|
62
|
+
const REQUIRES_VALUE = new Set([
|
|
89
63
|
'resistor',
|
|
90
64
|
'capacitor',
|
|
91
65
|
'inductor',
|
|
@@ -94,8 +68,7 @@ const REQUIRES_VALUE: ReadonlySet<ComponentKind> = new Set<ComponentKind>([
|
|
|
94
68
|
'battery',
|
|
95
69
|
'rail',
|
|
96
70
|
]);
|
|
97
|
-
|
|
98
|
-
const HAS_MODEL: ReadonlySet<ComponentKind> = new Set<ComponentKind>([
|
|
71
|
+
const HAS_MODEL = new Set([
|
|
99
72
|
'diode',
|
|
100
73
|
'led',
|
|
101
74
|
'bjt',
|
|
@@ -106,16 +79,14 @@ const HAS_MODEL: ReadonlySet<ComponentKind> = new Set<ComponentKind>([
|
|
|
106
79
|
'pentode',
|
|
107
80
|
'tube-diode',
|
|
108
81
|
]);
|
|
109
|
-
|
|
110
|
-
const SKIP_KINDS: ReadonlySet<ComponentKind> = new Set<ComponentKind>([
|
|
82
|
+
const SKIP_KINDS = new Set([
|
|
111
83
|
'ground',
|
|
112
84
|
'label',
|
|
113
85
|
'named-wire',
|
|
114
86
|
'port',
|
|
115
87
|
'jack',
|
|
116
88
|
]);
|
|
117
|
-
|
|
118
|
-
const MODEL_PROPERTY_NAMES: readonly string[] = [
|
|
89
|
+
const MODEL_PROPERTY_NAMES = [
|
|
119
90
|
'model',
|
|
120
91
|
'Model',
|
|
121
92
|
'modelName',
|
|
@@ -124,16 +95,13 @@ const MODEL_PROPERTY_NAMES: readonly string[] = [
|
|
|
124
95
|
'PartNumber',
|
|
125
96
|
'Type',
|
|
126
97
|
];
|
|
127
|
-
|
|
128
|
-
export function getSpiceLetter(kind: ComponentKind): SpiceLetter | null {
|
|
98
|
+
export function getSpiceLetter(kind) {
|
|
129
99
|
return SPICE_LETTER[kind] ?? null;
|
|
130
100
|
}
|
|
131
|
-
|
|
132
|
-
export function getSpiceNodeOrder(kind: ComponentKind): readonly string[] | null {
|
|
101
|
+
export function getSpiceNodeOrder(kind) {
|
|
133
102
|
return NODE_ORDER[kind] ?? null;
|
|
134
103
|
}
|
|
135
|
-
|
|
136
|
-
export function kindForSpiceLetter(letter: SpiceLetter): ComponentKind {
|
|
104
|
+
export function kindForSpiceLetter(letter) {
|
|
137
105
|
switch (letter) {
|
|
138
106
|
case 'R': return 'resistor';
|
|
139
107
|
case 'C': return 'capacitor';
|
|
@@ -146,54 +114,44 @@ export function kindForSpiceLetter(letter: SpiceLetter): ComponentKind {
|
|
|
146
114
|
case 'I': return 'current-source';
|
|
147
115
|
}
|
|
148
116
|
}
|
|
149
|
-
|
|
150
|
-
export function toNetlistView(doc: CircuitDocument, precomputed?: Connectivity): NetlistView {
|
|
117
|
+
export function toNetlistView(doc, precomputed) {
|
|
151
118
|
const connectivity = precomputed ?? resolveConnectivity(doc);
|
|
152
|
-
const components
|
|
153
|
-
const warnings
|
|
154
|
-
|
|
119
|
+
const components = [];
|
|
120
|
+
const warnings = [];
|
|
155
121
|
for (const component of doc.components) {
|
|
156
122
|
if (SKIP_KINDS.has(component.kind)) {
|
|
157
123
|
continue;
|
|
158
124
|
}
|
|
159
|
-
|
|
160
125
|
if (component.kind === 'unsupported') {
|
|
161
|
-
warnings.push(
|
|
162
|
-
`${component.id}: unsupported source type ${component.sourceTypeName ?? 'unknown'} — skipped from netlist`,
|
|
163
|
-
);
|
|
126
|
+
warnings.push(`${component.id}: unsupported source type ${component.sourceTypeName ?? 'unknown'} — skipped from netlist`);
|
|
164
127
|
continue;
|
|
165
128
|
}
|
|
166
|
-
|
|
167
129
|
// Components that need a SPICE subcircuit (opamps, pots, tubes, etc.) are signaled
|
|
168
130
|
// structurally via `spiceLetter: null` — no per-component warning needed.
|
|
169
|
-
|
|
170
131
|
const spiceLetter = SPICE_LETTER[component.kind] ?? null;
|
|
171
132
|
const expectedOrder = spiceLetter === null && component.terminals.length === 0
|
|
172
133
|
? null
|
|
173
134
|
: NODE_ORDER[component.kind] ?? null;
|
|
174
135
|
const ordered = orderedNodes(component, connectivity, expectedOrder);
|
|
175
136
|
warnings.push(...ordered.warnings);
|
|
176
|
-
|
|
177
137
|
let nodes = ordered.nodes;
|
|
178
138
|
if (component.kind === 'rail') {
|
|
179
139
|
// Append implicit ground as the negative terminal so the SPICE row is well-shaped.
|
|
180
140
|
if (connectivity.groundNodeId === null) {
|
|
181
141
|
warnings.push(`${component.id} (rail): no ground node in document — cannot anchor implicit return`);
|
|
182
|
-
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
183
144
|
nodes = [...nodes, connectivity.groundNodeId];
|
|
184
145
|
}
|
|
185
146
|
}
|
|
186
|
-
|
|
187
147
|
const valueResult = extractValue(component);
|
|
188
148
|
const value = valueResult.value;
|
|
189
149
|
if (value === null && REQUIRES_VALUE.has(component.kind) && !valueResult.present) {
|
|
190
150
|
warnings.push(`${component.id} (${component.kind}): missing required value property`);
|
|
191
151
|
}
|
|
192
|
-
|
|
193
152
|
const model = extractModel(component);
|
|
194
153
|
const consumed = consumedPropertyKeys(component.kind);
|
|
195
154
|
const extras = extractExtras(component, consumed);
|
|
196
|
-
|
|
197
155
|
components.push({
|
|
198
156
|
id: component.id,
|
|
199
157
|
kind: component.kind,
|
|
@@ -204,7 +162,6 @@ export function toNetlistView(doc: CircuitDocument, precomputed?: Connectivity):
|
|
|
204
162
|
extras,
|
|
205
163
|
});
|
|
206
164
|
}
|
|
207
|
-
|
|
208
165
|
return {
|
|
209
166
|
components,
|
|
210
167
|
nodeCount: connectivity.nodeCount,
|
|
@@ -213,23 +170,15 @@ export function toNetlistView(doc: CircuitDocument, precomputed?: Connectivity):
|
|
|
213
170
|
warnings,
|
|
214
171
|
};
|
|
215
172
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
component: Component,
|
|
219
|
-
connectivity: Connectivity,
|
|
220
|
-
expected: readonly string[] | null,
|
|
221
|
-
): { nodes: readonly NodeId[]; warnings: readonly string[] } {
|
|
222
|
-
const warnings: string[] = [];
|
|
223
|
-
|
|
173
|
+
function orderedNodes(component, connectivity, expected) {
|
|
174
|
+
const warnings = [];
|
|
224
175
|
if (expected === null) {
|
|
225
176
|
const nodes = collectDeclarationOrder(component, connectivity, warnings);
|
|
226
177
|
return { nodes, warnings };
|
|
227
178
|
}
|
|
228
|
-
|
|
229
179
|
const byName = new Map(component.terminals.map((t) => [t.name, t]));
|
|
230
|
-
const missing
|
|
231
|
-
const ordered
|
|
232
|
-
|
|
180
|
+
const missing = [];
|
|
181
|
+
const ordered = [];
|
|
233
182
|
for (const name of expected) {
|
|
234
183
|
const terminal = byName.get(name);
|
|
235
184
|
if (terminal === undefined) {
|
|
@@ -239,45 +188,36 @@ function orderedNodes(
|
|
|
239
188
|
const node = getPinNode(connectivity, { componentId: component.id, terminalName: name });
|
|
240
189
|
if (node === undefined) {
|
|
241
190
|
warnings.push(`${component.id}: terminal "${name}" has no resolved node`);
|
|
242
|
-
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
243
193
|
ordered.push(node);
|
|
244
194
|
}
|
|
245
195
|
}
|
|
246
|
-
|
|
247
196
|
if (missing.length > 0) {
|
|
248
|
-
warnings.push(
|
|
249
|
-
`${component.id} (${component.kind}): expected terminals [${expected.join(', ')}], missing [${missing.join(', ')}] — falling back to declaration order`,
|
|
250
|
-
);
|
|
197
|
+
warnings.push(`${component.id} (${component.kind}): expected terminals [${expected.join(', ')}], missing [${missing.join(', ')}] — falling back to declaration order`);
|
|
251
198
|
const fallback = collectDeclarationOrder(component, connectivity, warnings);
|
|
252
199
|
return { nodes: fallback, warnings };
|
|
253
200
|
}
|
|
254
|
-
|
|
255
201
|
return { nodes: ordered, warnings };
|
|
256
202
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
component: Component,
|
|
260
|
-
connectivity: Connectivity,
|
|
261
|
-
warnings: string[],
|
|
262
|
-
): readonly NodeId[] {
|
|
263
|
-
const nodes: NodeId[] = [];
|
|
203
|
+
function collectDeclarationOrder(component, connectivity, warnings) {
|
|
204
|
+
const nodes = [];
|
|
264
205
|
for (const terminal of component.terminals) {
|
|
265
206
|
const node = getPinNode(connectivity, { componentId: component.id, terminalName: terminal.name });
|
|
266
207
|
if (node === undefined) {
|
|
267
208
|
warnings.push(`${component.id}: terminal "${terminal.name}" has no resolved node`);
|
|
268
|
-
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
269
211
|
nodes.push(node);
|
|
270
212
|
}
|
|
271
213
|
}
|
|
272
214
|
return nodes;
|
|
273
215
|
}
|
|
274
|
-
|
|
275
|
-
function extractValue(component: Component): { value: ParsedQuantity | null; present: boolean } {
|
|
216
|
+
function extractValue(component) {
|
|
276
217
|
const baseName = VALUE_PROPERTY[component.kind];
|
|
277
218
|
if (baseName === undefined) {
|
|
278
219
|
return { value: null, present: false };
|
|
279
220
|
}
|
|
280
|
-
|
|
281
221
|
const aliases = VALUE_PROPERTY_ALIASES[component.kind] ?? [];
|
|
282
222
|
const variants = uniqueVariants([
|
|
283
223
|
baseName,
|
|
@@ -288,7 +228,6 @@ function extractValue(component: Component): { value: ParsedQuantity | null; pre
|
|
|
288
228
|
'value',
|
|
289
229
|
'Value',
|
|
290
230
|
]);
|
|
291
|
-
|
|
292
231
|
for (const name of variants) {
|
|
293
232
|
const raw = component.properties[name];
|
|
294
233
|
if (raw === undefined) {
|
|
@@ -301,8 +240,7 @@ function extractValue(component: Component): { value: ParsedQuantity | null; pre
|
|
|
301
240
|
}
|
|
302
241
|
return { value: null, present: false };
|
|
303
242
|
}
|
|
304
|
-
|
|
305
|
-
function extractModel(component: Component): string | null {
|
|
243
|
+
function extractModel(component) {
|
|
306
244
|
if (!HAS_MODEL.has(component.kind)) {
|
|
307
245
|
return null;
|
|
308
246
|
}
|
|
@@ -314,9 +252,8 @@ function extractModel(component: Component): string | null {
|
|
|
314
252
|
}
|
|
315
253
|
return null;
|
|
316
254
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
const consumed = new Set<string>();
|
|
255
|
+
function consumedPropertyKeys(kind) {
|
|
256
|
+
const consumed = new Set();
|
|
320
257
|
const baseName = VALUE_PROPERTY[kind];
|
|
321
258
|
if (baseName !== undefined) {
|
|
322
259
|
consumed.add(baseName);
|
|
@@ -336,12 +273,8 @@ function consumedPropertyKeys(kind: ComponentKind): ReadonlySet<string> {
|
|
|
336
273
|
}
|
|
337
274
|
return consumed;
|
|
338
275
|
}
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
component: Component,
|
|
342
|
-
consumed: ReadonlySet<string>,
|
|
343
|
-
): Readonly<Record<string, string>> {
|
|
344
|
-
const extras: Record<string, string> = {};
|
|
276
|
+
function extractExtras(component, consumed) {
|
|
277
|
+
const extras = {};
|
|
345
278
|
for (const [key, value] of Object.entries(component.properties)) {
|
|
346
279
|
if (consumed.has(key)) {
|
|
347
280
|
continue;
|
|
@@ -353,10 +286,9 @@ function extractExtras(
|
|
|
353
286
|
}
|
|
354
287
|
return extras;
|
|
355
288
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
const
|
|
359
|
-
const out: string[] = [];
|
|
289
|
+
function uniqueVariants(input) {
|
|
290
|
+
const seen = new Set();
|
|
291
|
+
const out = [];
|
|
360
292
|
for (const name of input) {
|
|
361
293
|
if (seen.has(name)) {
|
|
362
294
|
continue;
|
|
@@ -366,10 +298,10 @@ function uniqueVariants(input: readonly string[]): readonly string[] {
|
|
|
366
298
|
}
|
|
367
299
|
return out;
|
|
368
300
|
}
|
|
369
|
-
|
|
370
|
-
function capitalize(s: string): string {
|
|
301
|
+
function capitalize(s) {
|
|
371
302
|
if (s.length === 0) {
|
|
372
303
|
return s;
|
|
373
304
|
}
|
|
374
305
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
375
306
|
}
|
|
307
|
+
//# sourceMappingURL=netlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netlist.js","sourceRoot":"","sources":["../../src/model/netlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ParsedQuantity, PropertyObject, PropertyValue } from './types';
|
|
2
|
+
export declare function isParsedQuantity(value: unknown): value is ParsedQuantity;
|
|
3
|
+
export declare function isPropertyObject(value: PropertyValue | undefined): value is PropertyObject;
|
|
4
|
+
export declare function propertyStringValue(value: PropertyValue | undefined): string | null;
|
|
5
|
+
export declare function propertyQuantityValue(value: PropertyValue | undefined): ParsedQuantity | null;
|
|
6
|
+
export declare function propertyNumericValue(value: PropertyValue | undefined): number | undefined;
|
|
7
|
+
export declare function propertyBooleanValue(value: PropertyValue | undefined): boolean | undefined;
|
|
8
|
+
export declare function propertyValueForSourceAttribute(value: PropertyValue): string | null;
|
|
9
|
+
//# sourceMappingURL=properties.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/model/properties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAOxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,KAAK,IAAI,cAAc,CAE1F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAcnF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAkB7F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBzF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAe1F;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAMnF"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import { parseQuantity } from './quantity';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export function isParsedQuantity(value: unknown): value is ParsedQuantity {
|
|
1
|
+
import { parseQuantity } from './quantity.js';
|
|
2
|
+
export function isParsedQuantity(value) {
|
|
5
3
|
if (!isUnknownRecord(value)) {
|
|
6
4
|
return false;
|
|
7
5
|
}
|
|
@@ -9,12 +7,10 @@ export function isParsedQuantity(value: unknown): value is ParsedQuantity {
|
|
|
9
7
|
typeof value['value'] === 'number' &&
|
|
10
8
|
typeof value['unit'] === 'string';
|
|
11
9
|
}
|
|
12
|
-
|
|
13
|
-
export function isPropertyObject(value: PropertyValue | undefined): value is PropertyObject {
|
|
10
|
+
export function isPropertyObject(value) {
|
|
14
11
|
return isUnknownRecord(value) && !Array.isArray(value) && !isParsedQuantity(value);
|
|
15
12
|
}
|
|
16
|
-
|
|
17
|
-
export function propertyStringValue(value: PropertyValue | undefined): string | null {
|
|
13
|
+
export function propertyStringValue(value) {
|
|
18
14
|
if (value === undefined || value === null) {
|
|
19
15
|
return null;
|
|
20
16
|
}
|
|
@@ -29,8 +25,7 @@ export function propertyStringValue(value: PropertyValue | undefined): string |
|
|
|
29
25
|
}
|
|
30
26
|
return null;
|
|
31
27
|
}
|
|
32
|
-
|
|
33
|
-
export function propertyQuantityValue(value: PropertyValue | undefined): ParsedQuantity | null {
|
|
28
|
+
export function propertyQuantityValue(value) {
|
|
34
29
|
if (value === undefined || value === null) {
|
|
35
30
|
return null;
|
|
36
31
|
}
|
|
@@ -49,8 +44,7 @@ export function propertyQuantityValue(value: PropertyValue | undefined): ParsedQ
|
|
|
49
44
|
}
|
|
50
45
|
return null;
|
|
51
46
|
}
|
|
52
|
-
|
|
53
|
-
export function propertyNumericValue(value: PropertyValue | undefined): number | undefined {
|
|
47
|
+
export function propertyNumericValue(value) {
|
|
54
48
|
if (value === undefined || value === null) {
|
|
55
49
|
return undefined;
|
|
56
50
|
}
|
|
@@ -70,8 +64,7 @@ export function propertyNumericValue(value: PropertyValue | undefined): number |
|
|
|
70
64
|
}
|
|
71
65
|
return undefined;
|
|
72
66
|
}
|
|
73
|
-
|
|
74
|
-
export function propertyBooleanValue(value: PropertyValue | undefined): boolean | undefined {
|
|
67
|
+
export function propertyBooleanValue(value) {
|
|
75
68
|
if (value === undefined || value === null) {
|
|
76
69
|
return undefined;
|
|
77
70
|
}
|
|
@@ -87,15 +80,14 @@ export function propertyBooleanValue(value: PropertyValue | undefined): boolean
|
|
|
87
80
|
}
|
|
88
81
|
return undefined;
|
|
89
82
|
}
|
|
90
|
-
|
|
91
|
-
export function propertyValueForSourceAttribute(value: PropertyValue): string | null {
|
|
83
|
+
export function propertyValueForSourceAttribute(value) {
|
|
92
84
|
const scalar = propertyStringValue(value);
|
|
93
85
|
if (scalar !== null) {
|
|
94
86
|
return scalar;
|
|
95
87
|
}
|
|
96
88
|
return null;
|
|
97
89
|
}
|
|
98
|
-
|
|
99
|
-
function isUnknownRecord(value: unknown): value is Record<string, unknown> {
|
|
90
|
+
function isUnknownRecord(value) {
|
|
100
91
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
101
92
|
}
|
|
93
|
+
//# sourceMappingURL=properties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../src/model/properties.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quantity.d.ts","sourceRoot":"","sources":["../../src/model/quantity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA8D9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAmClE"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const SI_PREFIXES: Readonly<Record<string, number>> = {
|
|
1
|
+
const SI_PREFIXES = {
|
|
4
2
|
f: 1e-15,
|
|
5
3
|
p: 1e-12,
|
|
6
4
|
n: 1e-9,
|
|
@@ -14,8 +12,7 @@ const SI_PREFIXES: Readonly<Record<string, number>> = {
|
|
|
14
12
|
G: 1e9,
|
|
15
13
|
T: 1e12,
|
|
16
14
|
};
|
|
17
|
-
|
|
18
|
-
const SHORTHAND_MARKERS: Readonly<Record<string, { readonly multiplier: number; readonly impliedUnit?: string }>> = {
|
|
15
|
+
const SHORTHAND_MARKERS = {
|
|
19
16
|
f: { multiplier: 1e-15 },
|
|
20
17
|
p: { multiplier: 1e-12 },
|
|
21
18
|
n: { multiplier: 1e-9 },
|
|
@@ -31,8 +28,7 @@ const SHORTHAND_MARKERS: Readonly<Record<string, { readonly multiplier: number;
|
|
|
31
28
|
R: { multiplier: 1, impliedUnit: 'Ω' },
|
|
32
29
|
r: { multiplier: 1, impliedUnit: 'Ω' },
|
|
33
30
|
};
|
|
34
|
-
|
|
35
|
-
const UNIT_ALIASES: Readonly<Record<string, string>> = {
|
|
31
|
+
const UNIT_ALIASES = {
|
|
36
32
|
F: 'F',
|
|
37
33
|
f: 'F',
|
|
38
34
|
H: 'H',
|
|
@@ -55,54 +51,44 @@ const UNIT_ALIASES: Readonly<Record<string, string>> = {
|
|
|
55
51
|
s: 's',
|
|
56
52
|
S: 's',
|
|
57
53
|
};
|
|
58
|
-
|
|
59
54
|
const QUANTITY_REGEX = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:[eE][+-]?\d+)?)([A-Za-zµμΩΩ]*)$/;
|
|
60
55
|
const SHORTHAND_QUANTITY_REGEX = /^([+-]?\d+)([fFpPnNuUµμmMkKGTRr])(\d+)([A-Za-zµμΩΩ]*)$/;
|
|
61
56
|
const SPICE_MEG = /^(?:Meg|MEG|meg)/;
|
|
62
|
-
|
|
63
|
-
export function parseQuantity(input: string): ParsedQuantity | null {
|
|
57
|
+
export function parseQuantity(input) {
|
|
64
58
|
const raw = input.trim();
|
|
65
59
|
if (raw.length === 0) {
|
|
66
60
|
return null;
|
|
67
61
|
}
|
|
68
|
-
|
|
69
62
|
const compact = raw.replace(/\s+/g, '');
|
|
70
63
|
const shorthand = parseShorthandQuantity(raw, compact);
|
|
71
64
|
if (shorthand !== null) {
|
|
72
65
|
return shorthand;
|
|
73
66
|
}
|
|
74
|
-
|
|
75
67
|
const match = compact.match(QUANTITY_REGEX);
|
|
76
68
|
if (!match) {
|
|
77
69
|
return null;
|
|
78
70
|
}
|
|
79
|
-
|
|
80
71
|
const numStr = match[1];
|
|
81
72
|
const suffix = match[2] ?? '';
|
|
82
73
|
if (numStr === undefined) {
|
|
83
74
|
return null;
|
|
84
75
|
}
|
|
85
|
-
|
|
86
76
|
const baseValue = Number.parseFloat(numStr);
|
|
87
77
|
if (!Number.isFinite(baseValue)) {
|
|
88
78
|
return null;
|
|
89
79
|
}
|
|
90
|
-
|
|
91
80
|
const parsed = parseSuffix(suffix);
|
|
92
|
-
|
|
93
81
|
return {
|
|
94
82
|
raw,
|
|
95
83
|
value: baseValue * parsed.multiplier,
|
|
96
84
|
unit: parsed.unit,
|
|
97
85
|
};
|
|
98
86
|
}
|
|
99
|
-
|
|
100
|
-
function parseShorthandQuantity(raw: string, compact: string): ParsedQuantity | null {
|
|
87
|
+
function parseShorthandQuantity(raw, compact) {
|
|
101
88
|
const match = compact.match(SHORTHAND_QUANTITY_REGEX);
|
|
102
89
|
if (match === null) {
|
|
103
90
|
return null;
|
|
104
91
|
}
|
|
105
|
-
|
|
106
92
|
const whole = match[1];
|
|
107
93
|
const marker = match[2];
|
|
108
94
|
const fractional = match[3];
|
|
@@ -110,34 +96,28 @@ function parseShorthandQuantity(raw: string, compact: string): ParsedQuantity |
|
|
|
110
96
|
if (whole === undefined || marker === undefined || fractional === undefined) {
|
|
111
97
|
return null;
|
|
112
98
|
}
|
|
113
|
-
|
|
114
99
|
const markerDef = SHORTHAND_MARKERS[marker];
|
|
115
100
|
if (markerDef === undefined) {
|
|
116
101
|
return null;
|
|
117
102
|
}
|
|
118
|
-
|
|
119
103
|
const value = Number.parseFloat(`${whole}.${fractional}`);
|
|
120
104
|
if (!Number.isFinite(value)) {
|
|
121
105
|
return null;
|
|
122
106
|
}
|
|
123
|
-
|
|
124
107
|
const aliasedTrailingUnit = UNIT_ALIASES[trailingUnit];
|
|
125
108
|
const unit = trailingUnit.length > 0
|
|
126
109
|
? aliasedTrailingUnit ?? trailingUnit
|
|
127
110
|
: markerDef.impliedUnit ?? '';
|
|
128
|
-
|
|
129
111
|
return {
|
|
130
112
|
raw,
|
|
131
113
|
value: value * markerDef.multiplier,
|
|
132
114
|
unit,
|
|
133
115
|
};
|
|
134
116
|
}
|
|
135
|
-
|
|
136
|
-
function parseSuffix(suffix: string): { multiplier: number; unit: string } {
|
|
117
|
+
function parseSuffix(suffix) {
|
|
137
118
|
if (suffix.length === 0) {
|
|
138
119
|
return { multiplier: 1, unit: '' };
|
|
139
120
|
}
|
|
140
|
-
|
|
141
121
|
// SPICE convention: "Meg" / "MEG" / "meg" = 1e6, distinct from milli "m".
|
|
142
122
|
// Match before the single-char prefix loop so "meg" doesn't get read as milli + "eg".
|
|
143
123
|
const megMatch = SPICE_MEG.exec(suffix);
|
|
@@ -149,11 +129,9 @@ function parseSuffix(suffix: string): { multiplier: number; unit: string } {
|
|
|
149
129
|
const restUnit = UNIT_ALIASES[rest];
|
|
150
130
|
return { multiplier: 1e6, unit: restUnit ?? rest };
|
|
151
131
|
}
|
|
152
|
-
|
|
153
132
|
const first = suffix.charAt(0);
|
|
154
133
|
const rest = suffix.slice(1);
|
|
155
134
|
const prefixMultiplier = SI_PREFIXES[first];
|
|
156
|
-
|
|
157
135
|
if (prefixMultiplier !== undefined) {
|
|
158
136
|
if (rest.length === 0) {
|
|
159
137
|
return { multiplier: prefixMultiplier, unit: '' };
|
|
@@ -163,11 +141,10 @@ function parseSuffix(suffix: string): { multiplier: number; unit: string } {
|
|
|
163
141
|
return { multiplier: prefixMultiplier, unit: restUnit };
|
|
164
142
|
}
|
|
165
143
|
}
|
|
166
|
-
|
|
167
144
|
const fullUnit = UNIT_ALIASES[suffix];
|
|
168
145
|
if (fullUnit !== undefined) {
|
|
169
146
|
return { multiplier: 1, unit: fullUnit };
|
|
170
147
|
}
|
|
171
|
-
|
|
172
148
|
return { multiplier: 1, unit: suffix };
|
|
173
149
|
}
|
|
150
|
+
//# sourceMappingURL=quantity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quantity.js","sourceRoot":"","sources":["../../src/model/quantity.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAqC;IAClD,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,GAAG,EAAE,IAAI,EAAE,aAAa;IACxB,GAAG,EAAE,IAAI,EAAE,oEAAoE;IAC/E,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,IAAI;CACV,CAAC;AAEF,MAAM,iBAAiB,GAA6F;IAChH,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;IACxB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;IACxB,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;IACvB,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;IACvB,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;IACzB,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;IACzB,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;IACvB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;IACtB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;IACtB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;IACtB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;IACtB,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;IACvB,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;IACtC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;CACzC,CAAC;AAEF,MAAM,YAAY,GAAqC;IACnD,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,GAAG,EAAE,GAAG,EAAE,8CAA8C;IACxD,GAAG,EAAE,GAAG,EAAE,oEAAoE;IAC9E,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,GAAG;IACT,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;CACT,CAAC;AAEF,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAC1F,MAAM,wBAAwB,GAAG,wDAAwD,CAAC;AAC1F,MAAM,SAAS,GAAG,kBAAkB,CAAC;AAErC,MAAM,UAAU,aAAa,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEnC,OAAO;QACH,GAAG;QACH,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC,UAAU;QACpC,IAAI,EAAE,MAAM,CAAC,IAAI;KACpB,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAW,EAAE,OAAe;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACtD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,mBAAmB,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;QAChC,CAAC,CAAC,mBAAmB,IAAI,YAAY;QACrC,CAAC,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC;IAElC,OAAO;QACH,GAAG;QACH,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC,UAAU;QACnC,IAAI;KACP,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;IAED,0EAA0E;IAC1E,sFAAsF;IACtF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACzC,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5D,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC"}
|