@things-factory/ops-master 10.1.247 → 10.1.248

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/package.json +3 -3
  2. package/dist-client/bootstrap.d.ts +0 -19
  3. package/dist-client/bootstrap.js +0 -66
  4. package/dist-client/bootstrap.js.map +0 -1
  5. package/dist-client/index.d.ts +0 -17
  6. package/dist-client/index.js +0 -21
  7. package/dist-client/index.js.map +0 -1
  8. package/dist-client/master-change-approval.d.ts +0 -14
  9. package/dist-client/master-change-approval.js +0 -36
  10. package/dist-client/master-change-approval.js.map +0 -1
  11. package/dist-client/master-change-policy-axes.d.ts +0 -37
  12. package/dist-client/master-change-policy-axes.js +0 -29
  13. package/dist-client/master-change-policy-axes.js.map +0 -1
  14. package/dist-client/master-change-policy-panel.d.ts +0 -59
  15. package/dist-client/master-change-policy-panel.js +0 -454
  16. package/dist-client/master-change-policy-panel.js.map +0 -1
  17. package/dist-client/master-change-providers.d.ts +0 -4
  18. package/dist-client/master-change-providers.js +0 -91
  19. package/dist-client/master-change-providers.js.map +0 -1
  20. package/dist-client/pages/master/applied-when-dialog.d.ts +0 -48
  21. package/dist-client/pages/master/applied-when-dialog.js +0 -137
  22. package/dist-client/pages/master/applied-when-dialog.js.map +0 -1
  23. package/dist-client/pages/master/assignment-fields.d.ts +0 -27
  24. package/dist-client/pages/master/assignment-fields.js +0 -62
  25. package/dist-client/pages/master/assignment-fields.js.map +0 -1
  26. package/dist-client/pages/master/equipment-class.d.ts +0 -12
  27. package/dist-client/pages/master/equipment-class.js +0 -42
  28. package/dist-client/pages/master/equipment-class.js.map +0 -1
  29. package/dist-client/pages/master/equipment.d.ts +0 -12
  30. package/dist-client/pages/master/equipment.js +0 -58
  31. package/dist-client/pages/master/equipment.js.map +0 -1
  32. package/dist-client/pages/master/grist-iso-duration.d.ts +0 -20
  33. package/dist-client/pages/master/grist-iso-duration.js +0 -70
  34. package/dist-client/pages/master/grist-iso-duration.js.map +0 -1
  35. package/dist-client/pages/master/grist-reference.d.ts +0 -91
  36. package/dist-client/pages/master/grist-reference.js +0 -419
  37. package/dist-client/pages/master/grist-reference.js.map +0 -1
  38. package/dist-client/pages/master/import-rows.d.ts +0 -35
  39. package/dist-client/pages/master/import-rows.js +0 -66
  40. package/dist-client/pages/master/import-rows.js.map +0 -1
  41. package/dist-client/pages/master/iso-duration.d.ts +0 -34
  42. package/dist-client/pages/master/iso-duration.js +0 -76
  43. package/dist-client/pages/master/iso-duration.js.map +0 -1
  44. package/dist-client/pages/master/master-options.d.ts +0 -40
  45. package/dist-client/pages/master/master-options.js +0 -54
  46. package/dist-client/pages/master/master-options.js.map +0 -1
  47. package/dist-client/pages/master/master-page-base.d.ts +0 -369
  48. package/dist-client/pages/master/master-page-base.js +0 -657
  49. package/dist-client/pages/master/master-page-base.js.map +0 -1
  50. package/dist-client/pages/master/material-class.d.ts +0 -12
  51. package/dist-client/pages/master/material-class.js +0 -42
  52. package/dist-client/pages/master/material-class.js.map +0 -1
  53. package/dist-client/pages/master/material-definition.d.ts +0 -5
  54. package/dist-client/pages/master/material-definition.js +0 -14
  55. package/dist-client/pages/master/material-definition.js.map +0 -1
  56. package/dist-client/pages/master/material-revision-fields.d.ts +0 -2
  57. package/dist-client/pages/master/material-revision-fields.js +0 -43
  58. package/dist-client/pages/master/material-revision-fields.js.map +0 -1
  59. package/dist-client/pages/master/operation-definition.d.ts +0 -12
  60. package/dist-client/pages/master/operation-definition.js +0 -49
  61. package/dist-client/pages/master/operation-definition.js.map +0 -1
  62. package/dist-client/pages/master/operational-location.d.ts +0 -84
  63. package/dist-client/pages/master/operational-location.js +0 -432
  64. package/dist-client/pages/master/operational-location.js.map +0 -1
  65. package/dist-client/pages/master/person.d.ts +0 -12
  66. package/dist-client/pages/master/person.js +0 -41
  67. package/dist-client/pages/master/person.js.map +0 -1
  68. package/dist-client/pages/master/personnel-class.d.ts +0 -12
  69. package/dist-client/pages/master/personnel-class.js +0 -43
  70. package/dist-client/pages/master/personnel-class.js.map +0 -1
  71. package/dist-client/pages/master/physical-asset-class.d.ts +0 -12
  72. package/dist-client/pages/master/physical-asset-class.js +0 -40
  73. package/dist-client/pages/master/physical-asset-class.js.map +0 -1
  74. package/dist-client/pages/master/physical-asset.d.ts +0 -12
  75. package/dist-client/pages/master/physical-asset.js +0 -41
  76. package/dist-client/pages/master/physical-asset.js.map +0 -1
  77. package/dist-client/pages/master/recipe-definition.d.ts +0 -5
  78. package/dist-client/pages/master/recipe-definition.js +0 -14
  79. package/dist-client/pages/master/recipe-definition.js.map +0 -1
  80. package/dist-client/pages/master/reference-targets.d.ts +0 -42
  81. package/dist-client/pages/master/reference-targets.js +0 -82
  82. package/dist-client/pages/master/reference-targets.js.map +0 -1
  83. package/dist-client/pages/master/revision-comparison.d.ts +0 -49
  84. package/dist-client/pages/master/revision-comparison.js +0 -560
  85. package/dist-client/pages/master/revision-comparison.js.map +0 -1
  86. package/dist-client/pages/master/revision-view.d.ts +0 -34
  87. package/dist-client/pages/master/revision-view.js +0 -145
  88. package/dist-client/pages/master/revision-view.js.map +0 -1
  89. package/dist-client/pages/master/revision-workspace.d.ts +0 -50
  90. package/dist-client/pages/master/revision-workspace.js +0 -763
  91. package/dist-client/pages/master/revision-workspace.js.map +0 -1
  92. package/dist-client/pages/master/route-definition.d.ts +0 -19
  93. package/dist-client/pages/master/route-definition.js +0 -40
  94. package/dist-client/pages/master/route-definition.js.map +0 -1
  95. package/dist-client/pages/master/stop-reason.d.ts +0 -12
  96. package/dist-client/pages/master/stop-reason.js +0 -48
  97. package/dist-client/pages/master/stop-reason.js.map +0 -1
  98. package/dist-client/pages/master/test-specification.d.ts +0 -5
  99. package/dist-client/pages/master/test-specification.js +0 -14
  100. package/dist-client/pages/master/test-specification.js.map +0 -1
  101. package/dist-client/pages/master-axes.d.ts +0 -24
  102. package/dist-client/pages/master-axes.js +0 -39
  103. package/dist-client/pages/master-axes.js.map +0 -1
  104. package/dist-client/route.d.ts +0 -1
  105. package/dist-client/route.js +0 -81
  106. package/dist-client/route.js.map +0 -1
  107. package/dist-client/tsconfig.tsbuildinfo +0 -1
  108. package/dist-server/index.d.ts +0 -1
  109. package/dist-server/index.js +0 -19
  110. package/dist-server/index.js.map +0 -1
  111. package/dist-server/service/ai-entry/master-entry-rules.d.ts +0 -175
  112. package/dist-server/service/ai-entry/master-entry-rules.js +0 -302
  113. package/dist-server/service/ai-entry/master-entry-rules.js.map +0 -1
  114. package/dist-server/service/ai-entry/master-entry-targets.d.ts +0 -23
  115. package/dist-server/service/ai-entry/master-entry-targets.js +0 -293
  116. package/dist-server/service/ai-entry/master-entry-targets.js.map +0 -1
  117. package/dist-server/service/approval-route.d.ts +0 -37
  118. package/dist-server/service/approval-route.js +0 -34
  119. package/dist-server/service/approval-route.js.map +0 -1
  120. package/dist-server/service/asset/asset-lifecycle.d.ts +0 -106
  121. package/dist-server/service/asset/asset-lifecycle.js +0 -126
  122. package/dist-server/service/asset/asset-lifecycle.js.map +0 -1
  123. package/dist-server/service/asset/asset-master-resolver.d.ts +0 -53
  124. package/dist-server/service/asset/asset-master-resolver.js +0 -185
  125. package/dist-server/service/asset/asset-master-resolver.js.map +0 -1
  126. package/dist-server/service/asset/asset-master.d.ts +0 -21
  127. package/dist-server/service/asset/asset-master.js +0 -25
  128. package/dist-server/service/asset/asset-master.js.map +0 -1
  129. package/dist-server/service/asset/asset-query.d.ts +0 -16
  130. package/dist-server/service/asset/asset-query.js +0 -72
  131. package/dist-server/service/asset/asset-query.js.map +0 -1
  132. package/dist-server/service/asset/index.d.ts +0 -6
  133. package/dist-server/service/asset/index.js +0 -10
  134. package/dist-server/service/asset/index.js.map +0 -1
  135. package/dist-server/service/asset/physical-asset-class.d.ts +0 -34
  136. package/dist-server/service/asset/physical-asset-class.js +0 -104
  137. package/dist-server/service/asset/physical-asset-class.js.map +0 -1
  138. package/dist-server/service/asset/physical-asset.d.ts +0 -66
  139. package/dist-server/service/asset/physical-asset.js +0 -123
  140. package/dist-server/service/asset/physical-asset.js.map +0 -1
  141. package/dist-server/service/assignment/applied-when.d.ts +0 -24
  142. package/dist-server/service/assignment/applied-when.js +0 -16
  143. package/dist-server/service/assignment/applied-when.js.map +0 -1
  144. package/dist-server/service/assignment/assignment-history.d.ts +0 -92
  145. package/dist-server/service/assignment/assignment-history.js +0 -289
  146. package/dist-server/service/assignment/assignment-history.js.map +0 -1
  147. package/dist-server/service/assignment/assignment-write.d.ts +0 -42
  148. package/dist-server/service/assignment/assignment-write.js +0 -101
  149. package/dist-server/service/assignment/assignment-write.js.map +0 -1
  150. package/dist-server/service/assignment/master-value-claim.d.ts +0 -135
  151. package/dist-server/service/assignment/master-value-claim.js +0 -174
  152. package/dist-server/service/assignment/master-value-claim.js.map +0 -1
  153. package/dist-server/service/equipment/equipment-class.d.ts +0 -34
  154. package/dist-server/service/equipment/equipment-class.js +0 -104
  155. package/dist-server/service/equipment/equipment-class.js.map +0 -1
  156. package/dist-server/service/equipment/equipment-master-resolver.d.ts +0 -77
  157. package/dist-server/service/equipment/equipment-master-resolver.js +0 -266
  158. package/dist-server/service/equipment/equipment-master-resolver.js.map +0 -1
  159. package/dist-server/service/equipment/equipment-master.d.ts +0 -30
  160. package/dist-server/service/equipment/equipment-master.js +0 -53
  161. package/dist-server/service/equipment/equipment-master.js.map +0 -1
  162. package/dist-server/service/equipment/equipment-query.d.ts +0 -16
  163. package/dist-server/service/equipment/equipment-query.js +0 -72
  164. package/dist-server/service/equipment/equipment-query.js.map +0 -1
  165. package/dist-server/service/equipment/equipment.d.ts +0 -71
  166. package/dist-server/service/equipment/equipment.js +0 -138
  167. package/dist-server/service/equipment/equipment.js.map +0 -1
  168. package/dist-server/service/equipment/index.d.ts +0 -8
  169. package/dist-server/service/equipment/index.js +0 -12
  170. package/dist-server/service/equipment/index.js.map +0 -1
  171. package/dist-server/service/equipment/state-period-rules.d.ts +0 -95
  172. package/dist-server/service/equipment/state-period-rules.js +0 -122
  173. package/dist-server/service/equipment/state-period-rules.js.map +0 -1
  174. package/dist-server/service/equipment/stop-reason-query.d.ts +0 -11
  175. package/dist-server/service/equipment/stop-reason-query.js +0 -39
  176. package/dist-server/service/equipment/stop-reason-query.js.map +0 -1
  177. package/dist-server/service/equipment/stop-reason.d.ts +0 -58
  178. package/dist-server/service/equipment/stop-reason.js +0 -114
  179. package/dist-server/service/equipment/stop-reason.js.map +0 -1
  180. package/dist-server/service/index.d.ts +0 -82
  181. package/dist-server/service/index.js +0 -145
  182. package/dist-server/service/index.js.map +0 -1
  183. package/dist-server/service/location/index.d.ts +0 -5
  184. package/dist-server/service/location/index.js +0 -9
  185. package/dist-server/service/location/index.js.map +0 -1
  186. package/dist-server/service/location/location-master-resolver.d.ts +0 -60
  187. package/dist-server/service/location/location-master-resolver.js +0 -313
  188. package/dist-server/service/location/location-master-resolver.js.map +0 -1
  189. package/dist-server/service/location/location-master.d.ts +0 -26
  190. package/dist-server/service/location/location-master.js +0 -28
  191. package/dist-server/service/location/location-master.js.map +0 -1
  192. package/dist-server/service/location/location-query.d.ts +0 -15
  193. package/dist-server/service/location/location-query.js +0 -56
  194. package/dist-server/service/location/location-query.js.map +0 -1
  195. package/dist-server/service/location/operational-location.d.ts +0 -116
  196. package/dist-server/service/location/operational-location.js +0 -157
  197. package/dist-server/service/location/operational-location.js.map +0 -1
  198. package/dist-server/service/master-axis.d.ts +0 -40
  199. package/dist-server/service/master-axis.js +0 -57
  200. package/dist-server/service/master-axis.js.map +0 -1
  201. package/dist-server/service/master-change-approval/approval-input.d.ts +0 -17
  202. package/dist-server/service/master-change-approval/approval-input.js +0 -35
  203. package/dist-server/service/master-change-approval/approval-input.js.map +0 -1
  204. package/dist-server/service/master-change-approval/builtin-axes.d.ts +0 -4
  205. package/dist-server/service/master-change-approval/builtin-axes.js +0 -96
  206. package/dist-server/service/master-change-approval/builtin-axes.js.map +0 -1
  207. package/dist-server/service/master-change-approval/index.d.ts +0 -14
  208. package/dist-server/service/master-change-approval/index.js +0 -37
  209. package/dist-server/service/master-change-approval/index.js.map +0 -1
  210. package/dist-server/service/master-change-approval/master-change-axis.d.ts +0 -54
  211. package/dist-server/service/master-change-approval/master-change-axis.js +0 -17
  212. package/dist-server/service/master-change-approval/master-change-axis.js.map +0 -1
  213. package/dist-server/service/master-change-approval/master-change-flow.d.ts +0 -65
  214. package/dist-server/service/master-change-approval/master-change-flow.js +0 -125
  215. package/dist-server/service/master-change-approval/master-change-flow.js.map +0 -1
  216. package/dist-server/service/master-change-approval/master-change-resolver.d.ts +0 -18
  217. package/dist-server/service/master-change-approval/master-change-resolver.js +0 -58
  218. package/dist-server/service/master-change-approval/master-change-resolver.js.map +0 -1
  219. package/dist-server/service/master-change-policy.d.ts +0 -122
  220. package/dist-server/service/master-change-policy.js +0 -304
  221. package/dist-server/service/master-change-policy.js.map +0 -1
  222. package/dist-server/service/master-conformance-resolver.d.ts +0 -34
  223. package/dist-server/service/master-conformance-resolver.js +0 -153
  224. package/dist-server/service/master-conformance-resolver.js.map +0 -1
  225. package/dist-server/service/master-conformance.d.ts +0 -80
  226. package/dist-server/service/master-conformance.js +0 -266
  227. package/dist-server/service/master-conformance.js.map +0 -1
  228. package/dist-server/service/master-crud.d.ts +0 -55
  229. package/dist-server/service/master-crud.js +0 -93
  230. package/dist-server/service/master-crud.js.map +0 -1
  231. package/dist-server/service/master-list.d.ts +0 -12
  232. package/dist-server/service/master-list.js +0 -30
  233. package/dist-server/service/master-list.js.map +0 -1
  234. package/dist-server/service/master-page-query.d.ts +0 -33
  235. package/dist-server/service/master-page-query.js +0 -55
  236. package/dist-server/service/master-page-query.js.map +0 -1
  237. package/dist-server/service/master-page.d.ts +0 -85
  238. package/dist-server/service/master-page.js +0 -104
  239. package/dist-server/service/master-page.js.map +0 -1
  240. package/dist-server/service/material/index.d.ts +0 -7
  241. package/dist-server/service/material/index.js +0 -12
  242. package/dist-server/service/material/index.js.map +0 -1
  243. package/dist-server/service/material/material-axis-status.d.ts +0 -8
  244. package/dist-server/service/material/material-axis-status.js +0 -19
  245. package/dist-server/service/material/material-axis-status.js.map +0 -1
  246. package/dist-server/service/material/material-class.d.ts +0 -34
  247. package/dist-server/service/material/material-class.js +0 -104
  248. package/dist-server/service/material/material-class.js.map +0 -1
  249. package/dist-server/service/material/material-definition.d.ts +0 -45
  250. package/dist-server/service/material/material-definition.js +0 -125
  251. package/dist-server/service/material/material-definition.js.map +0 -1
  252. package/dist-server/service/material/material-effective-list.d.ts +0 -39
  253. package/dist-server/service/material/material-effective-list.js +0 -54
  254. package/dist-server/service/material/material-effective-list.js.map +0 -1
  255. package/dist-server/service/material/material-master-resolver.d.ts +0 -106
  256. package/dist-server/service/material/material-master-resolver.js +0 -351
  257. package/dist-server/service/material/material-master-resolver.js.map +0 -1
  258. package/dist-server/service/material/material-master.d.ts +0 -9
  259. package/dist-server/service/material/material-master.js +0 -24
  260. package/dist-server/service/material/material-master.js.map +0 -1
  261. package/dist-server/service/material/material-query.d.ts +0 -16
  262. package/dist-server/service/material/material-query.js +0 -79
  263. package/dist-server/service/material/material-query.js.map +0 -1
  264. package/dist-server/service/material/material-revision-content.d.ts +0 -10
  265. package/dist-server/service/material/material-revision-content.js +0 -92
  266. package/dist-server/service/material/material-revision-content.js.map +0 -1
  267. package/dist-server/service/material/material-revision-resolver.d.ts +0 -60
  268. package/dist-server/service/material/material-revision-resolver.js +0 -96
  269. package/dist-server/service/material/material-revision-resolver.js.map +0 -1
  270. package/dist-server/service/material/material-revision-service.d.ts +0 -179
  271. package/dist-server/service/material/material-revision-service.js +0 -687
  272. package/dist-server/service/material/material-revision-service.js.map +0 -1
  273. package/dist-server/service/material/material-revision.d.ts +0 -86
  274. package/dist-server/service/material/material-revision.js +0 -339
  275. package/dist-server/service/material/material-revision.js.map +0 -1
  276. package/dist-server/service/material/recipe-index.d.ts +0 -23
  277. package/dist-server/service/material/recipe-index.js +0 -44
  278. package/dist-server/service/material/recipe-index.js.map +0 -1
  279. package/dist-server/service/operation/index.d.ts +0 -6
  280. package/dist-server/service/operation/index.js +0 -10
  281. package/dist-server/service/operation/index.js.map +0 -1
  282. package/dist-server/service/operation/operation-definition.d.ts +0 -52
  283. package/dist-server/service/operation/operation-definition.js +0 -143
  284. package/dist-server/service/operation/operation-definition.js.map +0 -1
  285. package/dist-server/service/operation/operation-master-resolver.d.ts +0 -52
  286. package/dist-server/service/operation/operation-master-resolver.js +0 -187
  287. package/dist-server/service/operation/operation-master-resolver.js.map +0 -1
  288. package/dist-server/service/operation/operation-master.d.ts +0 -21
  289. package/dist-server/service/operation/operation-master.js +0 -28
  290. package/dist-server/service/operation/operation-master.js.map +0 -1
  291. package/dist-server/service/operation/operation-query.d.ts +0 -15
  292. package/dist-server/service/operation/operation-query.js +0 -56
  293. package/dist-server/service/operation/operation-query.js.map +0 -1
  294. package/dist-server/service/operation/operation-readiness-resolver.d.ts +0 -39
  295. package/dist-server/service/operation/operation-readiness-resolver.js +0 -111
  296. package/dist-server/service/operation/operation-readiness-resolver.js.map +0 -1
  297. package/dist-server/service/operation/operation-readiness.d.ts +0 -34
  298. package/dist-server/service/operation/operation-readiness.js +0 -133
  299. package/dist-server/service/operation/operation-readiness.js.map +0 -1
  300. package/dist-server/service/personnel/index.d.ts +0 -6
  301. package/dist-server/service/personnel/index.js +0 -10
  302. package/dist-server/service/personnel/index.js.map +0 -1
  303. package/dist-server/service/personnel/person.d.ts +0 -51
  304. package/dist-server/service/personnel/person.js +0 -119
  305. package/dist-server/service/personnel/person.js.map +0 -1
  306. package/dist-server/service/personnel/personnel-class-readiness.d.ts +0 -22
  307. package/dist-server/service/personnel/personnel-class-readiness.js +0 -98
  308. package/dist-server/service/personnel/personnel-class-readiness.js.map +0 -1
  309. package/dist-server/service/personnel/personnel-class.d.ts +0 -54
  310. package/dist-server/service/personnel/personnel-class.js +0 -114
  311. package/dist-server/service/personnel/personnel-class.js.map +0 -1
  312. package/dist-server/service/personnel/personnel-master-resolver.d.ts +0 -53
  313. package/dist-server/service/personnel/personnel-master-resolver.js +0 -187
  314. package/dist-server/service/personnel/personnel-master-resolver.js.map +0 -1
  315. package/dist-server/service/personnel/personnel-master.d.ts +0 -39
  316. package/dist-server/service/personnel/personnel-master.js +0 -34
  317. package/dist-server/service/personnel/personnel-master.js.map +0 -1
  318. package/dist-server/service/personnel/personnel-query.d.ts +0 -29
  319. package/dist-server/service/personnel/personnel-query.js +0 -79
  320. package/dist-server/service/personnel/personnel-query.js.map +0 -1
  321. package/dist-server/service/personnel/qualification.d.ts +0 -104
  322. package/dist-server/service/personnel/qualification.js +0 -147
  323. package/dist-server/service/personnel/qualification.js.map +0 -1
  324. package/dist-server/service/quality/index.d.ts +0 -4
  325. package/dist-server/service/quality/index.js +0 -8
  326. package/dist-server/service/quality/index.js.map +0 -1
  327. package/dist-server/service/quality/nonconformance-cause-resolver.d.ts +0 -12
  328. package/dist-server/service/quality/nonconformance-cause-resolver.js +0 -60
  329. package/dist-server/service/quality/nonconformance-cause-resolver.js.map +0 -1
  330. package/dist-server/service/quality/nonconformance-cause.d.ts +0 -20
  331. package/dist-server/service/quality/nonconformance-cause.js +0 -90
  332. package/dist-server/service/quality/nonconformance-cause.js.map +0 -1
  333. package/dist-server/service/recipe/index.d.ts +0 -10
  334. package/dist-server/service/recipe/index.js +0 -16
  335. package/dist-server/service/recipe/index.js.map +0 -1
  336. package/dist-server/service/recipe/recipe-definition.d.ts +0 -75
  337. package/dist-server/service/recipe/recipe-definition.js +0 -143
  338. package/dist-server/service/recipe/recipe-definition.js.map +0 -1
  339. package/dist-server/service/recipe/recipe-effective-list.d.ts +0 -49
  340. package/dist-server/service/recipe/recipe-effective-list.js +0 -96
  341. package/dist-server/service/recipe/recipe-effective-list.js.map +0 -1
  342. package/dist-server/service/recipe/recipe-master-resolver.d.ts +0 -28
  343. package/dist-server/service/recipe/recipe-master-resolver.js +0 -128
  344. package/dist-server/service/recipe/recipe-master-resolver.js.map +0 -1
  345. package/dist-server/service/recipe/recipe-master.d.ts +0 -37
  346. package/dist-server/service/recipe/recipe-master.js +0 -47
  347. package/dist-server/service/recipe/recipe-master.js.map +0 -1
  348. package/dist-server/service/recipe/recipe-query.d.ts +0 -21
  349. package/dist-server/service/recipe/recipe-query.js +0 -82
  350. package/dist-server/service/recipe/recipe-query.js.map +0 -1
  351. package/dist-server/service/recipe/recipe-revision-content.d.ts +0 -32
  352. package/dist-server/service/recipe/recipe-revision-content.js +0 -70
  353. package/dist-server/service/recipe/recipe-revision-content.js.map +0 -1
  354. package/dist-server/service/recipe/recipe-revision-line.d.ts +0 -30
  355. package/dist-server/service/recipe/recipe-revision-line.js +0 -95
  356. package/dist-server/service/recipe/recipe-revision-line.js.map +0 -1
  357. package/dist-server/service/recipe/recipe-revision-resolver.d.ts +0 -65
  358. package/dist-server/service/recipe/recipe-revision-resolver.js +0 -96
  359. package/dist-server/service/recipe/recipe-revision-resolver.js.map +0 -1
  360. package/dist-server/service/recipe/recipe-revision-service.d.ts +0 -183
  361. package/dist-server/service/recipe/recipe-revision-service.js +0 -754
  362. package/dist-server/service/recipe/recipe-revision-service.js.map +0 -1
  363. package/dist-server/service/recipe/recipe-revision.d.ts +0 -102
  364. package/dist-server/service/recipe/recipe-revision.js +0 -373
  365. package/dist-server/service/recipe/recipe-revision.js.map +0 -1
  366. package/dist-server/service/recipe/route-definition.d.ts +0 -51
  367. package/dist-server/service/recipe/route-definition.js +0 -114
  368. package/dist-server/service/recipe/route-definition.js.map +0 -1
  369. package/dist-server/service/resource/class-lineage.d.ts +0 -46
  370. package/dist-server/service/resource/class-lineage.js +0 -80
  371. package/dist-server/service/resource/class-lineage.js.map +0 -1
  372. package/dist-server/service/resource/class-members.d.ts +0 -36
  373. package/dist-server/service/resource/class-members.js +0 -59
  374. package/dist-server/service/resource/class-members.js.map +0 -1
  375. package/dist-server/service/resource/referrers.d.ts +0 -54
  376. package/dist-server/service/resource/referrers.js +0 -99
  377. package/dist-server/service/resource/referrers.js.map +0 -1
  378. package/dist-server/service/resource/resource-class.d.ts +0 -25
  379. package/dist-server/service/resource/resource-class.js +0 -29
  380. package/dist-server/service/resource/resource-class.js.map +0 -1
  381. package/dist-server/service/revision-baseline.d.ts +0 -71
  382. package/dist-server/service/revision-baseline.js +0 -87
  383. package/dist-server/service/revision-baseline.js.map +0 -1
  384. package/dist-server/service/row-lock.d.ts +0 -22
  385. package/dist-server/service/row-lock.js +0 -31
  386. package/dist-server/service/row-lock.js.map +0 -1
  387. package/dist-server/service/status/axis-stamp.d.ts +0 -16
  388. package/dist-server/service/status/axis-stamp.js +0 -22
  389. package/dist-server/service/status/axis-stamp.js.map +0 -1
  390. package/dist-server/service/status/index.d.ts +0 -3
  391. package/dist-server/service/status/index.js +0 -7
  392. package/dist-server/service/status/index.js.map +0 -1
  393. package/dist-server/service/status/master-status.d.ts +0 -38
  394. package/dist-server/service/status/master-status.js +0 -129
  395. package/dist-server/service/status/master-status.js.map +0 -1
  396. package/dist-server/service/test-spec/criteria-check.d.ts +0 -53
  397. package/dist-server/service/test-spec/criteria-check.js +0 -142
  398. package/dist-server/service/test-spec/criteria-check.js.map +0 -1
  399. package/dist-server/service/test-spec/criteria-rows.d.ts +0 -89
  400. package/dist-server/service/test-spec/criteria-rows.js +0 -139
  401. package/dist-server/service/test-spec/criteria-rows.js.map +0 -1
  402. package/dist-server/service/test-spec/index.d.ts +0 -6
  403. package/dist-server/service/test-spec/index.js +0 -11
  404. package/dist-server/service/test-spec/index.js.map +0 -1
  405. package/dist-server/service/test-spec/test-spec-effective-list.d.ts +0 -34
  406. package/dist-server/service/test-spec/test-spec-effective-list.js +0 -42
  407. package/dist-server/service/test-spec/test-spec-effective-list.js.map +0 -1
  408. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +0 -44
  409. package/dist-server/service/test-spec/test-spec-master-resolver.js +0 -144
  410. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +0 -1
  411. package/dist-server/service/test-spec/test-spec-master.d.ts +0 -6
  412. package/dist-server/service/test-spec/test-spec-master.js +0 -18
  413. package/dist-server/service/test-spec/test-spec-master.js.map +0 -1
  414. package/dist-server/service/test-spec/test-spec-query.d.ts +0 -15
  415. package/dist-server/service/test-spec/test-spec-query.js +0 -61
  416. package/dist-server/service/test-spec/test-spec-query.js.map +0 -1
  417. package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +0 -59
  418. package/dist-server/service/test-spec/test-spec-revision-resolver.js +0 -96
  419. package/dist-server/service/test-spec/test-spec-revision-resolver.js.map +0 -1
  420. package/dist-server/service/test-spec/test-spec-revision-service.d.ts +0 -178
  421. package/dist-server/service/test-spec/test-spec-revision-service.js +0 -685
  422. package/dist-server/service/test-spec/test-spec-revision-service.js.map +0 -1
  423. package/dist-server/service/test-spec/test-spec-revision.d.ts +0 -86
  424. package/dist-server/service/test-spec/test-spec-revision.js +0 -334
  425. package/dist-server/service/test-spec/test-spec-revision.js.map +0 -1
  426. package/dist-server/service/test-spec/test-specification.d.ts +0 -47
  427. package/dist-server/service/test-spec/test-specification.js +0 -119
  428. package/dist-server/service/test-spec/test-specification.js.map +0 -1
  429. package/dist-server/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"criteria-check.js","sourceRoot":"","sources":["../../../server/service/test-spec/criteria-check.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 검사 기준이 **판정에 쓸 수 있는 모양인가** — 순수 판단.\n *\n * ── 왜 저장하기 전에 보나 ──────────────────────────────────────────────────\n * 기준을 저장하는 자리와 그 기준으로 판정하는 자리가 다르다. 판정하는 쪽(`measurement-judge`)은\n * **모르는 것을 통과로 읽지 않도록** 만들어져 있어서, 망가진 기준이 들어와도 오류를 내지 않고 조용히\n * 「판정하지 않음」이 된다. 그 조용함이 여기서는 위험하다 — 기준을 적은 사람은 적었다고 믿고,\n * 검사원은 통과했다고 읽는다.\n *\n * 세 가지가 특히 조용하다.\n *\n * 한계가 숫자가 아니다 그리드 칸에서 온 `\"39.7\"` 은 글자다. `값 < \"39.7\"` 은 견주기가 되긴 하지만\n * `\"약 40\"` 같은 것이 들어오면 어느 쪽 비교도 참이 아니어서 **모든 값이\n * 한계 안**으로 읽힌다. 그 기준은 아무것도 막지 않는다.\n * 한계에 단위가 없다 관측이 단위를 말해도 견줄 단위가 없으면 단위 검사를 건너뛴다. 화씨 관측이\n * 섭씨 한계와 견주어지고 아무도 모른다.\n * 기준 이름이 비었다 잰 값은 이름으로 기준을 찾는다. 이름이 없으면 영원히 「안 쟀음」이 된다.\n *\n * ── 막지 않는 것 ───────────────────────────────────────────────────────────\n * **숫자 한계가 없는 기준은 정상이다.** 「표면에 흠이 없을 것」처럼 사람이 보고 판단하는 기준이 있고,\n * 그때는 `expression` 만 있다. 그것까지 막으면 현장의 사실을 담을 수 없다.\n *\n * 다만 `limit` 을 **적다 만 것**과 애초에 안 적은 것은 다르다. 앞은 막고 뒤는 통과시킨다.\n */\n\n/** 저장하려는 기준 하나 — 무엇이 들어올지 모르므로 열어 둔다. */\nexport type CriterionInput = Record<string, unknown>\n\nexport interface CriteriaVerdict {\n ok: boolean\n /** 무엇이 왜 막혔는지. 한 줄에 하나씩, 고칠 자리를 가리킨다. */\n problems: string[]\n}\n\n/** 이름을 붙일 자리 — 오류 문구가 몇 번째 기준인지 말해야 고칠 수 있다. */\nfunction nameOf(criterion: CriterionInput, index: number): string {\n const id = typeof criterion.id === 'string' ? criterion.id.trim() : ''\n\n return id ? `\"${id}\"` : `${index + 1}번째 기준`\n}\n\n/**\n * 한계값 하나를 본다.\n *\n * `undefined` 와 `null` 은 「없다」이고 정상이다. 그 밖의 것은 **숫자여야 한다** — 글자를 그대로 두면\n * 판정이 조용히 무너진다.\n */\nfunction limitNumberProblem(where: string, field: string, value: unknown): string | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined\n }\n\n if (typeof value === 'number') {\n return Number.isFinite(value)\n ? undefined\n : `${where}의 ${field} 이(가) 숫자가 아닙니다. 견줄 수 없는 값입니다`\n }\n\n return (\n `${where}의 ${field} 에 \"${String(value)}\" 이(가) 들어 있습니다 — 숫자여야 합니다. ` +\n '글자로 두면 견주기가 늘 참이 되어 모든 값이 한계 안으로 읽힙니다'\n )\n}\n\nexport function judgeCriteria(criteria: readonly CriterionInput[]): CriteriaVerdict {\n const problems: string[] = []\n const seen = new Set<string>()\n\n criteria.forEach((criterion, index) => {\n const where = nameOf(criterion, index)\n const id = typeof criterion.id === 'string' ? criterion.id.trim() : ''\n\n if (!id) {\n problems.push(\n `${where}에 이름이 없습니다. 잰 값은 이름으로 기준을 찾으므로, ` +\n '이름이 없으면 무엇을 재도 「안 쟀음」으로 남습니다'\n )\n } else if (seen.has(id)) {\n problems.push(`기준 이름 \"${id}\" 이(가) 두 번 나옵니다. 잰 값 하나가 어느 쪽 것인지 정할 수 없습니다`)\n } else {\n seen.add(id)\n }\n\n const limit = criterion.limit as Record<string, unknown> | undefined\n\n if (limit === undefined || limit === null) {\n /* 숫자 한계 없이 사람이 보고 판단하는 기준이다. 정상이다. */\n return\n }\n\n if (typeof limit !== 'object' || Array.isArray(limit)) {\n problems.push(`${where}의 한계가 { minimum, maximum, uom } 모양이 아닙니다`)\n return\n }\n\n const minimumProblem = limitNumberProblem(where, 'minimum', limit.minimum)\n const maximumProblem = limitNumberProblem(where, 'maximum', limit.maximum)\n\n if (minimumProblem) problems.push(minimumProblem)\n if (maximumProblem) problems.push(maximumProblem)\n\n const hasMinimum = typeof limit.minimum === 'number' && Number.isFinite(limit.minimum)\n const hasMaximum = typeof limit.maximum === 'number' && Number.isFinite(limit.maximum)\n\n if (!hasMinimum && !hasMaximum && !minimumProblem && !maximumProblem) {\n /*\n * `limit` 을 적기 시작했는데 상한도 하한도 없다. 안 적은 것과 다르다 — 적으려다 만 것이고,\n * 그대로 두면 「한계를 정했다」고 믿은 채 아무 값이나 지나간다.\n */\n problems.push(\n `${where}에 한계가 열려 있으나 상한도 하한도 없습니다. ` +\n '값을 채우거나, 사람이 보고 판단하는 기준이면 한계를 비우십시오'\n )\n return\n }\n\n if (hasMinimum && hasMaximum && (limit.minimum as number) > (limit.maximum as number)) {\n problems.push(\n `${where}의 하한 ${limit.minimum} 이(가) 상한 ${limit.maximum} 보다 큽니다. ` +\n '어떤 값도 이 한계 안에 들어올 수 없습니다'\n )\n }\n\n const uom = limit.uom\n\n if (uom === undefined || uom === null || String(uom).trim() === '') {\n /*\n * **단위 없는 한계는 막는다.** 판정하는 쪽은 한계에 단위가 없으면 단위 검사를 건너뛴다 —\n * 화씨로 잰 값이 섭씨 한계와 견주어지고 아무도 모른다. 여기가 그것을 막을 수 있는 유일한 자리다.\n */\n problems.push(\n `${where}에 단위가 없습니다. 단위가 없으면 다른 단위로 잰 값이 그대로 견주어져 ` +\n '틀린 판정이 오류 보고 없이 나옵니다'\n )\n } else if (typeof uom !== 'string') {\n problems.push(`${where}의 단위가 글자가 아닙니다`)\n }\n })\n\n return { ok: problems.length === 0, problems }\n}\n\nexport function criteriaRejected(verdict: CriteriaVerdict): boolean {\n return !verdict.ok\n}\n\n/**\n * 그리드가 보낸 값을 기준 목록으로 읽는다.\n *\n * 화면은 JSON 글자로 보내고 저장 칸은 배열이다. **읽지 못한 것을 빈 목록으로 바꾸지 않는다** —\n * 그러면 사람이 적은 기준이 통째로 사라지고 명세는 기준 없는 명세가 된다.\n */\n/**\n * 읽음 · 못 읽음을 **글자로** 가른다.\n *\n * `ok: boolean` 으로 두면 이 저장소의 설정(`strict: false`)에서 `if (!read.ok)` 가 갈래를 좁히지 못해\n * 못 읽은 쪽의 칸을 꺼낼 수 없다. 글자 표식은 어느 설정에서나 좁혀진다.\n */\nexport type CriteriaRead =\n | { read: 'ok'; criteria: CriterionInput[] }\n | { read: 'failed'; detail: string }\n\nexport function readCriteria(value: unknown): CriteriaRead {\n if (value === undefined || value === null || value === '') {\n return { read: 'ok', criteria: [] }\n }\n\n let parsed: unknown = value\n\n if (typeof value === 'string') {\n try {\n parsed = JSON.parse(value)\n } catch (error) {\n return {\n read: 'failed',\n detail: `기준을 읽지 못했습니다 — JSON 이 아닙니다: ${(error as Error).message}`\n }\n }\n }\n\n if (!Array.isArray(parsed)) {\n return { read: 'failed', detail: '기준은 목록이어야 합니다. 기준 하나여도 [ ] 로 감쌉니다' }\n }\n\n const notObjects = parsed.filter(one => typeof one !== 'object' || one === null || Array.isArray(one))\n\n if (notObjects.length) {\n return { read: 'failed', detail: '기준 목록 안에 { } 모양이 아닌 것이 있습니다' }\n }\n\n return { read: 'ok', criteria: parsed as CriterionInput[] }\n}\n"]}
