linked-rolls 0.55.0 → 0.56.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/lib/Feature.d.ts CHANGED
@@ -53,12 +53,12 @@ export interface VerticalSpan {
53
53
  */
54
54
  to?: Track;
55
55
  }
56
- export declare const featureTypes: readonly ['HoleChain', 'Writing', 'Mark', 'GluedOn'];
56
+ export declare const featureTypes: readonly ['HoleChain', 'Writing', 'Mark', 'Patch'];
57
57
  export type FeatureType = typeof featureTypes[number];
58
58
  export declare const isFeatureType: (value: unknown) => value is FeatureType;
59
59
  /**
60
60
  * A feature on the roll, e.g. a perforation, a writing, a mark or a
61
- * glued-on patch, defined by its horizontal and vertical position and
61
+ * patch, defined by its horizontal and vertical position and
62
62
  * extent. Each kind of feature is a class of its own, which its type
63
63
  * names.
64
64
  */
@@ -89,7 +89,7 @@ export declare const conditions: {
89
89
  readonly HoleChain: readonly ["partially-torn", "missing-perforation"];
90
90
  readonly Writing: readonly ["illegible"];
91
91
  readonly Mark: readonly ["faded"];
92
- readonly GluedOn: readonly ["detaching", "ripped"];
92
+ readonly Patch: readonly ["detaching", "ripped"];
93
93
  };
94
94
  /** The kinds of condition a feature may be in, whichever kind of feature it is. */
95
95
  export type FeatureConditionType = typeof conditions[FeatureType][number];
