@hatiolab/figure-model 0.1.23 → 0.1.24

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/index.d.ts CHANGED
@@ -8,4 +8,5 @@ export { topViewEvidence, type TopViewEvidence } from './visual-evidence.ts';
8
8
  export { blueprintProblems } from './blueprint-shape.ts';
9
9
  export { anchorOf, anchorOfPart, jointOriginPosition, repeatPlanOfPart, needsOwnMesh, repeatOffset, repeatPlan, REPEAT_LIMIT, rotatedExtent, sizingPosition, sizingScale, stretchAxis, type Axis as SizingAxis, type InstanceScale } from './sizing.ts';
10
10
  export { sizingReport, sizingReportOf, sizingFixCandidatesOf, SIZING_WAYS, type SizingFinding, type SizingReport, type SizingFixCandidate } from './gate.ts';
11
+ export { contractChanges, breaksContract, type ContractChange, type ContractChangeCode } from './release-contract.ts';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,MAAM,EACN,YAAY,EACZ,OAAO,EACP,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrG,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAMxD,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,KAAK,IAAI,IAAI,UAAU,EACvB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,MAAM,EACN,YAAY,EACZ,OAAO,EACP,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrG,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAMxD,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,KAAK,IAAI,IAAI,UAAU,EACvB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC5J,OAAO,EACL,eAAe,EACf,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAA"}
package/dist/index.js CHANGED
@@ -26,4 +26,5 @@ export { blueprintProblems } from "./blueprint-shape.js";
26
26
  export { anchorOf, anchorOfPart, jointOriginPosition, repeatPlanOfPart, needsOwnMesh, repeatOffset, repeatPlan, REPEAT_LIMIT, rotatedExtent, sizingPosition, sizingScale, stretchAxis } from "./sizing.js";
27
27
  /* 발행해도 되나 — 크기를 바꿔 봐야 아는 것들. */
28
28
  export { sizingReport, sizingReportOf, sizingFixCandidatesOf, SIZING_WAYS } from "./gate.js";