@@ -1,89 +0,0 @@
1
- import type { CriterionInput } from './criteria-check';
2
- /**
3
- * 기준을 **행으로** 오가게 한다 — 순수 옮김.
4
- *
5
- * ── 왜 이 자리가 있나 ──────────────────────────────────────────────────────
6
- * 기준 하나는 이렇게 생겼다.
7
- *
8
- * ```
9
- * { id: "length", description: "길이", evaluatedPropertyId: "length",
10
- * limit: { minimum: 39.7, maximum: 40.3, uom: "MMT" }, expression: "40 ± 0.3 mm" }
11
- * ```
12
- *
13
- * 화면에 이 JSON 원문을 보이면 품질팀장이 상한을 40.5 로 고치려고 중괄호를 세게 된다. 그것은 기준
14
- * 정보를 다루는 화면이 아니라 개발자가 JSON 을 손보는 화면이다.
15
- *
16
- * 그래서 **여기서 행으로 편다.** 화면은 이름 · 설명 · 하한 · 상한 · 단위 · 표현식이 각자 칸인 표를
17
- * 그리고, JSON 을 아예 모른다.
18
- *
19
- * ── 저장이 표가 되어도 화면은 안 바뀐다 ────────────────────────────────────
20
- * 지금 기준은 `simple-json` 칸 안에 있다. 그것이 옳은지는 아키텍트 안건에 올라가 있고, 표로 내려가면
21
- * **이 파일만 바뀐다.** 화면은 계속 행을 받는다.
22
- *
23
- * 그 자유를 위해 옮김을 한 곳에 둔다. 화면이 JSON 을 풀면 저장이 바뀌는 날 그 코드가 통째로 버려진다.
24
- */
25
- /** 화면이 받는 한 줄. 한계를 **펴서** 낸다 — 칸 옆에 그대로 적을 값이다. */
26
- export interface CriterionRow {
27
- /** 기준 이름 — 잰 값이 이것으로 기준을 찾는다. */
28
- id: string;
29
- description?: string;
30
- /** 어느 속성을 재는가 — 표준 `EvaluatedPropertyID`. */
31
- evaluatedPropertyId?: string;
32
- minimum?: number;
33
- maximum?: number;
34
- uom?: string;
35
- /** 그 현장의 표기 그대로. 우리는 읽지 않는다. */
36
- expression?: string;
37
- }
38
- /**
39
- * 저장된 기준 하나를 행으로 편다.
40
- *
41
- * **모르는 칸을 버리지 않는다.** 표준에는 우리 화면이 아직 안 그리는 칸이 있고, 편 것을 다시 담을 때
42
- * 그 칸이 사라지면 사람이 적은 것이 조용히 없어진다. 그래서 원본을 `keptFields` 에 함께 들고 다닌다.
43
- *
44
- * 이름 앞에 `__` 를 붙이지 않는다 — GraphQL 이 그 접두사를 introspection 용으로 예약해 두어서,
45
- * 필드 이름에 쓰면 **스키마가 만들어지지 않고 서버가 기동에서 죽는다**(2026-09-02에 실제로 그랬다).
46
- */
47
- export declare function toCriterionRow(criterion: CriterionInput): CriterionRow & {
48
- keptFields: CriterionInput;
49
- };
50
- export declare function toCriterionRows(criteria?: CriterionInput[]): (CriterionRow & {
51
- keptFields: CriterionInput;
52
- })[];
53
- /**
54
- * 행 하나를 저장할 모양으로 담는다.
55
- *
56
- * 한계가 셋 다 비면 `limit` 을 **아예 두지 않는다.** 빈 `{}` 를 두면 「한계를 정하려다 만 것」이 되어
57
- * 검증이 막는다 — 사람이 보고 판단하는 기준(표현식만 있는 것)은 정상이므로 그것을 막으면 안 된다.
58
- */
59
- export declare function fromCriterionRow(row: Partial<CriterionRow> & {
60
- keptFields?: CriterionInput;
61
- }): CriterionInput;
62
- /** 그리드가 보내는 표식. `+` 새 줄 · `M` 고친 줄 · `-` 지운 줄. */
63
- export type RowFlag = '+' | 'M' | '-';
64
- export interface CriterionPatch extends Partial<CriterionRow> {
65
- cuFlag?: string;
66
- keptFields?: CriterionInput;
67
- /** 고치거나 지울 때 **어느 줄인가.** 이름을 고칠 수 있으므로 이름으로 찾을 수 없다. */
68
- rowIndex?: number;
69
- }
70
- export type CriteriaApplied = {
71
- applied: 'ok';
72
- criteria: CriterionInput[];
73
- } | {
74
- applied: 'rejected';
75
- problems: string[];
76
- };
77
- /**
78
- * 지금 저장된 기준에 화면의 변경을 얹는다.
79
- *
80
- * ── 왜 통째로 받지 않나 ────────────────────────────────────────────────────
81
- * 화면이 목록 전체를 보내면, 두 사람이 같은 명세를 열어 각자 한 줄씩 고쳤을 때 **나중에 저장한 쪽이
82
- * 앞사람의 줄을 지운다.** 바뀐 줄만 받으면 서로 다른 줄을 고친 경우는 둘 다 남는다.
83
- *
84
- * ── 지운 줄은 정말 지운다 ──────────────────────────────────────────────────
85
- * 마스터의 다른 축은 지우지 않고 유효 기간의 끝을 채운다 — 지난 기록이 그 행을 가리키기 때문이다.
86
- * 기준은 다르다. 기준은 명세 안에 있고, **명세가 유효 기간을 갖는다.** 기준 하나에 또 기간을 두면
87
- * 「명세는 유효한데 기준은 지났다」는 상태가 생기고, 그때 무엇으로 판정하는지 아무도 모른다.
88
- */
89
- export declare function applyCriterionPatches(current: CriterionInput[], patches: CriterionPatch[]): CriteriaApplied;
@@ -1,139 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toCriterionRow = toCriterionRow;
4
- exports.toCriterionRows = toCriterionRows;
5
- exports.fromCriterionRow = fromCriterionRow;
6
- exports.applyCriterionPatches = applyCriterionPatches;
7
- const criteria_check_1 = require("./criteria-check");
8
- function text(value) {
9
- if (value === undefined || value === null) {
10
- return undefined;
11
- }
12
- const trimmed = String(value).trim();
13
- return trimmed === '' ? undefined : trimmed;
14
- }
15
- /**
16
- * 저장된 기준 하나를 행으로 편다.
17
- *
18
- * **모르는 칸을 버리지 않는다.** 표준에는 우리 화면이 아직 안 그리는 칸이 있고, 편 것을 다시 담을 때
19
- * 그 칸이 사라지면 사람이 적은 것이 조용히 없어진다. 그래서 원본을 `keptFields` 에 함께 들고 다닌다.
20
- *
21
- * 이름 앞에 `__` 를 붙이지 않는다 — GraphQL 이 그 접두사를 introspection 용으로 예약해 두어서,
22
- * 필드 이름에 쓰면 **스키마가 만들어지지 않고 서버가 기동에서 죽는다**(2026-09-02에 실제로 그랬다).
23
- */
24
- function toCriterionRow(criterion) {
25
- const { id, description, evaluatedPropertyId, limit, expression, ...rest } = criterion;
26
- const lim = (limit ?? {});
27
- return {
28
- id: String(id ?? ''),
29
- description: text(description),
30
- evaluatedPropertyId: text(evaluatedPropertyId),
31
- minimum: typeof lim.minimum === 'number' ? lim.minimum : undefined,
32
- maximum: typeof lim.maximum === 'number' ? lim.maximum : undefined,
33
- uom: text(lim.uom),
34
- expression: text(expression),
35
- keptFields: rest
36
- };
37
- }
38
- function toCriterionRows(criteria = []) {
39
- return criteria.map(toCriterionRow);
40
- }
41
- /**
42
- * 행 하나를 저장할 모양으로 담는다.
43
- *
44
- * 한계가 셋 다 비면 `limit` 을 **아예 두지 않는다.** 빈 `{}` 를 두면 「한계를 정하려다 만 것」이 되어
45
- * 검증이 막는다 — 사람이 보고 판단하는 기준(표현식만 있는 것)은 정상이므로 그것을 막으면 안 된다.
46
- */
47
- function fromCriterionRow(row) {
48
- const hasLimit = row.minimum !== undefined || row.maximum !== undefined || text(row.uom) !== undefined;
49
- const out = {
50
- /* 화면이 모르는 칸을 먼저 깔고 아는 칸으로 덮는다 — 모르는 것을 잃지 않는다. */
51
- ...(row.keptFields ?? {}),
52
- id: String(row.id ?? '').trim()
53
- };
54
- const description = text(row.description);
55
- const evaluatedPropertyId = text(row.evaluatedPropertyId);
56
- const expression = text(row.expression);
57
- if (description !== undefined)
58
- out.description = description;
59
- else
60
- delete out.description;
61
- if (evaluatedPropertyId !== undefined)
62
- out.evaluatedPropertyId = evaluatedPropertyId;
63
- else
64
- delete out.evaluatedPropertyId;
65
- if (expression !== undefined)
66
- out.expression = expression;
67
- else
68
- delete out.expression;
69
- if (hasLimit) {
70
- const limit = {};
71
- if (row.minimum !== undefined && row.minimum !== null)
72
- limit.minimum = row.minimum;
73
- if (row.maximum !== undefined && row.maximum !== null)
74
- limit.maximum = row.maximum;
75
- const uom = text(row.uom);
76
- if (uom !== undefined)
77
- limit.uom = uom;
78
- out.limit = limit;
79
- }
80
- else {
81
- delete out.limit;
82
- }
83
- return out;
84
- }
85
- /**
86
- * 지금 저장된 기준에 화면의 변경을 얹는다.
87
- *
88
- * ── 왜 통째로 받지 않나 ────────────────────────────────────────────────────
89
- * 화면이 목록 전체를 보내면, 두 사람이 같은 명세를 열어 각자 한 줄씩 고쳤을 때 **나중에 저장한 쪽이
90
- * 앞사람의 줄을 지운다.** 바뀐 줄만 받으면 서로 다른 줄을 고친 경우는 둘 다 남는다.
91
- *
92
- * ── 지운 줄은 정말 지운다 ──────────────────────────────────────────────────
93
- * 마스터의 다른 축은 지우지 않고 유효 기간의 끝을 채운다 — 지난 기록이 그 행을 가리키기 때문이다.
94
- * 기준은 다르다. 기준은 명세 안에 있고, **명세가 유효 기간을 갖는다.** 기준 하나에 또 기간을 두면
95
- * 「명세는 유효한데 기준은 지났다」는 상태가 생기고, 그때 무엇으로 판정하는지 아무도 모른다.
96
- */
97
- function applyCriterionPatches(current, patches) {
98
- const rows = [...current];
99
- const problems = [];
100
- /* 지우기를 뒤에서부터 한다 — 앞에서 지우면 뒤 줄의 번호가 밀린다. */
101
- const removals = patches
102
- .filter(patch => String(patch.cuFlag ?? '').toUpperCase() === '-')
103
- .map(patch => patch.rowIndex)
104
- .filter((index) => typeof index === 'number')
105
- .sort((a, b) => b - a);
106
- for (const index of removals) {
107
- if (index < 0 || index >= rows.length) {
108
- problems.push(`지우려는 줄(${index + 1}번째)이 지금 목록에 없습니다. 화면을 새로 읽고 다시 하십시오`);
109
- continue;
110
- }
111
- rows.splice(index, 1);
112
- }
113
- for (const patch of patches) {
114
- const flag = String(patch.cuFlag ?? '').toUpperCase();
115
- if (flag === '-') {
116
- continue;
117
- }
118
- if (flag === '+') {
119
- rows.push(fromCriterionRow(patch));
120
- continue;
121
- }
122
- const index = patch.rowIndex;
123
- if (typeof index !== 'number' || index < 0 || index >= rows.length) {
124
- problems.push(`고치려는 줄을 찾지 못했습니다. 화면을 새로 읽고 다시 하십시오`);
125
- continue;
126
- }
127
- rows[index] = fromCriterionRow({ ...toCriterionRow(rows[index]), ...patch });
128
- }
129
- if (problems.length) {
130
- return { applied: 'rejected', problems };
131
- }
132
- /* 담고 나서 본다 — 담는 과정에서 생긴 어긋남(빈 이름·겹친 이름)까지 여기서 걸린다. */
133
- const verdict = (0, criteria_check_1.judgeCriteria)(rows);
134
- if (!verdict.ok) {
135
- return { applied: 'rejected', problems: verdict.problems };
136
- }
137
- return { applied: 'ok', criteria: rows };
138
- }
139
- //# sourceMappingURL=criteria-rows.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"criteria-rows.js","sourceRoot":"","sources":["../../../server/service/test-spec/criteria-rows.ts"],"names":[],"mappings":"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","sourcesContent":["import { judgeCriteria } from './criteria-check'\nimport type { CriterionInput } from './criteria-check'\n\n/**\n * 기준을 **행으로** 오가게 한다 — 순수 옮김.\n *\n * ── 왜 이 자리가 있나 ──────────────────────────────────────────────────────\n * 기준 하나는 이렇게 생겼다.\n *\n * ```\n * { id: \"length\", description: \"길이\", evaluatedPropertyId: \"length\",\n * limit: { minimum: 39.7, maximum: 40.3, uom: \"MMT\" }, expression: \"40 ± 0.3 mm\" }\n * ```\n *\n * 화면에 이 JSON 원문을 보이면 품질팀장이 상한을 40.5 로 고치려고 중괄호를 세게 된다. 그것은 기준\n * 정보를 다루는 화면이 아니라 개발자가 JSON 을 손보는 화면이다.\n *\n * 그래서 **여기서 행으로 편다.** 화면은 이름 · 설명 · 하한 · 상한 · 단위 · 표현식이 각자 칸인 표를\n * 그리고, JSON 을 아예 모른다.\n *\n * ── 저장이 표가 되어도 화면은 안 바뀐다 ────────────────────────────────────\n * 지금 기준은 `simple-json` 칸 안에 있다. 그것이 옳은지는 아키텍트 안건에 올라가 있고, 표로 내려가면\n * **이 파일만 바뀐다.** 화면은 계속 행을 받는다.\n *\n * 그 자유를 위해 옮김을 한 곳에 둔다. 화면이 JSON 을 풀면 저장이 바뀌는 날 그 코드가 통째로 버려진다.\n */\n\n/** 화면이 받는 한 줄. 한계를 **펴서** 낸다 — 칸 옆에 그대로 적을 값이다. */\nexport interface CriterionRow {\n /** 기준 이름 — 잰 값이 이것으로 기준을 찾는다. */\n id: string\n description?: string\n /** 어느 속성을 재는가 — 표준 `EvaluatedPropertyID`. */\n evaluatedPropertyId?: string\n minimum?: number\n maximum?: number\n uom?: string\n /** 그 현장의 표기 그대로. 우리는 읽지 않는다. */\n expression?: string\n}\n\nfunction text(value: unknown): string | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n\n const trimmed = String(value).trim()\n\n return trimmed === '' ? undefined : trimmed\n}\n\n/**\n * 저장된 기준 하나를 행으로 편다.\n *\n * **모르는 칸을 버리지 않는다.** 표준에는 우리 화면이 아직 안 그리는 칸이 있고, 편 것을 다시 담을 때\n * 그 칸이 사라지면 사람이 적은 것이 조용히 없어진다. 그래서 원본을 `keptFields` 에 함께 들고 다닌다.\n *\n * 이름 앞에 `__` 를 붙이지 않는다 — GraphQL 이 그 접두사를 introspection 용으로 예약해 두어서,\n * 필드 이름에 쓰면 **스키마가 만들어지지 않고 서버가 기동에서 죽는다**(2026-09-02에 실제로 그랬다).\n */\nexport function toCriterionRow(criterion: CriterionInput): CriterionRow & { keptFields: CriterionInput } {\n const { id, description, evaluatedPropertyId, limit, expression, ...rest } = criterion as any\n const lim = (limit ?? {}) as Record<string, unknown>\n\n return {\n id: String(id ?? ''),\n description: text(description),\n evaluatedPropertyId: text(evaluatedPropertyId),\n minimum: typeof lim.minimum === 'number' ? lim.minimum : undefined,\n maximum: typeof lim.maximum === 'number' ? lim.maximum : undefined,\n uom: text(lim.uom),\n expression: text(expression),\n keptFields: rest\n }\n}\n\nexport function toCriterionRows(criteria: CriterionInput[] = []): (CriterionRow & { keptFields: CriterionInput })[] {\n return criteria.map(toCriterionRow)\n}\n\n/**\n * 행 하나를 저장할 모양으로 담는다.\n *\n * 한계가 셋 다 비면 `limit` 을 **아예 두지 않는다.** 빈 `{}` 를 두면 「한계를 정하려다 만 것」이 되어\n * 검증이 막는다 — 사람이 보고 판단하는 기준(표현식만 있는 것)은 정상이므로 그것을 막으면 안 된다.\n */\nexport function fromCriterionRow(row: Partial<CriterionRow> & { keptFields?: CriterionInput }): CriterionInput {\n const hasLimit = row.minimum !== undefined || row.maximum !== undefined || text(row.uom) !== undefined\n\n const out: CriterionInput = {\n /* 화면이 모르는 칸을 먼저 깔고 아는 칸으로 덮는다 — 모르는 것을 잃지 않는다. */\n ...(row.keptFields ?? {}),\n id: String(row.id ?? '').trim()\n }\n\n const description = text(row.description)\n const evaluatedPropertyId = text(row.evaluatedPropertyId)\n const expression = text(row.expression)\n\n if (description !== undefined) out.description = description\n else delete (out as any).description\n\n if (evaluatedPropertyId !== undefined) out.evaluatedPropertyId = evaluatedPropertyId\n else delete (out as any).evaluatedPropertyId\n\n if (expression !== undefined) out.expression = expression\n else delete (out as any).expression\n\n if (hasLimit) {\n const limit: Record<string, unknown> = {}\n\n if (row.minimum !== undefined && row.minimum !== null) limit.minimum = row.minimum\n if (row.maximum !== undefined && row.maximum !== null) limit.maximum = row.maximum\n\n const uom = text(row.uom)\n\n if (uom !== undefined) limit.uom = uom\n\n out.limit = limit\n } else {\n delete (out as any).limit\n }\n\n return out\n}\n\n/** 그리드가 보내는 표식. `+` 새 줄 · `M` 고친 줄 · `-` 지운 줄. */\nexport type RowFlag = '+' | 'M' | '-'\n\nexport interface CriterionPatch extends Partial<CriterionRow> {\n cuFlag?: string\n keptFields?: CriterionInput\n /** 고치거나 지울 때 **어느 줄인가.** 이름을 고칠 수 있으므로 이름으로 찾을 수 없다. */\n rowIndex?: number\n}\n\nexport type CriteriaApplied =\n | { applied: 'ok'; criteria: CriterionInput[] }\n | { applied: 'rejected'; problems: string[] }\n\n/**\n * 지금 저장된 기준에 화면의 변경을 얹는다.\n *\n * ── 왜 통째로 받지 않나 ────────────────────────────────────────────────────\n * 화면이 목록 전체를 보내면, 두 사람이 같은 명세를 열어 각자 한 줄씩 고쳤을 때 **나중에 저장한 쪽이\n * 앞사람의 줄을 지운다.** 바뀐 줄만 받으면 서로 다른 줄을 고친 경우는 둘 다 남는다.\n *\n * ── 지운 줄은 정말 지운다 ──────────────────────────────────────────────────\n * 마스터의 다른 축은 지우지 않고 유효 기간의 끝을 채운다 — 지난 기록이 그 행을 가리키기 때문이다.\n * 기준은 다르다. 기준은 명세 안에 있고, **명세가 유효 기간을 갖는다.** 기준 하나에 또 기간을 두면\n * 「명세는 유효한데 기준은 지났다」는 상태가 생기고, 그때 무엇으로 판정하는지 아무도 모른다.\n */\nexport function applyCriterionPatches(\n current: CriterionInput[],\n patches: CriterionPatch[]\n): CriteriaApplied {\n const rows = [...current]\n const problems: string[] = []\n\n /* 지우기를 뒤에서부터 한다 — 앞에서 지우면 뒤 줄의 번호가 밀린다. */\n const removals = patches\n .filter(patch => String(patch.cuFlag ?? '').toUpperCase() === '-')\n .map(patch => patch.rowIndex)\n .filter((index): index is number => typeof index === 'number')\n .sort((a, b) => b - a)\n\n for (const index of removals) {\n if (index < 0 || index >= rows.length) {\n problems.push(`지우려는 줄(${index + 1}번째)이 지금 목록에 없습니다. 화면을 새로 읽고 다시 하십시오`)\n continue\n }\n\n rows.splice(index, 1)\n }\n\n for (const patch of patches) {\n const flag = String(patch.cuFlag ?? '').toUpperCase()\n\n if (flag === '-') {\n continue\n }\n\n if (flag === '+') {\n rows.push(fromCriterionRow(patch))\n continue\n }\n\n const index = patch.rowIndex\n\n if (typeof index !== 'number' || index < 0 || index >= rows.length) {\n problems.push(`고치려는 줄을 찾지 못했습니다. 화면을 새로 읽고 다시 하십시오`)\n continue\n }\n\n rows[index] = fromCriterionRow({ ...toCriterionRow(rows[index]), ...patch })\n }\n\n if (problems.length) {\n return { applied: 'rejected', problems }\n }\n\n /* 담고 나서 본다 — 담는 과정에서 생긴 어긋남(빈 이름·겹친 이름)까지 여기서 걸린다. */\n const verdict = judgeCriteria(rows)\n\n if (!verdict.ok) {\n return { applied: 'rejected', problems: verdict.problems }\n }\n\n return { applied: 'ok', criteria: rows }\n}\n"]}
@@ -1,6 +0,0 @@
1
- import { TestSpecification } from './test-specification';
2
- import { TestSpecificationQuery } from './test-spec-query';
3
- import { TestSpecificationResolver } from './test-spec-master-resolver';
4
- import { TestSpecificationRevisionResolver } from './test-spec-revision-resolver';
5
- export declare const entities: (typeof TestSpecification | typeof import("./test-spec-revision").TestSpecificationRevision | typeof import("./test-spec-revision").TestSpecificationPlan | typeof import("./test-spec-revision").TestSpecificationSegment | typeof import("./test-spec-revision").TestSpecificationBasis)[];
6
- export declare const resolvers: (typeof TestSpecificationResolver | typeof TestSpecificationRevisionResolver | typeof TestSpecificationQuery)[];
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolvers = exports.entities = void 0;
4
- const test_specification_1 = require("./test-specification");
5
- const test_spec_query_1 = require("./test-spec-query");
6
- const test_spec_master_resolver_1 = require("./test-spec-master-resolver");
7
- const test_spec_revision_1 = require("./test-spec-revision");
8
- const test_spec_revision_resolver_1 = require("./test-spec-revision-resolver");
9
- exports.entities = [test_specification_1.TestSpecification, ...test_spec_revision_1.TEST_SPEC_REVISION_ENTITIES];
10
- exports.resolvers = [test_spec_query_1.TestSpecificationQuery, test_spec_master_resolver_1.TestSpecificationResolver, test_spec_revision_resolver_1.TestSpecificationRevisionResolver];
11
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/test-spec/index.ts"],"names":[],"mappings":";;;AAAA,6DAAwD;AACxD,uDAA0D;AAC1D,2EAAuE;AACvE,6DAAkE;AAClE,+EAAiF;AAEpE,QAAA,QAAQ,GAAG,CAAC,sCAAiB,EAAE,GAAG,gDAA2B,CAAC,CAAA;AAC9D,QAAA,SAAS,GAAG,CAAC,wCAAsB,EAAE,qDAAyB,EAAE,+DAAiC,CAAC,CAAA","sourcesContent":["import { TestSpecification } from './test-specification'\nimport { TestSpecificationQuery } from './test-spec-query'\nimport { TestSpecificationResolver } from './test-spec-master-resolver'\nimport { TEST_SPEC_REVISION_ENTITIES } from './test-spec-revision'\nimport { TestSpecificationRevisionResolver } from './test-spec-revision-resolver'\n\nexport const entities = [TestSpecification, ...TEST_SPEC_REVISION_ENTITIES]\nexport const resolvers = [TestSpecificationQuery, TestSpecificationResolver, TestSpecificationRevisionResolver]\n"]}
@@ -1,34 +0,0 @@
1
- import { EntityManager } from 'typeorm';
2
- import { Domain, ListParam } from '@things-factory/shell';
3
- import { TestSpecification } from './test-specification';
4
- /** Filter, sort, paginate and display the same time projection. No per-row resolution queries. */
5
- export declare function listEffectiveTestSpecifications(manager: EntityManager, domain: Domain, params: ListParam, at?: Date): Promise<{
6
- items: (TestSpecification & {
7
- revisionNumber?: number;
8
- id: string;
9
- domain?: Domain;
10
- domainId?: string;
11
- planGeneration: number;
12
- revisionLock: number;
13
- name: string;
14
- description?: string;
15
- version?: string;
16
- criteria?: Record<string, unknown>[];
17
- effectiveStart?: Date;
18
- effectiveEnd?: Date;
19
- createdAt?: Date;
20
- updatedAt?: Date;
21
- creator?: import("@things-factory/auth-base").User;
22
- creatorId?: string;
23
- updater?: import("@things-factory/auth-base").User;
24
- updaterId?: string;
25
- } & {
26
- description: string;
27
- revisionNumber: number;
28
- version: string;
29
- criteria: import("@operato/ops-contract").TestSpecificationCriterion[];
30
- effectiveStart: Date;
31
- effectiveEnd: Date;
32
- })[];
33
- total: number;
34
- }>;
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.listEffectiveTestSpecifications = listEffectiveTestSpecifications;
4
- const shell_1 = require("@things-factory/shell");
5
- const test_specification_1 = require("./test-specification");
6
- const test_spec_revision_1 = require("./test-spec-revision");
7
- /** Filter, sort, paginate and display the same time projection. No per-row resolution queries. */
8
- async function listEffectiveTestSpecifications(manager, domain, params, at = new Date()) {
9
- const query = (0, shell_1.getQueryBuilderFromListParams)({
10
- repository: manager.getRepository(test_specification_1.TestSpecification),
11
- domain,
12
- params,
13
- alias: 'spec',
14
- searchables: ['name', 'description'],
15
- sortables: ['id', 'name', 'revisionNumber', 'description', 'version', 'effectiveStart', 'effectiveEnd', 'createdAt', 'updatedAt'],
16
- columnExpressions: {
17
- revisionNumber: 'revision.revisionNumber',
18
- description: 'revision.description',
19
- version: 'revision.version',
20
- effectiveStart: 'segment.validFrom',
21
- effectiveEnd: 'segment.validTo'
22
- }
23
- });
24
- query
25
- .leftJoin(test_spec_revision_1.TestSpecificationPlan, 'plan', 'plan.spec_id = spec.id AND plan.domain_id = spec.domain_id AND plan.generation = spec.plan_generation')
26
- .leftJoinAndMapOne('spec.selectedSegment', test_spec_revision_1.TestSpecificationSegment, 'segment', 'segment.plan_id = plan.id AND segment.validFrom <= :at AND (segment.validTo IS NULL OR segment.validTo > :at)', { at })
27
- .leftJoinAndMapOne('spec.selectedRevision', test_spec_revision_1.TestSpecificationRevision, 'revision', 'revision.id = segment.revision_id');
28
- const [rows, total] = await query.getManyAndCount();
29
- const items = rows.map(row => {
30
- const { selectedRevision, selectedSegment, ...identity } = row;
31
- return Object.assign(new test_specification_1.TestSpecification(), identity, {
32
- description: selectedRevision?.description ?? null,
33
- revisionNumber: selectedRevision?.revisionNumber ?? null,
34
- version: selectedRevision?.version ?? null,
35
- criteria: selectedRevision?.criteria ?? [],
36
- effectiveStart: selectedSegment?.validFrom ?? null,
37
- effectiveEnd: selectedSegment?.validTo ?? null
38
- });
39
- });
40
- return { items, total };
41
- }
42
- //# sourceMappingURL=test-spec-effective-list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-spec-effective-list.js","sourceRoot":"","sources":["../../../server/service/test-spec/test-spec-effective-list.ts"],"names":[],"mappings":";;AAWA,0EAqDC;AA/DD,iDAAwF;AACxF,6DAAwD;AACxD,6DAAiH;AAOjH,kGAAkG;AAC3F,KAAK,UAAU,+BAA+B,CACnD,OAAsB,EACtB,MAAc,EACd,MAAiB,EACjB,EAAE,GAAG,IAAI,IAAI,EAAE;IAEf,MAAM,KAAK,GAAG,IAAA,qCAA6B,EAAC;QAC1C,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,sCAAiB,CAAC;QACpD,MAAM;QACN,MAAM;QACN,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;QACpC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC;QACjI,iBAAiB,EAAE;YACjB,cAAc,EAAE,yBAAyB;YACzC,WAAW,EAAE,sBAAsB;YACnC,OAAO,EAAE,kBAAkB;YAC3B,cAAc,EAAE,mBAAmB;YACnC,YAAY,EAAE,iBAAiB;SAChC;KACF,CAAC,CAAA;IACF,KAAK;SACF,QAAQ,CACP,0CAAqB,EACrB,MAAM,EACN,uGAAuG,CACxG;SACA,iBAAiB,CAChB,sBAAsB,EACtB,6CAAwB,EACxB,SAAS,EACT,+GAA+G,EAC/G,EAAE,EAAE,EAAE,CACP;SACA,iBAAiB,CAChB,uBAAuB,EACvB,8CAAyB,EACzB,UAAU,EACV,mCAAmC,CACpC,CAAA;IACH,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAA;IACnD,MAAM,KAAK,GAAI,IAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC/C,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAA;QAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,sCAAiB,EAAE,EAAE,QAAQ,EAAE;YACtD,WAAW,EAAE,gBAAgB,EAAE,WAAW,IAAI,IAAI;YAClD,cAAc,EAAE,gBAAgB,EAAE,cAAc,IAAI,IAAI;YACxD,OAAO,EAAE,gBAAgB,EAAE,OAAO,IAAI,IAAI;YAC1C,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,IAAI,EAAE;YAC1C,cAAc,EAAE,eAAe,EAAE,SAAS,IAAI,IAAI;YAClD,YAAY,EAAE,eAAe,EAAE,OAAO,IAAI,IAAI;SAC/C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AACzB,CAAC","sourcesContent":["import { EntityManager } from 'typeorm'\nimport { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'\nimport { TestSpecification } from './test-specification'\nimport { TestSpecificationPlan, TestSpecificationRevision, TestSpecificationSegment } from './test-spec-revision'\n\ntype EffectiveRow = TestSpecification & {\n selectedRevision?: TestSpecificationRevision\n selectedSegment?: TestSpecificationSegment\n}\n\n/** Filter, sort, paginate and display the same time projection. No per-row resolution queries. */\nexport async function listEffectiveTestSpecifications(\n manager: EntityManager,\n domain: Domain,\n params: ListParam,\n at = new Date()\n) {\n const query = getQueryBuilderFromListParams({\n repository: manager.getRepository(TestSpecification),\n domain,\n params,\n alias: 'spec',\n searchables: ['name', 'description'],\n sortables: ['id', 'name', 'revisionNumber', 'description', 'version', 'effectiveStart', 'effectiveEnd', 'createdAt', 'updatedAt'],\n columnExpressions: {\n revisionNumber: 'revision.revisionNumber',\n description: 'revision.description',\n version: 'revision.version',\n effectiveStart: 'segment.validFrom',\n effectiveEnd: 'segment.validTo'\n }\n })\n query\n .leftJoin(\n TestSpecificationPlan,\n 'plan',\n 'plan.spec_id = spec.id AND plan.domain_id = spec.domain_id AND plan.generation = spec.plan_generation'\n )\n .leftJoinAndMapOne(\n 'spec.selectedSegment',\n TestSpecificationSegment,\n 'segment',\n 'segment.plan_id = plan.id AND segment.validFrom <= :at AND (segment.validTo IS NULL OR segment.validTo > :at)',\n { at }\n )\n .leftJoinAndMapOne(\n 'spec.selectedRevision',\n TestSpecificationRevision,\n 'revision',\n 'revision.id = segment.revision_id'\n )\n const [rows, total] = await query.getManyAndCount()\n const items = (rows as EffectiveRow[]).map(row => {\n const { selectedRevision, selectedSegment, ...identity } = row\n return Object.assign(new TestSpecification(), identity, {\n description: selectedRevision?.description ?? null,\n revisionNumber: selectedRevision?.revisionNumber ?? null,\n version: selectedRevision?.version ?? null,\n criteria: selectedRevision?.criteria ?? [],\n effectiveStart: selectedSegment?.validFrom ?? null,\n effectiveEnd: selectedSegment?.validTo ?? null\n })\n })\n return { items, total }\n}\n"]}
@@ -1,44 +0,0 @@
1
- import { ListParam } from '@things-factory/shell';
2
- import type { MasterPatch } from '../master-crud';
3
- import { CriterionPatch } from './criteria-rows';
4
- import { TestSpecification } from './test-specification';
5
- /** Reads project the effective revision. Changes go through the revision draft resolver. */
6
- /**
7
- * 기준 한 줄 — **화면이 받는 모양.**
8
- *
9
- * 한계를 펴서 낸다. 화면은 이름 · 설명 · 하한 · 상한 · 단위 · 표현식이 각자 칸인 표를 그리고,
10
- * JSON 을 아예 모른다. 옮김은 `criteria-rows.ts` 한 곳이 든다 — 저장이 표로 내려가도 그 파일만 바뀐다.
11
- */
12
- export declare class TestSpecificationCriterionRow {
13
- id: string;
14
- description?: string;
15
- evaluatedPropertyId?: string;
16
- minimum?: number;
17
- maximum?: number;
18
- uom?: string;
19
- expression?: string;
20
- /**
21
- * 화면이 아직 안 그리는 표준 칸들.
22
- *
23
- * **버리지 않는다.** 편 것을 다시 담을 때 이 칸들이 사라지면 사람이 적은 것이 조용히 없어진다.
24
- */
25
- keptFields?: Record<string, unknown>;
26
- }
27
- export declare class TestSpecificationList {
28
- items: TestSpecification[];
29
- total: number;
30
- }
31
- export declare class TestSpecificationResolver {
32
- testSpecifications(params: ListParam, context: ResolverContext): Promise<TestSpecificationList>;
33
- /** Explicitly closed old write door: even non-regulated publication must retain a revision. */
34
- updateMultipleTestSpecification(patches: MasterPatch[], context: ResolverContext): Promise<TestSpecification[]>;
35
- /**
36
- * 명세 하나의 기준을 **행으로** 낸다.
37
- *
38
- * 화면이 JSON 을 풀지 않게 하는 자리다. 명세를 못 찾으면 빈 목록을 주지 않고 말한다 — 빈 목록은
39
- * 「기준이 없는 명세」와 같아 보이고, 그러면 사람이 기준을 다시 적는다.
40
- */
41
- testSpecificationCriteria(name: string, context: ResolverContext): Promise<TestSpecificationCriterionRow[]>;
42
- /** Criteria belong to a draft, not to the stable identity row. */
43
- updateTestSpecificationCriteria(name: string, patches: CriterionPatch[], context: ResolverContext): Promise<TestSpecificationCriterionRow[]>;
44
- }
@@ -1,144 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TestSpecificationResolver = exports.TestSpecificationList = exports.TestSpecificationCriterionRow = void 0;
4
- const tslib_1 = require("tslib");
5
- const type_graphql_1 = require("type-graphql");
6
- const shell_1 = require("@things-factory/shell");
7
- const criteria_rows_1 = require("./criteria-rows");
8
- const test_specification_1 = require("./test-specification");
9
- const test_spec_revision_service_1 = require("./test-spec-revision-service");
10
- const test_spec_effective_list_1 = require("./test-spec-effective-list");
11
- /** Reads project the effective revision. Changes go through the revision draft resolver. */
12
- /**
13
- * 기준 한 줄 — **화면이 받는 모양.**
14
- *
15
- * 한계를 펴서 낸다. 화면은 이름 · 설명 · 하한 · 상한 · 단위 · 표현식이 각자 칸인 표를 그리고,
16
- * JSON 을 아예 모른다. 옮김은 `criteria-rows.ts` 한 곳이 든다 — 저장이 표로 내려가도 그 파일만 바뀐다.
17
- */
18
- let TestSpecificationCriterionRow = class TestSpecificationCriterionRow {
19
- };
20
- exports.TestSpecificationCriterionRow = TestSpecificationCriterionRow;
21
- tslib_1.__decorate([
22
- (0, type_graphql_1.Field)({ description: 'criterion id — measurements find their criterion by this' }),
23
- tslib_1.__metadata("design:type", String)
24
- ], TestSpecificationCriterionRow.prototype, "id", void 0);
25
- tslib_1.__decorate([
26
- (0, type_graphql_1.Field)({ nullable: true, description: 'what is being checked' }),
27
- tslib_1.__metadata("design:type", String)
28
- ], TestSpecificationCriterionRow.prototype, "description", void 0);
29
- tslib_1.__decorate([
30
- (0, type_graphql_1.Field)({ nullable: true, description: 'ISA-95 EvaluatedPropertyID — which property is measured' }),
31
- tslib_1.__metadata("design:type", String)
32
- ], TestSpecificationCriterionRow.prototype, "evaluatedPropertyId", void 0);
33
- tslib_1.__decorate([
34
- (0, type_graphql_1.Field)(type => type_graphql_1.Float, { nullable: true, description: 'lower limit' }),
35
- tslib_1.__metadata("design:type", Number)
36
- ], TestSpecificationCriterionRow.prototype, "minimum", void 0);
37
- tslib_1.__decorate([
38
- (0, type_graphql_1.Field)(type => type_graphql_1.Float, { nullable: true, description: 'upper limit' }),
39
- tslib_1.__metadata("design:type", Number)
40
- ], TestSpecificationCriterionRow.prototype, "maximum", void 0);
41
- tslib_1.__decorate([
42
- (0, type_graphql_1.Field)({ nullable: true, description: 'unit of measure — required whenever a limit is given' }),
43
- tslib_1.__metadata("design:type", String)
44
- ], TestSpecificationCriterionRow.prototype, "uom", void 0);
45
- tslib_1.__decorate([
46
- (0, type_graphql_1.Field)({ nullable: true, description: "the site's own notation — never parsed" }),
47
- tslib_1.__metadata("design:type", String)
48
- ], TestSpecificationCriterionRow.prototype, "expression", void 0);
49
- tslib_1.__decorate([
50
- (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'standard fields this screen does not draw yet' }),
51
- tslib_1.__metadata("design:type", Object)
52
- ], TestSpecificationCriterionRow.prototype, "keptFields", void 0);
53
- exports.TestSpecificationCriterionRow = TestSpecificationCriterionRow = tslib_1.__decorate([
54
- (0, type_graphql_1.ObjectType)({ description: 'One test specification criterion, flattened for editing' })
55
- ], TestSpecificationCriterionRow);
56
- let TestSpecificationList = class TestSpecificationList {
57
- };
58
- exports.TestSpecificationList = TestSpecificationList;
59
- tslib_1.__decorate([
60
- (0, type_graphql_1.Field)(type => [test_specification_1.TestSpecification]),
61
- tslib_1.__metadata("design:type", Array)
62
- ], TestSpecificationList.prototype, "items", void 0);
63
- tslib_1.__decorate([
64
- (0, type_graphql_1.Field)(type => type_graphql_1.Int),
65
- tslib_1.__metadata("design:type", Number)
66
- ], TestSpecificationList.prototype, "total", void 0);
67
- exports.TestSpecificationList = TestSpecificationList = tslib_1.__decorate([
68
- (0, type_graphql_1.ObjectType)({ description: 'A page of test specifications' })
69
- ], TestSpecificationList);
70
- let TestSpecificationResolver = class TestSpecificationResolver {
71
- async testSpecifications(params, context) {
72
- const { domain } = context.state;
73
- return (0, test_spec_effective_list_1.listEffectiveTestSpecifications)((0, shell_1.getRepository)(test_specification_1.TestSpecification).manager, domain, params);
74
- }
75
- /** Explicitly closed old write door: even non-regulated publication must retain a revision. */
76
- async updateMultipleTestSpecification(patches, context) {
77
- throw new test_spec_revision_service_1.TestSpecificationRefusal('REVISION_REQUIRED', 'Use a test specification draft; direct identity-row changes are not supported.');
78
- }
79
- /**
80
- * 명세 하나의 기준을 **행으로** 낸다.
81
- *
82
- * 화면이 JSON 을 풀지 않게 하는 자리다. 명세를 못 찾으면 빈 목록을 주지 않고 말한다 — 빈 목록은
83
- * 「기준이 없는 명세」와 같아 보이고, 그러면 사람이 기준을 다시 적는다.
84
- */
85
- async testSpecificationCriteria(name, context) {
86
- /* 조회에는 `@transaction` 이 없다 — `context.state.tx` 는 그 지시자가 있을 때만 있다. */
87
- const { domain } = context.state;
88
- const spec = await (0, shell_1.getRepository)(test_specification_1.TestSpecification).findOne({ where: { domain: { id: domain.id }, name } });
89
- if (!spec) {
90
- throw new Error(`검사 명세 "${name}" 를 찾지 못했습니다`);
91
- }
92
- const effective = await (0, test_spec_revision_service_1.effectiveTestSpecification)((0, shell_1.getRepository)(test_specification_1.TestSpecification).manager, domain.id, spec);
93
- return (0, criteria_rows_1.toCriterionRows)(effective.criteria ?? []);
94
- }
95
- /** Criteria belong to a draft, not to the stable identity row. */
96
- async updateTestSpecificationCriteria(name, patches, context) {
97
- throw new test_spec_revision_service_1.TestSpecificationRefusal('REVISION_REQUIRED', 'Edit the draft criteria, then submit the frozen revision for approval.');
98
- }
99
- };
100
- exports.TestSpecificationResolver = TestSpecificationResolver;
101
- tslib_1.__decorate([
102
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
103
- (0, type_graphql_1.Query)(returns => TestSpecificationList, { description: 'To fetch test specifications' }),
104
- tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
105
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
106
- tslib_1.__metadata("design:type", Function),
107
- tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
108
- tslib_1.__metadata("design:returntype", Promise)
109
- ], TestSpecificationResolver.prototype, "testSpecifications", null);
110
- tslib_1.__decorate([
111
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
112
- (0, type_graphql_1.Directive)('@transaction'),
113
- (0, type_graphql_1.Mutation)(returns => [test_specification_1.TestSpecification], { description: 'To create, change or retire test specifications' }),
114
- tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject])),
115
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
116
- tslib_1.__metadata("design:type", Function),
117
- tslib_1.__metadata("design:paramtypes", [Array, Object]),
118
- tslib_1.__metadata("design:returntype", Promise)
119
- ], TestSpecificationResolver.prototype, "updateMultipleTestSpecification", null);
120
- tslib_1.__decorate([
121
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
122
- (0, type_graphql_1.Query)(returns => [TestSpecificationCriterionRow], { description: 'Criteria of one test specification, as editable rows' }),
123
- tslib_1.__param(0, (0, type_graphql_1.Arg)('name', { description: 'the test specification name' })),
124
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
125
- tslib_1.__metadata("design:type", Function),
126
- tslib_1.__metadata("design:paramtypes", [String, Object]),
127
- tslib_1.__metadata("design:returntype", Promise)
128
- ], TestSpecificationResolver.prototype, "testSpecificationCriteria", null);
129
- tslib_1.__decorate([
130
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
131
- (0, type_graphql_1.Directive)('@transaction'),
132
- (0, type_graphql_1.Mutation)(returns => [TestSpecificationCriterionRow], { description: 'To add, change or remove criteria of one test specification' }),
133
- tslib_1.__param(0, (0, type_graphql_1.Arg)('name', { description: 'the test specification name' })),
134
- tslib_1.__param(1, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject], { description: 'changed rows only, each with cuFlag and rowIndex' })),
135
- tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
136
- tslib_1.__metadata("design:type", Function),
137
- tslib_1.__metadata("design:paramtypes", [String, Array, Object]),
138
- tslib_1.__metadata("design:returntype", Promise)
139
- ], TestSpecificationResolver.prototype, "updateTestSpecificationCriteria", null);
140
- exports.TestSpecificationResolver = TestSpecificationResolver = tslib_1.__decorate([
141
- (0, type_graphql_1.Resolver)(test_specification_1.TestSpecification),
142
- (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
143
- ], TestSpecificationResolver);
144
- //# sourceMappingURL=test-spec-master-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-spec-master-resolver.js","sourceRoot":"","sources":["../../../server/service/test-spec/test-spec-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Args, Arg, Ctx, Directive, Float, Int, Mutation, ObjectType, Field, Query, Resolver, UseMiddleware } from 'type-graphql'\n\nimport { ListParam, ScalarObject, getRepository, SpeakRefusals } from '@things-factory/shell'\n\nimport type { MasterPatch } from '../master-crud'\nimport { CriterionPatch, toCriterionRows } from './criteria-rows'\nimport { TestSpecification } from './test-specification'\nimport { effectiveTestSpecification, TestSpecificationRefusal } from './test-spec-revision-service'\nimport { listEffectiveTestSpecifications } from './test-spec-effective-list'\n\n/** Reads project the effective revision. Changes go through the revision draft resolver. */\n\n/**\n * 기준 한 줄 — **화면이 받는 모양.**\n *\n * 한계를 펴서 낸다. 화면은 이름 · 설명 · 하한 · 상한 · 단위 · 표현식이 각자 칸인 표를 그리고,\n * JSON 을 아예 모른다. 옮김은 `criteria-rows.ts` 한 곳이 든다 — 저장이 표로 내려가도 그 파일만 바뀐다.\n */\n@ObjectType({ description: 'One test specification criterion, flattened for editing' })\nexport class TestSpecificationCriterionRow {\n @Field({ description: 'criterion id — measurements find their criterion by this' })\n id: string\n\n @Field({ nullable: true, description: 'what is being checked' })\n description?: string\n\n @Field({ nullable: true, description: 'ISA-95 EvaluatedPropertyID — which property is measured' })\n evaluatedPropertyId?: string\n\n @Field(type => Float, { nullable: true, description: 'lower limit' })\n minimum?: number\n\n @Field(type => Float, { nullable: true, description: 'upper limit' })\n maximum?: number\n\n @Field({ nullable: true, description: 'unit of measure — required whenever a limit is given' })\n uom?: string\n\n @Field({ nullable: true, description: \"the site's own notation — never parsed\" })\n expression?: string\n\n /**\n * 화면이 아직 안 그리는 표준 칸들.\n *\n * **버리지 않는다.** 편 것을 다시 담을 때 이 칸들이 사라지면 사람이 적은 것이 조용히 없어진다.\n */\n @Field(type => ScalarObject, { nullable: true, description: 'standard fields this screen does not draw yet' })\n keptFields?: Record<string, unknown>\n}\n\n@ObjectType({ description: 'A page of test specifications' })\nexport class TestSpecificationList {\n @Field(type => [TestSpecification])\n items: TestSpecification[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(TestSpecification)\n@UseMiddleware(SpeakRefusals)\nexport class TestSpecificationResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => TestSpecificationList, { description: 'To fetch test specifications' })\n async testSpecifications(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<TestSpecificationList> {\n const { domain } = context.state\n return listEffectiveTestSpecifications(getRepository(TestSpecification).manager, domain, params)\n }\n\n /** Explicitly closed old write door: even non-regulated publication must retain a revision. */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [TestSpecification], { description: 'To create, change or retire test specifications' })\n async updateMultipleTestSpecification(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<TestSpecification[]> {\n throw new TestSpecificationRefusal('REVISION_REQUIRED', 'Use a test specification draft; direct identity-row changes are not supported.')\n }\n /**\n * 명세 하나의 기준을 **행으로** 낸다.\n *\n * 화면이 JSON 을 풀지 않게 하는 자리다. 명세를 못 찾으면 빈 목록을 주지 않고 말한다 — 빈 목록은\n * 「기준이 없는 명세」와 같아 보이고, 그러면 사람이 기준을 다시 적는다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [TestSpecificationCriterionRow], { description: 'Criteria of one test specification, as editable rows' })\n async testSpecificationCriteria(\n @Arg('name', { description: 'the test specification name' }) name: string,\n @Ctx() context: ResolverContext\n ): Promise<TestSpecificationCriterionRow[]> {\n /* 조회에는 `@transaction` 이 없다 — `context.state.tx` 는 그 지시자가 있을 때만 있다. */\n const { domain } = context.state\n\n const spec = await getRepository(TestSpecification).findOne({ where: { domain: { id: domain.id }, name } })\n\n if (!spec) {\n throw new Error(`검사 명세 \"${name}\" 를 찾지 못했습니다`)\n }\n\n const effective = await effectiveTestSpecification(getRepository(TestSpecification).manager, domain.id, spec)\n return toCriterionRows(effective.criteria ?? []) as TestSpecificationCriterionRow[]\n }\n\n /** Criteria belong to a draft, not to the stable identity row. */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [TestSpecificationCriterionRow], { description: 'To add, change or remove criteria of one test specification' })\n async updateTestSpecificationCriteria(\n @Arg('name', { description: 'the test specification name' }) name: string,\n @Arg('patches', type => [ScalarObject], { description: 'changed rows only, each with cuFlag and rowIndex' })\n patches: CriterionPatch[],\n @Ctx() context: ResolverContext\n ): Promise<TestSpecificationCriterionRow[]> {\n throw new TestSpecificationRefusal('REVISION_REQUIRED', 'Edit the draft criteria, then submit the frozen revision for approval.')\n }\n}\n"]}
@@ -1,6 +0,0 @@
1
- import type { TestSpecification as TestSpecificationDef } from '@operato/ops-contract';
2
- import type { TestSpecification } from './test-specification';
3
- export declare function toTestSpecification(spec: TestSpecification): TestSpecificationDef;
4
- export declare function testSpecificationMaster(specs: TestSpecification[]): {
5
- testSpecifications: TestSpecificationDef[];
6
- };