@operato/ops-contract 0.9.6 → 0.9.7
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/domain-catalog.js +44 -24
- package/dist-cjs/index.cjs +44 -24
- package/package.json +1 -1
package/dist/domain-catalog.js
CHANGED
|
@@ -164,21 +164,21 @@ export function tenseOf(r) {
|
|
|
164
164
|
/** 관계 전체 — 지도의 선과 항목의 이웃이 여기서 나온다(화면은 이 목록을 갖지 않는다). */
|
|
165
165
|
export const TWIN_RELATIONS = [
|
|
166
166
|
/* 자리가 속한 구역 — **board 밖**(호스트의 `TwinArea`). 해소는 호스트가 한다. */
|
|
167
|
-
{ from: 'locations', field: 'parentId', target: { kind: 'external', entity: 'space.area' }, via: 'ops.rel.area', optional: true },
|
|
167
|
+
{ from: 'locations', field: 'parentId', target: { kind: 'external', entity: 'space.area' }, via: 'ops.rel.area', optional: true, tense: 'standing' },
|
|
168
168
|
/* 자원이 사는 자리 */
|
|
169
|
-
{ from: 'equipment', field: 'homeLocation', target: { kind: 'axis', axis: 'locations' }, via: 'ops.rel.home', optional: true },
|
|
170
|
-
{ from: 'persons', field: 'homeLocation', target: { kind: 'axis', axis: 'locations' }, via: 'ops.rel.home', optional: true },
|
|
171
|
-
{ from: 'assets', field: 'homeLocation', target: { kind: 'axis', axis: 'locations' }, via: 'ops.rel.home', optional: true },
|
|
169
|
+
{ from: 'equipment', field: 'homeLocation', target: { kind: 'axis', axis: 'locations' }, via: 'ops.rel.home', optional: true, tense: 'standing' },
|
|
170
|
+
{ from: 'persons', field: 'homeLocation', target: { kind: 'axis', axis: 'locations' }, via: 'ops.rel.home', optional: true, tense: 'standing' },
|
|
171
|
+
{ from: 'assets', field: 'homeLocation', target: { kind: 'axis', axis: 'locations' }, via: 'ops.rel.home', optional: true, tense: 'standing' },
|
|
172
172
|
/* 자원의 등급 — 설비만 `kind`(타입)로 가고 사람·자산은 등급 목록으로 간다. 표준의 비대칭 그대로. */
|
|
173
|
-
{ from: 'persons', field: 'personnelClassIds[]', target: { kind: 'axis', axis: 'personnelClasses' }, via: 'ops.rel.class', optional: true },
|
|
174
|
-
{ from: 'assets', field: 'assetClassIds[]', target: { kind: 'axis', axis: 'assetClasses' }, via: 'ops.rel.class', optional: true },
|
|
175
|
-
{ from: 'equipment', field: 'kind', target: { kind: 'type', role: 'equipment' }, via: 'ops.rel.type' },
|
|
176
|
-
{ from: 'locations', field: 'type', target: { kind: 'type', role: 'location' }, via: 'ops.rel.type' },
|
|
173
|
+
{ from: 'persons', field: 'personnelClassIds[]', target: { kind: 'axis', axis: 'personnelClasses' }, via: 'ops.rel.class', optional: true, tense: 'standing' },
|
|
174
|
+
{ from: 'assets', field: 'assetClassIds[]', target: { kind: 'axis', axis: 'assetClasses' }, via: 'ops.rel.class', optional: true, tense: 'standing' },
|
|
175
|
+
{ from: 'equipment', field: 'kind', target: { kind: 'type', role: 'equipment' }, via: 'ops.rel.type', tense: 'standing' },
|
|
176
|
+
{ from: 'locations', field: 'type', target: { kind: 'type', role: 'location' }, via: 'ops.rel.type', tense: 'standing' },
|
|
177
177
|
/* 생산 — 레시피에서 시작해 라우트·공정·품목으로 퍼진다 */
|
|
178
|
-
{ from: 'recipes', field: 'route', target: { kind: 'axis', axis: 'routes' }, via: 'ops.rel.route', optional: true },
|
|
179
|
-
{ from: 'recipes', field: 'inputs[].material', target: { kind: 'axis', axis: 'materials' }, via: 'ops.rel.input' },
|
|
180
|
-
{ from: 'recipes', field: 'outputs[].material', target: { kind: 'axis', axis: 'materials' }, via: 'ops.rel.output' },
|
|
181
|
-
{ from: 'routes', field: 'steps[]', target: { kind: 'axis', axis: 'operations' }, via: 'ops.rel.step' },
|
|
178
|
+
{ from: 'recipes', field: 'route', target: { kind: 'axis', axis: 'routes' }, via: 'ops.rel.route', optional: true, tense: 'standing' },
|
|
179
|
+
{ from: 'recipes', field: 'inputs[].material', target: { kind: 'axis', axis: 'materials' }, via: 'ops.rel.input', tense: 'standing' },
|
|
180
|
+
{ from: 'recipes', field: 'outputs[].material', target: { kind: 'axis', axis: 'materials' }, via: 'ops.rel.output', tense: 'standing' },
|
|
181
|
+
{ from: 'routes', field: 'steps[]', target: { kind: 'axis', axis: 'operations' }, via: 'ops.rel.step', tense: 'standing' },
|
|
182
182
|
/*
|
|
183
183
|
* 일정·실적의 관계 — **관측 관계다.** 선언 관계는 "그렇게 만들기로 했다" 이고, 이것은 "그렇게
|
|
184
184
|
* 일어났다" 다. 관계가 없으면 이 두 축은 지도에서 연결되지 않은 카드가 된다(그러면 걸어 들어갈 수 없다).
|
|
@@ -188,7 +188,17 @@ export const TWIN_RELATIONS = [
|
|
|
188
188
|
* 것은 `productionSpec.binding` 이고 그 해소는 호스트가 한다 — 자리·구역과 같은 `external` 이다.
|
|
189
189
|
* 축을 직접 가리키게 적으면 없는 필드를 가리키는 선언이 된다(계약을 보고 고쳤다).
|
|
190
190
|
*/
|
|
191
|
-
{ from: 'orders', field: 'lines[].gtin', target: { kind: 'external', entity: 'gs1.itemRef' }, via: 'ops.rel.item', optional: true },
|
|
191
|
+
{ from: 'orders', field: 'lines[].gtin', target: { kind: 'external', entity: 'gs1.itemRef' }, via: 'ops.rel.item', optional: true, tense: 'standing' },
|
|
192
|
+
/*
|
|
193
|
+
* ── 작업의 관계는 `tense` 를 **선언하지 않는다** ────────────────────────────
|
|
194
|
+
* 여섯 줄 모두 비어 있는 것이 판단이다. 작업의 시간축은 **그 줄의 상태**가 정한다 — 끝난 작업이
|
|
195
|
+
* 이 설비를 가리키면 지난 일이고, 아직인 작업이 가리키면 앞의 일이다. 한 선언이 둘 다이다.
|
|
196
|
+
*
|
|
197
|
+
* 여기에 `standing` 을 적으면 화면은 「이 설비에 걸린 작업 열」을 시간이 없는 사실로 묶고, **세워도
|
|
198
|
+
* 되나의 답이 정확히 뒤집힌다.** 채우고 싶은 힘이 있는 자리이므로 적어 둔다: 비어 있음이 답이다.
|
|
199
|
+
*
|
|
200
|
+
* 줄마다 다른 것은 선언이 아니라 **읽는 쪽이 상태를 보고 판정한다**(`TaskState.status`).
|
|
201
|
+
*/
|
|
192
202
|
{ from: 'tasks', field: 'orderId', target: { kind: 'axis', axis: 'orders' }, via: 'ops.rel.order', optional: true },
|
|
193
203
|
/* 작업의 `kind` 는 그 공정의 키다(라우트의 단계 이름 그대로 — `mes-kernel` 의 공정 목록이 그 증거). */
|
|
194
204
|
{ from: 'tasks', field: 'kind', target: { kind: 'axis', axis: 'operations' }, via: 'ops.rel.operation', optional: true },
|
|
@@ -210,10 +220,20 @@ export const TWIN_RELATIONS = [
|
|
|
210
220
|
* 품목(`gtin`)은 오더와 **같은 규율**이다: 자재 키가 아니라 GS1 품목 참조이므로 축을 직접 가리키지
|
|
211
221
|
* 않고 `external` 로 둔다. 축을 가리키게 적으면 없는 필드를 가리키는 선언이 된다.
|
|
212
222
|
*/
|
|
223
|
+
/*
|
|
224
|
+
* ── 물품의 지금 자리는 세 낱말에 **안 들어간다** ───────────────────────────
|
|
225
|
+
* `location`·`parent`·`carriedBy` 는 지난 일도 앞의 일도 아니고, `standing`(시간이 없는 사실)도
|
|
226
|
+
* 아니다 — **지금 그렇고 곧 바뀐다.** 붙박인 자리(`homeLocation`)와 정반대 성질이고, 두 줄이 같은
|
|
227
|
+
* 낱말을 받으면 화면이 「이 상자는 A 에 있다」를 등급처럼 담아 둔다(캐시해도 되는 사실로 읽는다).
|
|
228
|
+
*
|
|
229
|
+
* 그래서 비워 둔다. **낱말이 하나 없다** — `current`(지금의 사실, 다시 물어야 한다)가 그 자리다.
|
|
230
|
+
* 열거를 늘리는 것은 소비처가 실제로 그 구별에 걸릴 때 하고, 그때까지 미선언으로 남긴다
|
|
231
|
+
* (짐작으로 채우면 그 뒤로는 아무도 이 물음을 다시 안 한다).
|
|
232
|
+
*/
|
|
213
233
|
{ from: 'items', field: 'location', target: { kind: 'axis', axis: 'locations' }, via: 'ops.rel.at' },
|
|
214
234
|
{ from: 'items', field: 'parent', target: { kind: 'axis', axis: 'items' }, via: 'ops.rel.parent', optional: true },
|
|
215
235
|
{ from: 'items', field: 'carriedBy', target: { kind: 'axis', axis: 'assets' }, via: 'ops.rel.asset', optional: true },
|
|
216
|
-
{ from: 'items', field: 'gtin', target: { kind: 'external', entity: 'gs1.itemRef' }, via: 'ops.rel.item', optional: true },
|
|
236
|
+
{ from: 'items', field: 'gtin', target: { kind: 'external', entity: 'gs1.itemRef' }, via: 'ops.rel.item', optional: true, tense: 'standing' },
|
|
217
237
|
/*
|
|
218
238
|
* 자격을 검증한 시험 — **여덟 갈래.** 자원(개체)과 등급 양쪽이 가리킨다: 표준이 그 둘 모두에 이
|
|
219
239
|
* 참조를 두었기 때문이다(개체는 "이 사람이 통과했다", 등급은 "이 자격은 이 시험을 요구한다").
|
|
@@ -221,17 +241,17 @@ export const TWIN_RELATIONS = [
|
|
|
221
241
|
* **자리(`locations`)에는 없다** — 표준이 자리를 시험 대상으로 두지 않았고 그 비대칭은 표준의
|
|
222
242
|
* 판단이다(`contract.ts` 가 "우리도 자리에 넣지 않는다" 고 적었다).
|
|
223
243
|
*/
|
|
224
|
-
{ from: 'persons', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true },
|
|
225
|
-
{ from: 'personnelClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true },
|
|
226
|
-
{ from: 'equipment', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true },
|
|
227
|
-
{ from: 'equipmentClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true },
|
|
228
|
-
{ from: 'assets', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true },
|
|
229
|
-
{ from: 'assetClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true },
|
|
230
|
-
{ from: 'materialDefinitions', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true },
|
|
231
|
-
{ from: 'materialClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true },
|
|
244
|
+
{ from: 'persons', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true, tense: 'standing' },
|
|
245
|
+
{ from: 'personnelClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true, tense: 'standing' },
|
|
246
|
+
{ from: 'equipment', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true, tense: 'standing' },
|
|
247
|
+
{ from: 'equipmentClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true, tense: 'standing' },
|
|
248
|
+
{ from: 'assets', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true, tense: 'standing' },
|
|
249
|
+
{ from: 'assetClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true, tense: 'standing' },
|
|
250
|
+
{ from: 'materialDefinitions', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true, tense: 'standing' },
|
|
251
|
+
{ from: 'materialClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'ops.rel.test', optional: true, tense: 'standing' },
|
|
232
252
|
/* 공정이 도는 자리·자원 — 항목이 아니라 **타입**을 가리킨다 */
|
|
233
|
-
{ from: 'operations', field: 'locationType', target: { kind: 'type', role: 'location' }, via: 'ops.rel.at', optional: true },
|
|
234
|
-
{ from: 'operations', field: 'resourceType', target: { kind: 'type', role: 'equipment' }, via: 'ops.rel.by', optional: true }
|
|
253
|
+
{ from: 'operations', field: 'locationType', target: { kind: 'type', role: 'location' }, via: 'ops.rel.at', optional: true, tense: 'standing' },
|
|
254
|
+
{ from: 'operations', field: 'resourceType', target: { kind: 'type', role: 'equipment' }, via: 'ops.rel.by', optional: true, tense: 'standing' }
|
|
235
255
|
];
|
|
236
256
|
/**
|
|
237
257
|
* 오늘 **실제로 짝이 서는 것**만 선언한다. 그럴듯한 속성을 미리 적어 두면 화면이 빈칸을 줄줄이
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -1878,21 +1878,21 @@ function tenseOf(r) {
|
|
|
1878
1878
|
}
|
|
1879
1879
|
var TWIN_RELATIONS = [
|
|
1880
1880
|
/* 자리가 속한 구역 — **board 밖**(호스트의 `TwinArea`). 해소는 호스트가 한다. */
|
|
1881
|
-
{ from: "locations", field: "parentId", target: { kind: "external", entity: "space.area" }, via: "ops.rel.area", optional: true },
|
|
1881
|
+
{ from: "locations", field: "parentId", target: { kind: "external", entity: "space.area" }, via: "ops.rel.area", optional: true, tense: "standing" },
|
|
1882
1882
|
/* 자원이 사는 자리 */
|
|
1883
|
-
{ from: "equipment", field: "homeLocation", target: { kind: "axis", axis: "locations" }, via: "ops.rel.home", optional: true },
|
|
1884
|
-
{ from: "persons", field: "homeLocation", target: { kind: "axis", axis: "locations" }, via: "ops.rel.home", optional: true },
|
|
1885
|
-
{ from: "assets", field: "homeLocation", target: { kind: "axis", axis: "locations" }, via: "ops.rel.home", optional: true },
|
|
1883
|
+
{ from: "equipment", field: "homeLocation", target: { kind: "axis", axis: "locations" }, via: "ops.rel.home", optional: true, tense: "standing" },
|
|
1884
|
+
{ from: "persons", field: "homeLocation", target: { kind: "axis", axis: "locations" }, via: "ops.rel.home", optional: true, tense: "standing" },
|
|
1885
|
+
{ from: "assets", field: "homeLocation", target: { kind: "axis", axis: "locations" }, via: "ops.rel.home", optional: true, tense: "standing" },
|
|
1886
1886
|
/* 자원의 등급 — 설비만 `kind`(타입)로 가고 사람·자산은 등급 목록으로 간다. 표준의 비대칭 그대로. */
|
|
1887
|
-
{ from: "persons", field: "personnelClassIds[]", target: { kind: "axis", axis: "personnelClasses" }, via: "ops.rel.class", optional: true },
|
|
1888
|
-
{ from: "assets", field: "assetClassIds[]", target: { kind: "axis", axis: "assetClasses" }, via: "ops.rel.class", optional: true },
|
|
1889
|
-
{ from: "equipment", field: "kind", target: { kind: "type", role: "equipment" }, via: "ops.rel.type" },
|
|
1890
|
-
{ from: "locations", field: "type", target: { kind: "type", role: "location" }, via: "ops.rel.type" },
|
|
1887
|
+
{ from: "persons", field: "personnelClassIds[]", target: { kind: "axis", axis: "personnelClasses" }, via: "ops.rel.class", optional: true, tense: "standing" },
|
|
1888
|
+
{ from: "assets", field: "assetClassIds[]", target: { kind: "axis", axis: "assetClasses" }, via: "ops.rel.class", optional: true, tense: "standing" },
|
|
1889
|
+
{ from: "equipment", field: "kind", target: { kind: "type", role: "equipment" }, via: "ops.rel.type", tense: "standing" },
|
|
1890
|
+
{ from: "locations", field: "type", target: { kind: "type", role: "location" }, via: "ops.rel.type", tense: "standing" },
|
|
1891
1891
|
/* 생산 — 레시피에서 시작해 라우트·공정·품목으로 퍼진다 */
|
|
1892
|
-
{ from: "recipes", field: "route", target: { kind: "axis", axis: "routes" }, via: "ops.rel.route", optional: true },
|
|
1893
|
-
{ from: "recipes", field: "inputs[].material", target: { kind: "axis", axis: "materials" }, via: "ops.rel.input" },
|
|
1894
|
-
{ from: "recipes", field: "outputs[].material", target: { kind: "axis", axis: "materials" }, via: "ops.rel.output" },
|
|
1895
|
-
{ from: "routes", field: "steps[]", target: { kind: "axis", axis: "operations" }, via: "ops.rel.step" },
|
|
1892
|
+
{ from: "recipes", field: "route", target: { kind: "axis", axis: "routes" }, via: "ops.rel.route", optional: true, tense: "standing" },
|
|
1893
|
+
{ from: "recipes", field: "inputs[].material", target: { kind: "axis", axis: "materials" }, via: "ops.rel.input", tense: "standing" },
|
|
1894
|
+
{ from: "recipes", field: "outputs[].material", target: { kind: "axis", axis: "materials" }, via: "ops.rel.output", tense: "standing" },
|
|
1895
|
+
{ from: "routes", field: "steps[]", target: { kind: "axis", axis: "operations" }, via: "ops.rel.step", tense: "standing" },
|
|
1896
1896
|
/*
|
|
1897
1897
|
* 일정·실적의 관계 — **관측 관계다.** 선언 관계는 "그렇게 만들기로 했다" 이고, 이것은 "그렇게
|
|
1898
1898
|
* 일어났다" 다. 관계가 없으면 이 두 축은 지도에서 연결되지 않은 카드가 된다(그러면 걸어 들어갈 수 없다).
|
|
@@ -1902,7 +1902,17 @@ var TWIN_RELATIONS = [
|
|
|
1902
1902
|
* 것은 `productionSpec.binding` 이고 그 해소는 호스트가 한다 — 자리·구역과 같은 `external` 이다.
|
|
1903
1903
|
* 축을 직접 가리키게 적으면 없는 필드를 가리키는 선언이 된다(계약을 보고 고쳤다).
|
|
1904
1904
|
*/
|
|
1905
|
-
{ from: "orders", field: "lines[].gtin", target: { kind: "external", entity: "gs1.itemRef" }, via: "ops.rel.item", optional: true },
|
|
1905
|
+
{ from: "orders", field: "lines[].gtin", target: { kind: "external", entity: "gs1.itemRef" }, via: "ops.rel.item", optional: true, tense: "standing" },
|
|
1906
|
+
/*
|
|
1907
|
+
* ── 작업의 관계는 `tense` 를 **선언하지 않는다** ────────────────────────────
|
|
1908
|
+
* 여섯 줄 모두 비어 있는 것이 판단이다. 작업의 시간축은 **그 줄의 상태**가 정한다 — 끝난 작업이
|
|
1909
|
+
* 이 설비를 가리키면 지난 일이고, 아직인 작업이 가리키면 앞의 일이다. 한 선언이 둘 다이다.
|
|
1910
|
+
*
|
|
1911
|
+
* 여기에 `standing` 을 적으면 화면은 「이 설비에 걸린 작업 열」을 시간이 없는 사실로 묶고, **세워도
|
|
1912
|
+
* 되나의 답이 정확히 뒤집힌다.** 채우고 싶은 힘이 있는 자리이므로 적어 둔다: 비어 있음이 답이다.
|
|
1913
|
+
*
|
|
1914
|
+
* 줄마다 다른 것은 선언이 아니라 **읽는 쪽이 상태를 보고 판정한다**(`TaskState.status`).
|
|
1915
|
+
*/
|
|
1906
1916
|
{ from: "tasks", field: "orderId", target: { kind: "axis", axis: "orders" }, via: "ops.rel.order", optional: true },
|
|
1907
1917
|
/* 작업의 `kind` 는 그 공정의 키다(라우트의 단계 이름 그대로 — `mes-kernel` 의 공정 목록이 그 증거). */
|
|
1908
1918
|
{ from: "tasks", field: "kind", target: { kind: "axis", axis: "operations" }, via: "ops.rel.operation", optional: true },
|
|
@@ -1924,10 +1934,20 @@ var TWIN_RELATIONS = [
|
|
|
1924
1934
|
* 품목(`gtin`)은 오더와 **같은 규율**이다: 자재 키가 아니라 GS1 품목 참조이므로 축을 직접 가리키지
|
|
1925
1935
|
* 않고 `external` 로 둔다. 축을 가리키게 적으면 없는 필드를 가리키는 선언이 된다.
|
|
1926
1936
|
*/
|
|
1937
|
+
/*
|
|
1938
|
+
* ── 물품의 지금 자리는 세 낱말에 **안 들어간다** ───────────────────────────
|
|
1939
|
+
* `location`·`parent`·`carriedBy` 는 지난 일도 앞의 일도 아니고, `standing`(시간이 없는 사실)도
|
|
1940
|
+
* 아니다 — **지금 그렇고 곧 바뀐다.** 붙박인 자리(`homeLocation`)와 정반대 성질이고, 두 줄이 같은
|
|
1941
|
+
* 낱말을 받으면 화면이 「이 상자는 A 에 있다」를 등급처럼 담아 둔다(캐시해도 되는 사실로 읽는다).
|
|
1942
|
+
*
|
|
1943
|
+
* 그래서 비워 둔다. **낱말이 하나 없다** — `current`(지금의 사실, 다시 물어야 한다)가 그 자리다.
|
|
1944
|
+
* 열거를 늘리는 것은 소비처가 실제로 그 구별에 걸릴 때 하고, 그때까지 미선언으로 남긴다
|
|
1945
|
+
* (짐작으로 채우면 그 뒤로는 아무도 이 물음을 다시 안 한다).
|
|
1946
|
+
*/
|
|
1927
1947
|
{ from: "items", field: "location", target: { kind: "axis", axis: "locations" }, via: "ops.rel.at" },
|
|
1928
1948
|
{ from: "items", field: "parent", target: { kind: "axis", axis: "items" }, via: "ops.rel.parent", optional: true },
|
|
1929
1949
|
{ from: "items", field: "carriedBy", target: { kind: "axis", axis: "assets" }, via: "ops.rel.asset", optional: true },
|
|
1930
|
-
{ from: "items", field: "gtin", target: { kind: "external", entity: "gs1.itemRef" }, via: "ops.rel.item", optional: true },
|
|
1950
|
+
{ from: "items", field: "gtin", target: { kind: "external", entity: "gs1.itemRef" }, via: "ops.rel.item", optional: true, tense: "standing" },
|
|
1931
1951
|
/*
|
|
1932
1952
|
* 자격을 검증한 시험 — **여덟 갈래.** 자원(개체)과 등급 양쪽이 가리킨다: 표준이 그 둘 모두에 이
|
|
1933
1953
|
* 참조를 두었기 때문이다(개체는 "이 사람이 통과했다", 등급은 "이 자격은 이 시험을 요구한다").
|
|
@@ -1935,17 +1955,17 @@ var TWIN_RELATIONS = [
|
|
|
1935
1955
|
* **자리(`locations`)에는 없다** — 표준이 자리를 시험 대상으로 두지 않았고 그 비대칭은 표준의
|
|
1936
1956
|
* 판단이다(`contract.ts` 가 "우리도 자리에 넣지 않는다" 고 적었다).
|
|
1937
1957
|
*/
|
|
1938
|
-
{ from: "persons", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true },
|
|
1939
|
-
{ from: "personnelClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true },
|
|
1940
|
-
{ from: "equipment", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true },
|
|
1941
|
-
{ from: "equipmentClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true },
|
|
1942
|
-
{ from: "assets", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true },
|
|
1943
|
-
{ from: "assetClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true },
|
|
1944
|
-
{ from: "materialDefinitions", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true },
|
|
1945
|
-
{ from: "materialClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true },
|
|
1958
|
+
{ from: "persons", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true, tense: "standing" },
|
|
1959
|
+
{ from: "personnelClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true, tense: "standing" },
|
|
1960
|
+
{ from: "equipment", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true, tense: "standing" },
|
|
1961
|
+
{ from: "equipmentClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true, tense: "standing" },
|
|
1962
|
+
{ from: "assets", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true, tense: "standing" },
|
|
1963
|
+
{ from: "assetClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true, tense: "standing" },
|
|
1964
|
+
{ from: "materialDefinitions", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true, tense: "standing" },
|
|
1965
|
+
{ from: "materialClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "ops.rel.test", optional: true, tense: "standing" },
|
|
1946
1966
|
/* 공정이 도는 자리·자원 — 항목이 아니라 **타입**을 가리킨다 */
|
|
1947
|
-
{ from: "operations", field: "locationType", target: { kind: "type", role: "location" }, via: "ops.rel.at", optional: true },
|
|
1948
|
-
{ from: "operations", field: "resourceType", target: { kind: "type", role: "equipment" }, via: "ops.rel.by", optional: true }
|
|
1967
|
+
{ from: "operations", field: "locationType", target: { kind: "type", role: "location" }, via: "ops.rel.at", optional: true, tense: "standing" },
|
|
1968
|
+
{ from: "operations", field: "resourceType", target: { kind: "type", role: "equipment" }, via: "ops.rel.by", optional: true, tense: "standing" }
|
|
1949
1969
|
];
|
|
1950
1970
|
var TWIN_PROPERTIES = [
|
|
1951
1971
|
/* 공정 — 선언(ISO 8601 기간)과 관측(저널에서 계산한 분포)이 둘 다 있는 유일한 짝. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@operato/ops-contract",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.7",
|
|
4
4
|
"description": "Operations domain contract — the standard vocabulary that producers and readers agree on (EPCIS 2.0/GS1, ISA-95, IEC 61850/ISO 50001). Types, guards, validation. No state, no engine.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist-cjs/index.cjs",
|