29
+ export { contractChanges, breaksContract } from "./release-contract.js";
29
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAA;AAC7D,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,MAAM,EACN,YAAY,EACZ,OAAO,EAMR,MAAM,WAAW,CAAA;AAClB,iGAAiG;AACjG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAA8C,MAAM,iBAAiB,CAAA;AACrG,OAAO,EAAE,eAAe,EAAwB,MAAM,sBAAsB,CAAA;AAC5E,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD;;;GAGG;AACH,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EAGZ,MAAM,aAAa,CAAA;AAEpB,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAkE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAA;AAC7D,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,MAAM,EACN,YAAY,EACZ,OAAO,EAMR,MAAM,WAAW,CAAA;AAClB,iGAAiG;AACjG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAA8C,MAAM,iBAAiB,CAAA;AACrG,OAAO,EAAE,eAAe,EAAwB,MAAM,sBAAsB,CAAA;AAC5E,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD;;;GAGG;AACH,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EAGZ,MAAM,aAAa,CAAA;AAEpB,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAkE,MAAM,WAAW,CAAA;AAC5J,OAAO,EACL,eAAe,EACf,cAAc,EAGf,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,38 @@
1
+ import type { FigureSource } from './types.ts';
2
+ /** 무엇이 달라졌나. 앞의 넷은 발행을 막고, 뒤의 셋은 알리기만 한다. */
3
+ export type ContractChangeCode =
4
+ /** 기준 상자의 x:z 비율이 달라졌다 — 놓인 인스턴스가 찌그러진다. */
5
+ 'base-ratio-changed'
6
+ /** 배치 기준(floor · ceiling · center)이 달라졌다. */
7
+ | 'placement-changed'
8
+ /** 자리·문·파라미터·능력이 사라졌거나 뜻이 바뀌었다. */
9
+ | 'interface-gone'
10
+ /** 배율 1 에서 센 칸 수가 달라졌다. */
11
+ | 'slot-count-changed'
12
+ /** 기준 상자의 절대 크기가 달라졌다 — 비율은 그대로다. */
13
+ | 'base-size-changed'
14
+ /** 자리·문·파라미터·능력이 새로 생겼다. */
15
+ | 'interface-added'
16
+ /** 자리가 받아 주는 타입이 좁아졌다 — 이미 든 것은 그대로다. */
17
+ | 'accepts-narrowed';
18
+ export interface ContractChange {
19
+ code: ContractChangeCode;
20
+ /** 참이면 발행을 막는다. */
21
+ blocking: boolean;
22
+ /** 무엇의 이야기인가 — 자리·문·파라미터·능력의 이름. 도형 전체의 일이면 없다. */
23
+ subject?: string;
24
+ /** 무엇이 달라졌나. 잰 값으로. */
25
+ message: string;
26
+ /** **왜 그것이 문제인가.** 달라진 것만 말하면 읽는 사람은 「그래서?」에서 멈춘다. */
27
+ why: string;
28
+ }
29
+ /**
30
+ * 직전 발행판과 견준다. **둘 다 컴파일되는 정본이어야 한다** — 부르는 쪽이 새 정본을 먼저
31
+ * 검사하고, 앞의 것은 발행될 때 이미 통과한 것이다.
32
+ *
33
+ * 낸 목록이 비어 있으면 이 발행은 놓인 것을 건드리지 않는다.
34
+ */
35
+ export declare function contractChanges(before: FigureSource, after: FigureSource): ContractChange[];
36
+ /** 이 발행이 놓인 것을 깨나. `contractChanges` 를 부르는 쪽의 편의. */
37
+ export declare function breaksContract(changes: readonly ContractChange[]): boolean;
38
+ //# sourceMappingURL=release-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-contract.d.ts","sourceRoot":"","sources":["../src/release-contract.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,YAAY,EAAQ,MAAM,YAAY,CAAA;AAsCrE,6CAA6C;AAC7C,MAAM,MAAM,kBAAkB;AAC5B,4CAA4C;AAC1C,oBAAoB;AACtB,6CAA6C;GAC3C,mBAAmB;AACrB,mCAAmC;GACjC,gBAAgB;AAClB,2BAA2B;GACzB,oBAAoB;AACtB,qCAAqC;GACnC,mBAAmB;AACrB,4BAA4B;GAC1B,iBAAiB;AACnB,yCAAyC;GACvC,kBAAkB,CAAA;AAEtB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAA;IACxB,mBAAmB;IACnB,QAAQ,EAAE,OAAO,CAAA;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAA;CACZ;AA2CD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,EAAE,CAmK3F;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,204 @@
1
+ import { compile } from "./blueprint.js";
2
+ import { repeatPlan } from "./sizing.js";
3
+ /**
4
+ * 이 자리가 `size` 만 한 인스턴스에서 몇 칸인가. 씬이 `maxCount` 를 세는 식과 같다.
5
+ *
6
+ * 배율은 그 크기를 제 기준 상자로 나눈 값이다 — 씬이 놓인 컴포넌트의 크기로 배율을 구하는 것과
7
+ * 같은 셈이라, 판이 달라도 같은 크기의 인스턴스를 견주게 된다.
8
+ */
9
+ function countAt(anchor, base, size) {
10
+ const scale = { x: size.x / base.x, y: size.y / base.y, z: size.z / base.z };
11
+ const plan = repeatPlan(anchor, scale, base);
12
+ if (plan)
13
+ return plan.count;
14
+ return anchor.capacity ?? 1;
15
+ }
16
+ function rolesOf(anchor) {
17
+ return [...anchor.roles].sort().join(' · ');
18
+ }
19
+ /**
20
+ * 견줄 수 있는 모습으로 편다. 청사진에서 읽는 이유는 **소비자가 읽는 것이 청사진**이기 때문이다 —
21
+ * 정본에 어떻게 적혀 있든 소비처에 가는 것은 컴파일된 결과다.
22
+ */
23
+ function interfaceOf(source, at) {
24
+ const blueprint = compile(source);
25
+ const base = blueprint.base;
26
+ const size = at ?? base;
27
+ return {
28
+ base,
29
+ placement: source.placement ?? 'floor',
30
+ anchors: new Map((blueprint.anchors ?? []).map(anchor => [anchor.name, anchor])),
31
+ counts: new Map((blueprint.anchors ?? []).map(anchor => [anchor.name, countAt(anchor, base, size)])),
32
+ parameters: new Map((source.parameters ?? []).map(one => [one.name, one])),
33
+ capabilities: new Set(source.capabilities ?? [])
34
+ };
35
+ }
36
+ /** 두 수가 같은가. 비율은 나눈 값이라 자리끝이 흔들린다. */
37
+ function same(a, b) {
38
+ return Math.abs(a - b) < 1e-9;
39
+ }
40
+ /**
41
+ * 직전 발행판과 견준다. **둘 다 컴파일되는 정본이어야 한다** — 부르는 쪽이 새 정본을 먼저
42
+ * 검사하고, 앞의 것은 발행될 때 이미 통과한 것이다.
43
+ *
44
+ * 낸 목록이 비어 있으면 이 발행은 놓인 것을 건드리지 않는다.
45
+ */
46
+ export function contractChanges(before, after) {
47
+ const was = interfaceOf(before);
48
+ // 칸 수는 **앞 발행판의 크기에서** 센다. 그 크기가 놓여 있는 것들이 실제로 든 크기다.
49
+ const now = interfaceOf(after, was.base);
50
+ const changes = [];
51
+ /*
52
+ 비율을 먼저 본다. 두 축을 같은 배로 키운 것은 비율이 같아 여기 안 걸리고 절대 크기 알림만 낸다 —
53
+ ADR-0044 ④ 가 요구하는 「넘침을 base 하나로 고치는」 길이 막히지 않게 하는 것이 그 줄이다.
54
+ */
55
+ const wasRatio = was.base.x / was.base.z;
56
+ const nowRatio = now.base.x / now.base.z;
57
+ if (!same(wasRatio, nowRatio)) {
58
+ changes.push({
59
+ code: 'base-ratio-changed',
60
+ blocking: true,
61
+ message: `기준 상자의 x:z 비율이 ${wasRatio.toFixed(3)} 에서 ${nowRatio.toFixed(3)} 로 달라졌다 (${was.base.x}×${was.base.z} → ${now.base.x}×${now.base.z})`,
62
+ why: '도면은 너비와 높이만 저장하고 배율을 width/base.x · height/base.z 로 구한다. 비율이 달라지면 이미 놓인 인스턴스가 전부 찌그러진다.'
63
+ });
64
+ }
65
+ else if (!same(was.base.x, now.base.x) || !same(was.base.y, now.base.y) || !same(was.base.z, now.base.z)) {
66
+ changes.push({
67
+ code: 'base-size-changed',
68
+ blocking: false,
69
+ message: `기준 상자가 ${was.base.x}×${was.base.y}×${was.base.z} 에서 ${now.base.x}×${now.base.y}×${now.base.z} 로 달라졌다`,
70
+ why: '비율이 같아 모양은 견디지만, 실척으로 놓인 인스턴스는 크기가 맞지 않게 된다.'
71
+ });
72
+ }
73
+ if (was.placement !== now.placement) {
74
+ changes.push({
75
+ code: 'placement-changed',
76
+ blocking: true,
77
+ message: `배치 기준이 ${was.placement} 에서 ${now.placement} 로 달라졌다`,
78
+ why: '놓인 인스턴스의 높이를 배치 기준이 정한다. floor 가 ceiling 이 되면 놓인 것이 전부 천장으로 간다.'
79
+ });
80
+ }
81
+ for (const [name, anchor] of was.anchors) {
82
+ const next = now.anchors.get(name);
83
+ if (!next) {
84
+ changes.push({
85
+ code: 'interface-gone',
86
+ blocking: true,
87
+ subject: name,
88
+ message: `${rolesOf(anchor)} 「${name}」 이 없어졌다`,
89
+ why: '그 이름으로 물건을 앉히거나 연결선을 매던 쪽에서 조용히 없는 것이 된다. 이름을 바꾸는 것도 여기에 걸린다 — 부르는 쪽은 옛 이름을 든다.'
90
+ });
91
+ continue;
92
+ }
93
+ if (rolesOf(anchor) !== rolesOf(next)) {
94
+ changes.push({
95
+ code: 'interface-gone',
96
+ blocking: true,
97
+ subject: name,
98
+ message: `「${name}」 의 역할이 ${rolesOf(anchor)} 에서 ${rolesOf(next)} 로 달라졌다`,
99
+ why: '자리였던 것이 문이 되면 거기 있던 물건의 자리가 없어진다.'
100
+ });
101
+ }
102
+ const wasCount = was.counts.get(name) ?? 1;
103
+ const nowCount = now.counts.get(name) ?? 1;
104
+ if (wasCount !== nowCount) {
105
+ changes.push({
106
+ code: 'slot-count-changed',
107
+ blocking: true,
108
+ subject: name,
109
+ message: `「${name}」 의 칸 수가 ${was.base.x}×${was.base.y}×${was.base.z} 인스턴스에서 ${wasCount} 에서 ${nowCount} 로 달라졌다`,
110
+ why: '앞 발행판과 같은 크기에서 센 수다. 반복하는 자리는 간격이 칸 수를 정하므로 기준 상자를 안 건드려도 달라지고, 줄면 거기 든 것이 갈 곳을 잃는다.'
111
+ });
112
+ }
113
+ const wasAccepts = anchor.accepts;
114
+ const nowAccepts = next.accepts;
115
+ if (wasAccepts?.length) {
116
+ const narrowed = nowAccepts?.length ? wasAccepts.filter(one => !nowAccepts.includes(one)) : [];
117
+ // 목록이 아예 없어진 것은 「아무거나」라 넓어진 것이다.
118
+ if (narrowed.length > 0) {
119
+ changes.push({
120
+ code: 'accepts-narrowed',
121
+ blocking: false,
122
+ subject: name,
123
+ message: `「${name}」 이 ${narrowed.join(' · ')} 를 더 받지 않는다`,
124
+ why: '이미 든 것은 그대로 있고, 다음에 놓는 것부터 거절된다.'
125
+ });
126
+ }
127
+ }
128
+ }
129
+ for (const name of now.anchors.keys()) {
130
+ if (was.anchors.has(name))
131
+ continue;
132
+ const anchor = now.anchors.get(name);
133
+ changes.push({
134
+ code: 'interface-added',
135
+ blocking: false,
136
+ subject: name,
137
+ message: `${rolesOf(anchor)} 「${name}」 이 새로 생겼다`,
138
+ why: '놓인 것은 이 자리를 모르므로 지금 그대로 서 있는다.'
139
+ });
140
+ }
141
+ for (const [name, parameter] of was.parameters) {
142
+ const next = now.parameters.get(name);
143
+ if (!next) {
144
+ changes.push({
145
+ code: 'interface-gone',
146
+ blocking: true,
147
+ subject: name,
148
+ message: `파라미터 「${name}」 이 없어졌다`,
149
+ why: '인스턴스가 그 이름으로 값을 준다. 없어지면 그 값이 아무 일도 하지 않고, 왜 안 움직이는지 화면에는 아무 말도 안 나온다.'
150
+ });
151
+ continue;
152
+ }
153
+ const wasUnit = parameter.range?.unit;
154
+ const nowUnit = next.range?.unit;
155
+ if (wasUnit !== nowUnit) {
156
+ changes.push({
157
+ code: 'interface-gone',
158
+ blocking: true,
159
+ subject: name,
160
+ message: `파라미터 「${name}」 의 단위가 ${wasUnit ?? '없음'} 에서 ${nowUnit ?? '없음'} 로 달라졌다`,
161
+ why: '인스턴스가 저장해 둔 수는 그대로다. 단위가 바뀌면 같은 수가 다른 뜻이 되어, 1200mm 내려와 있던 호이스트가 1200도 돈다.'
162
+ });
163
+ }
164
+ }
165
+ for (const name of now.parameters.keys()) {
166
+ if (was.parameters.has(name))
167
+ continue;
168
+ changes.push({
169
+ code: 'interface-added',
170
+ blocking: false,
171
+ subject: name,
172
+ message: `파라미터 「${name}」 이 새로 생겼다`,
173
+ why: '값을 안 주면 기본값에 선다.'
174
+ });
175
+ }
176
+ for (const capability of was.capabilities) {
177
+ if (now.capabilities.has(capability))
178
+ continue;
179
+ changes.push({
180
+ code: 'interface-gone',
181
+ blocking: true,
182
+ subject: capability,
183
+ message: `능력 「${capability}」 이 없어졌다`,
184
+ why: '그 능력으로 물건을 받고 보내던 씬이 있다. 능력이 빠지면 그 컴포넌트는 물건을 받을 수 없게 된다.'
185
+ });
186
+ }
187
+ for (const capability of now.capabilities) {
188
+ if (was.capabilities.has(capability))
189
+ continue;
190
+ changes.push({
191
+ code: 'interface-added',
192
+ blocking: false,
193
+ subject: capability,
194
+ message: `능력 「${capability}」 이 새로 생겼다`,
195
+ why: '없던 일을 더 하는 것이라 놓인 것은 그대로 서 있는다.'
196
+ });
197
+ }
198
+ return changes;
199
+ }
200
+ /** 이 발행이 놓인 것을 깨나. `contractChanges` 를 부르는 쪽의 편의. */
201
+ export function breaksContract(changes) {
202
+ return changes.some(one => one.blocking);
203
+ }
204
+ //# sourceMappingURL=release-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-contract.js","sourceRoot":"","sources":["../src/release-contract.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hatiolab/figure-model",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "Figure 저작 결과의 정본 형식과 검증 — 재질별로 병합되고 이름이 붙은 부품 그래프. 3D 로 저작한 형상 하나가 씬 컴포넌트로 서는 데 필요한 것을 담는다.",
5
5
  "keywords": [
6
6
  "figure",