@@ -191,15 +191,14 @@ export interface Writing extends Trace<'Writing'> {
191
191
  export interface Mark extends Trace<'Mark'> {
192
192
  }
193
193
  /**
194
- * A piece of material (paper or tape) glued onto the roll surface.
195
- * Glued-on features are typically used to cover perforations (for corrections)
196
- * or to reinforce damaged areas. They may themselves carry other features
197
- * such as writings or additional holes.
198
- * @see reo:GluedOn
194
+ * A piece of paper or tape glued onto the roll: a label naming it, a
195
+ * strip covering perforations, or a patch reinforcing a tear. A patch
196
+ * may itself carry other features, such as writings or holes.
197
+ * @see reo:Patch
199
198
  */
200
- export interface GluedOn extends RollFeature<'GluedOn', typeof conditions.GluedOn[number]>, OnAFace {
199
+ export interface Patch extends RollFeature<'Patch', typeof conditions.Patch[number]>, OnAFace {
201
200
  /**
202
- * The material of the glued-on feature.
201
+ * What the patch is made of.
203
202
  * @see crm:P45 consists of
204
203
  */
205
204
  material: 'paper' | 'tape';
@@ -211,8 +210,8 @@ export interface GluedOn extends RollFeature<'GluedOn', typeof conditions.GluedO
211
210
  */
212
211
  rotation?: Measure<'deg'>;
213
212
  /**
214
- * A glued-on feature itself may carry other features.
215
- * Nested features do not need to be positioned explicitly.
213
+ * The features the patch itself carries. They need not be
214
+ * positioned explicitly.
216
215
  * @see crm:P46 is composed of
217
216
  */
218
217
  features?: NestedFeature[];
@@ -225,10 +224,10 @@ export interface GluedOn extends RollFeature<'GluedOn', typeof conditions.GluedO
225
224
  export type AnyFeature = HoleChain | Writing | Mark;
226
225
  /**
227
226
  * Anything found at a place of its own on the roll: a feature or a
228
- * glued-on patch. E24 Physical Human-Made Thing is the class both fall
229
- * under, E22 and E25 being its subclasses.
227
+ * patch. E24 Physical Human-Made Thing is the class both fall under,
228
+ * E22 and E25 being its subclasses.
230
229
  */
231
- export type FeatureOrPatch = AnyFeature | GluedOn;
230
+ export type FeatureOrPatch = AnyFeature | Patch;
232
231
  /**
233
232
  * A feature without the place it would state of its own. The union is
234
233
  * distributed over, so that each kind of feature keeps its own keys.
@@ -240,7 +239,7 @@ type Unplaced<T> = T extends FeatureOrPatch ? PartialBy<T, 'horizontal' | 'verti
240
239
  */
241
240
  export type NestedFeature = Unplaced<FeatureOrPatch>;
242
241
  export declare const isRollFeature: (obj: object) => obj is FeatureOrPatch;
243
- export declare const isGluedOn: <T extends NestedFeature>(feature: T) => feature is T & GluedOn;
242
+ export declare const isPatch: <T extends NestedFeature>(feature: T) => feature is T & Patch;
244
243
  /** The features a feature bears: a patch those stated as parts of it, any other feature none. */
245
244
  export declare const featuresBorneBy: (feature: NestedFeature) => NestedFeature[];
246
245
  /** The feature together with everything it bears, as deep as a patch on a patch goes. */
package/lib/Feature.js CHANGED
@@ -1,18 +1,18 @@
1
- export const featureTypes = ['HoleChain', 'Writing', 'Mark', 'GluedOn'];
1
+ export const featureTypes = ['HoleChain', 'Writing', 'Mark', 'Patch'];
2
2
  export const isFeatureType = (value) => featureTypes.includes(value);
3
3
  export const conditions = {
4
4
  HoleChain: ['partially-torn', 'missing-perforation'],
5
5
  Writing: ['illegible'],
6
6
  Mark: ['faded'],
7
- GluedOn: ['detaching', 'ripped']
7
+ Patch: ['detaching', 'ripped']
8
8
  };
9
9
  export const techniques = ['print', 'handwriting', 'stamp'];
10
10
  export const media = ['ink', 'pencil', 'crayon'];
11
11
  export const isRollFeature = (obj) => {
12
12
  return 'type' in obj && isFeatureType(obj.type);
13
13
  };
14
- export const isGluedOn = (feature) => feature.type === 'GluedOn';
14
+ export const isPatch = (feature) => feature.type === 'Patch';
15
15
  /** The features a feature bears: a patch those stated as parts of it, any other feature none. */
16
- export const featuresBorneBy = (feature) => isGluedOn(feature) ? feature.features ?? [] : [];
16
+ export const featuresBorneBy = (feature) => isPatch(feature) ? feature.features ?? [] : [];
17
17
  /** The feature together with everything it bears, as deep as a patch on a patch goes. */
18
18
  export const withBorneFeatures = (feature) => [feature, ...featuresBorneBy(feature).flatMap(withBorneFeatures)];
package/lib/RollCopy.d.ts CHANGED
@@ -2,7 +2,7 @@ import { ConditionState } from "./ConditionState.js";
2
2
  import { AnySymbol } from "./Symbol.js";
3
3
  import { TrackerBar } from "./TrackerBar.js";
4
4
  import { TrackCalibration } from "./TrackCalibration.js";
5
- import { AnyFeature, FeatureOrPatch, GluedOn } from "./Feature.js";
5
+ import { AnyFeature, FeatureOrPatch, Patch } from "./Feature.js";
6
6
  import { ActorAssignment, DateAssignment, ObjectAssumption, ReferenceAssumption } from "./Assumption.js";
7
7
  import { WithId, WithType } from "./utils.js";
8
8
  import { Agent, Concept } from "./Agent.js";
@@ -161,7 +161,7 @@ export type Modification = Partial<{
161
161
  * The patches glued onto the copy, each with whatever it bears.
162
162
  * @see crm:P111 added
163
163
  */
164
- added: GluedOn[];
164
+ added: Patch[];
165
165
  /**
166
166
  * @see crm:P21 had general purpose
167
167
  */
package/lib/asJsonLd.js CHANGED
@@ -73,7 +73,7 @@ const madeOn = (copy) => [
73
73
  ...nodesIn(copy.production?.produced),
74
74
  ...nodesIn(copy.modifications).flatMap(act => [...nodesIn(act.produced), ...nodesIn(act.added)])
75
75
  ];
76
- const referencing = (nodes, patches) => nodes.filter(node => (node['@type'] === 'GluedOn') === patches && typeof node['@id'] === 'string')
76
+ const referencing = (nodes, patches) => nodes.filter(node => (node['@type'] === 'Patch') === patches && typeof node['@id'] === 'string')
77
77
  .map(node => ({ '@id': node['@id'] }));
78
78
  const featuresAmong = (nodes) => referencing(nodes, false);
79
79
  const patchesAmong = (nodes) => referencing(nodes, true);
@@ -112,7 +112,7 @@ const withBearings = (value) => {
112
112
  ...stating('composedOf', patchesAmong(made))
113
113
  };
114
114
  }
115
- if (node['@type'] === 'GluedOn')
115
+ if (node['@type'] === 'Patch')
116
116
  return { ...node, ...stating('bears', featuresAmong(nodesIn(node.features))) };
117
117
  return node;
118
118
  };
package/lib/editionOps.js CHANGED
@@ -10,7 +10,7 @@ import { substitutionsBetween } from "./substitution.js";
10
10
  import { trackerBarOf } from "./systems/index.js";
11
11
  import { applyShift, applyScale, revertShift, revertScale, revertShortening, shortenChains } from "./alignment.js";
12
12
  import { assignReference, idOf } from "./Assumption.js";
13
- import { conditions as conditionsAllowed, featuresBorneBy, isGluedOn, withBorneFeatures } from "./Feature.js";
13
+ import { conditions as conditionsAllowed, featuresBorneBy, isPatch, withBorneFeatures } from "./Feature.js";
14
14
  import { distance, mm, subtract } from "./Quantity.js";
15
15
  const noChange = () => undefined;
16
16
  const onCopy = (copyId, op) => draft => {
@@ -369,7 +369,7 @@ const goneWith = (features, named) => features.flatMap(feature => named.has(feat
369
369
  : goneWith(featuresBorneBy(feature), named));
370
370
  /** The feature with the named ones gone from what it bears, or the very same one where it bears none of them. */
371
371
  const withoutBorne = (feature, named) => {
372
- if (!isGluedOn(feature) || !feature.features)
372
+ if (!isPatch(feature) || !feature.features)
373
373
  return feature;
374
374
  const borne = withoutFeatures(feature.features, named);
375
375
  return borne === feature.features ? feature : { ...feature, features: borne };
@@ -443,7 +443,7 @@ const actFor = (copy, patch, act) => {
443
443
  * the feature goes into an act of its own.
444
444
  */
445
445
  export const addFeature = (copyId, feature, act = {}) => onCopy(copyId, copy => {
446
- actFor(copy, isGluedOn(feature), act).push(feature);
446
+ actFor(copy, isPatch(feature), act).push(feature);
447
447
  });
448
448
  /**
449
449
  * States that the patch bears the feature. What a patch bears came onto
@@ -452,7 +452,7 @@ export const addFeature = (copyId, feature, act = {}) => onCopy(copyId, copy =>
452
452
  */
453
453
  export const addBorneFeature = (copyId, patchId, feature) => onCopy(copyId, copy => {
454
454
  const patch = featuresOf(copy).flatMap(withBorneFeatures).find(borne => borne.id === patchId);
455
- if (!patch || !isGluedOn(patch))
455
+ if (!patch || !isPatch(patch))
456
456
  return;
457
457
  if (!patch.features)
458
458
  patch.features = [];
@@ -502,7 +502,7 @@ const sayTheSame = (a, b) => {
502
502
  */
503
503
  const nature = (feature) => {
504
504
  const { id, horizontal, depiction, condition, ...rest } = feature;
505
- return isGluedOn(feature) && feature.features
505
+ return isPatch(feature) && feature.features
506
506
  ? { ...rest, features: feature.features.map(borne => borne.id) }
507
507
  : rest;
508
508
  };
package/lib/migrate.js CHANGED
@@ -11,6 +11,14 @@ const renamedKeys = {
11
11
  annotates: 'depiction',
12
12
  classification: 'editType'
13
13
  };
14
+ /**
15
+ * Classes of feature renamed since: a chain of holes was named after a
16
+ * single hole, and a patch after the act that glued it on.
17
+ */
18
+ const renamedTypes = {
19
+ Hole: 'HoleChain',
20
+ GluedOn: 'Patch'
21
+ };
14
22
  const referenceKeys = ['alignedWith', 'pairedWith', 'basedOn'];
15
23
  /**
16
24
  * The five type terms that were capitalised while the rest of the
@@ -33,8 +41,9 @@ const withTypology = (node) => {
33
41
  }
34
42
  return node;
35
43
  };
36
- /** A chain of holes written while its class was named after a single hole. */
37
- const withHoleChainType = (node) => node['@type'] === 'Hole' ? { ...node, '@type': 'HoleChain' } : node;
44
+ const withRenamedType = (node) => Object.hasOwn(renamedTypes, node['@type']) ? { ...node, '@type': renamedTypes[node['@type']] } : node;
45
+ /** Whether the feature is of the class under either name, since a node is migrated before its children are. */
46
+ const isOfType = (type) => (feature) => feature?.['@type'] === type || renamedTypes[feature?.['@type']] === type;
38
47
  /** A version once stated whether it served as a master or stood on one copy. */
39
48
  const withoutVersionType = (node) => {
40
49
  if (!Object.hasOwn(node, 'versionType'))
@@ -195,8 +204,7 @@ const featuresOf = (copy) => [
195
204
  ...(Array.isArray(copy.features) ? copy.features : []),
196
205
  ...(Array.isArray(copy.production?.produced) ? copy.production.produced : [])
197
206
  ];
198
- /** A chain of holes under either name, since a node is migrated before its children are. */
199
- const isHoleChain = (feature) => feature?.['@type'] === 'HoleChain' || feature?.['@type'] === 'Hole';
207
+ const isHoleChain = isOfType('HoleChain');
200
208
  /**
201
209
  * A copy read on a roll reader was stated as a recording before a sound
202
210
  * recording could be one. A sound recording gives no holes, so a recording
@@ -212,7 +220,7 @@ const withoutFeatureKind = (node) => {
212
220
  const { kind: _typed, ...rest } = node;
213
221
  return rest;
214
222
  };
215
- const isPatch = (feature) => feature?.['@type'] === 'GluedOn';
223
+ const isPatch = isOfType('Patch');
216
224
  /**
217
225
  * A feature a patch bears was sometimes written without an id, and what
218
226
  * has no id can be referred to from nowhere: neither by a reading of it
@@ -303,7 +311,7 @@ const withTimeSpanDates = (node) => {
303
311
  const { '@value': within, '@type': _typed, ...rest } = node;
304
312
  return { ...rest, within };
305
313
  };
306
- const migrateNode = (node) => [withRenamedKeys, withTypology, withHoleChainType, withoutVersionType, withoutVersionSiglum, withLowerCaseTerms, withSplitMethod, withReferences, withKeeper, withoutEmptyKeeper,
314
+ const migrateNode = (node) => [withRenamedKeys, withTypology, withRenamedType, withoutVersionType, withoutVersionSiglum, withLowerCaseTerms, withSplitMethod, withReferences, withKeeper, withoutEmptyKeeper,
307
315
  withPerforator, withProductionNodes, withTypedPerforator, withScale, withDerivationList, withReadingKind, withTimeSpanDates,
308
316
  withoutFeatureKind, withBorneFeaturesNamed, withFeaturesInActs, withDriveOfStaggering, withoutPattern]
309
317
  .reduce((result, step) => step(result), node);
package/lib/schema.json CHANGED
@@ -793,97 +793,6 @@
793
793
  "type": "object",
794
794
  "ontology": "crm:E7 Activity"
795
795
  },
796
- "GluedOn": {
797
- "description": "A piece of material (paper or tape) glued onto the roll surface. Glued-on features are typically used to cover perforations (for corrections) or to reinforce damaged areas. They may themselves carry other features such as writings or additional holes.",
798
- "properties": {
799
- "condition": {
800
- "$ref": "#/definitions/ObjectAssumption%3CConditionState%3C(%22detaching%22%7C%22ripped%22)%3E%3E",
801
- "description": "This can be used e.g. to indicate a perforation which is torn out or in any other way damaged.",
802
- "ontology": "crm:P44 has condition"
803
- },
804
- "depiction": {
805
- "description": "IIIF region pointing to a depiction of this feature in the scan.",
806
- "type": "string",
807
- "ontology": "crm:P138i has representation"
808
- },
809
- "features": {
810
- "description": "A glued-on feature itself may carry other features. Nested features do not need to be positioned explicitly.",
811
- "items": {
812
- "$ref": "#/definitions/NestedFeature"
813
- },
814
- "type": "array",
815
- "ontology": "crm:P46 is composed of"
816
- },
817
- "horizontal": {
818
- "$ref": "#/definitions/HorizontalSpan",
819
- "description": "Horizontal span of the feature on the roll.",
820
- "ontology": "crm:P43 has dimension"
821
- },
822
- "material": {
823
- "description": "The material of the glued-on feature.",
824
- "enum": [
825
- "paper",
826
- "tape"
827
- ],
828
- "type": "string",
829
- "ontology": "crm:P45 consists of"
830
- },
831
- "rotation": {
832
- "$ref": "#/definitions/Measure%3C%22deg%22%3E",
833
- "description": "How far the patch was stuck on askew. At zero its edges stand square to the roll, and the angle turns them towards the end of it, as a writing's reading direction turns.",
834
- "ontology": "reo:rotation"
835
- },
836
- "side": {
837
- "description": "The face of the roll it lies on: the side that faces the reader as the roll plays, or the back of it.",
838
- "enum": [
839
- "recto",
840
- "verso"
841
- ],
842
- "type": "string",
843
- "ontology": "reo:side"
844
- },
845
- "vertical": {
846
- "$ref": "#/definitions/VerticalSpan",
847
- "description": "Vertical span of the feature on the roll.",
848
- "ontology": "crm:P43 has dimension"
849
- },
850
- "@id": {
851
- "description": "A unique identifier for this object.",
852
- "type": "string"
853
- },
854
- "@type": {
855
- "const": "GluedOn",
856
- "description": "The type discriminator for this object.",
857
- "type": "string",
858
- "ontology": "rdf:type"
859
- },
860
- "bears": {
861
- "type": "array",
862
- "items": {
863
- "type": "object",
864
- "properties": {
865
- "@id": {
866
- "type": "string"
867
- }
868
- },
869
- "required": [
870
- "@id"
871
- ]
872
- },
873
- "description": "The features the patch bears. Derived on export.",
874
- "ontology": "crm:P56 bears feature"
875
- }
876
- },
877
- "required": [
878
- "horizontal",
879
- "@id",
880
- "material",
881
- "@type",
882
- "vertical"
883
- ],
884
- "type": "object",
885
- "ontology": "reo:GluedOn"
886
- },
887
796
  "HoleChain": {
888
797
  "description": "A chain of holes punched along the roll, which the tracker bar reads as it passes. The perforator cuts a held note or function as a row of punches with bridges of paper left between them, so most perforations are chains; one without a bridge is a chain of a single hole. The holes are the chain's parts and are not stated one by one. A punched chain is a human-made feature: CRM counts \"the information encoding features on mechanical or digital carriers\" among the features purposely created by human activity.",
889
798
  "properties": {
@@ -1254,7 +1163,7 @@
1254
1163
  "added": {
1255
1164
  "description": "The patches glued onto the copy, each with whatever it bears.",
1256
1165
  "items": {
1257
- "$ref": "#/definitions/GluedOn"
1166
+ "$ref": "#/definitions/Patch"
1258
1167
  },
1259
1168
  "type": "array",
1260
1169
  "ontology": "crm:P111 added"
@@ -1608,7 +1517,7 @@
1608
1517
  "ontology": "crm:P138i has representation"
1609
1518
  },
1610
1519
  "features": {
1611
- "description": "A glued-on feature itself may carry other features. Nested features do not need to be positioned explicitly.",
1520
+ "description": "The features the patch itself carries. They need not be positioned explicitly.",
1612
1521
  "items": {
1613
1522
  "$ref": "#/definitions/NestedFeature"
1614
1523
  },
@@ -1621,7 +1530,7 @@
1621
1530
  "ontology": "crm:P43 has dimension"
1622
1531
  },
1623
1532
  "material": {
1624
- "description": "The material of the glued-on feature.",
1533
+ "description": "What the patch is made of.",
1625
1534
  "enum": [
1626
1535
  "paper",
1627
1536
  "tape"
@@ -1653,7 +1562,7 @@
1653
1562
  "type": "string"
1654
1563
  },
1655
1564
  "@type": {
1656
- "const": "GluedOn",
1565
+ "const": "Patch",
1657
1566
  "description": "The type discriminator for this object.",
1658
1567
  "type": "string",
1659
1568
  "ontology": "rdf:type"
@@ -2678,6 +2587,97 @@
2678
2587
  ],
2679
2588
  "type": "object"
2680
2589
  },
2590
+ "Patch": {
2591
+ "description": "A piece of paper or tape glued onto the roll: a label naming it, a strip covering perforations, or a patch reinforcing a tear. A patch may itself carry other features, such as writings or holes.",
2592
+ "properties": {
2593
+ "condition": {
2594
+ "$ref": "#/definitions/ObjectAssumption%3CConditionState%3C(%22detaching%22%7C%22ripped%22)%3E%3E",
2595
+ "description": "This can be used e.g. to indicate a perforation which is torn out or in any other way damaged.",
2596
+ "ontology": "crm:P44 has condition"
2597
+ },
2598
+ "depiction": {
2599
+ "description": "IIIF region pointing to a depiction of this feature in the scan.",
2600
+ "type": "string",
2601
+ "ontology": "crm:P138i has representation"
2602
+ },
2603
+ "features": {
2604
+ "description": "The features the patch itself carries. They need not be positioned explicitly.",
2605
+ "items": {
2606
+ "$ref": "#/definitions/NestedFeature"
2607
+ },
2608
+ "type": "array",
2609
+ "ontology": "crm:P46 is composed of"
2610
+ },
2611
+ "horizontal": {
2612
+ "$ref": "#/definitions/HorizontalSpan",
2613
+ "description": "Horizontal span of the feature on the roll.",
2614
+ "ontology": "crm:P43 has dimension"
2615
+ },
2616
+ "material": {
2617
+ "description": "What the patch is made of.",
2618
+ "enum": [
2619
+ "paper",
2620
+ "tape"
2621
+ ],
2622
+ "type": "string",
2623
+ "ontology": "crm:P45 consists of"
2624
+ },
2625
+ "rotation": {
2626
+ "$ref": "#/definitions/Measure%3C%22deg%22%3E",
2627
+ "description": "How far the patch was stuck on askew. At zero its edges stand square to the roll, and the angle turns them towards the end of it, as a writing's reading direction turns.",
2628
+ "ontology": "reo:rotation"
2629
+ },
2630
+ "side": {
2631
+ "description": "The face of the roll it lies on: the side that faces the reader as the roll plays, or the back of it.",
2632
+ "enum": [
2633
+ "recto",
2634
+ "verso"
2635
+ ],
2636
+ "type": "string",
2637
+ "ontology": "reo:side"
2638
+ },
2639
+ "vertical": {
2640
+ "$ref": "#/definitions/VerticalSpan",
2641
+ "description": "Vertical span of the feature on the roll.",
2642
+ "ontology": "crm:P43 has dimension"
2643
+ },
2644
+ "@id": {
2645
+ "description": "A unique identifier for this object.",
2646
+ "type": "string"
2647
+ },
2648
+ "@type": {
2649
+ "const": "Patch",
2650
+ "description": "The type discriminator for this object.",
2651
+ "type": "string",
2652
+ "ontology": "rdf:type"
2653
+ },
2654
+ "bears": {
2655
+ "type": "array",
2656
+ "items": {
2657
+ "type": "object",
2658
+ "properties": {
2659
+ "@id": {
2660
+ "type": "string"
2661
+ }
2662
+ },
2663
+ "required": [
2664
+ "@id"
2665
+ ]
2666
+ },
2667
+ "description": "The features the patch bears. Derived on export.",
2668
+ "ontology": "crm:P56 bears feature"
2669
+ }
2670
+ },
2671
+ "required": [
2672
+ "horizontal",
2673
+ "@id",
2674
+ "material",
2675
+ "@type",
2676
+ "vertical"
2677
+ ],
2678
+ "type": "object",
2679
+ "ontology": "reo:Patch"
2680
+ },
2681
2681
  "Perforator": {
2682
2682
  "description": "The machine that punched the copy. It stands for this production alone. Whether it is the one another copy was punched on is left to a statement of identity made about it elsewhere, which its id allows.",
2683
2683
  "properties": {
@@ -17,7 +17,7 @@
17
17
  "HoleChain": "reo:HoleChain",
18
18
  "Mark": "reo:Mark",
19
19
  "Writing": "reo:Writing",
20
- "GluedOn": "reo:GluedOn",
20
+ "Patch": "reo:Patch",
21
21
  "Attachment": "crm:E79_Part_Addition",
22
22
  "Removal": "crm:E80_Part_Removal",
23
23
  "Alteration": "crm:E12_Production",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linked-rolls",
3
- "version": "0.55.0",
3
+ "version": "0.56.0",
4
4
  "description": "Digital editions of piano rolls: import, collation, editorial assumptions, JSON-LD export, and emulation through a reproducing system",
5
5
  "license": "MIT",
6
6
  "repository": {