@things-factory/figure-library 10.1.215 → 10.1.222

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 (57) hide show
  1. package/dist-client/bootstrap.d.ts +5 -3
  2. package/dist-client/bootstrap.js +6 -3
  3. package/dist-client/bootstrap.js.map +1 -1
  4. package/dist-client/editors/ox-property-editor-figure-status.d.ts +41 -0
  5. package/dist-client/editors/ox-property-editor-figure-status.js +290 -0
  6. package/dist-client/editors/ox-property-editor-figure-status.js.map +1 -0
  7. package/dist-client/figure-palette-group.d.ts +9 -4
  8. package/dist-client/figure-palette-group.js +2 -1
  9. package/dist-client/figure-palette-group.js.map +1 -1
  10. package/dist-client/figure-palette.js +2 -1
  11. package/dist-client/figure-palette.js.map +1 -1
  12. package/dist-client/item-types/item-types-rows.d.ts +8 -0
  13. package/dist-client/item-types/item-types-rows.js +11 -0
  14. package/dist-client/item-types/item-types-rows.js.map +1 -1
  15. package/dist-client/item-types/ox-item-types-input.d.ts +5 -1
  16. package/dist-client/item-types/ox-item-types-input.js +144 -112
  17. package/dist-client/item-types/ox-item-types-input.js.map +1 -1
  18. package/dist-client/pages/figure-library-page.js +0 -1
  19. package/dist-client/pages/figure-library-page.js.map +1 -1
  20. package/dist-client/status-looks/ox-figure-status-looks.d.ts +58 -0
  21. package/dist-client/status-looks/ox-figure-status-looks.js +489 -0
  22. package/dist-client/status-looks/ox-figure-status-looks.js.map +1 -0
  23. package/dist-client/status-looks/status-looks.d.ts +99 -0
  24. package/dist-client/status-looks/status-looks.js +134 -0
  25. package/dist-client/status-looks/status-looks.js.map +1 -0
  26. package/dist-client/tsconfig.tsbuildinfo +1 -1
  27. package/dist-client/viewparts/figure-releases-popup.d.ts +1 -4
  28. package/dist-client/viewparts/figure-releases-popup.js +3 -21
  29. package/dist-client/viewparts/figure-releases-popup.js.map +1 -1
  30. package/dist-server/service/figure-library-release/figure-library-release.d.ts +3 -1
  31. package/dist-server/service/figure-library-release/figure-library-release.js +11 -1
  32. package/dist-server/service/figure-library-release/figure-library-release.js.map +1 -1
  33. package/dist-server/service/figure-library-resolver.d.ts +0 -1
  34. package/dist-server/service/figure-library-resolver.js +0 -15
  35. package/dist-server/service/figure-library-resolver.js.map +1 -1
  36. package/dist-server/service/figure-library-types.js +1 -1
  37. package/dist-server/service/figure-library-types.js.map +1 -1
  38. package/dist-server/service/figure-type-map/figure-type-map-entry.d.ts +0 -1
  39. package/dist-server/service/figure-type-map/figure-type-map-entry.js +1 -12
  40. package/dist-server/service/figure-type-map/figure-type-map-entry.js.map +1 -1
  41. package/dist-server/service/library/derived.d.ts +6 -2
  42. package/dist-server/service/library/derived.js +4 -2
  43. package/dist-server/service/library/derived.js.map +1 -1
  44. package/dist-server/service/library/figures.d.ts +2 -2
  45. package/dist-server/service/library/figures.js +2 -2
  46. package/dist-server/service/library/figures.js.map +1 -1
  47. package/dist-server/service/library/type-map.d.ts +0 -5
  48. package/dist-server/service/library/type-map.js +0 -14
  49. package/dist-server/service/library/type-map.js.map +1 -1
  50. package/dist-server/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +8 -8
  52. package/translations/en.json +49 -5
  53. package/translations/es.json +49 -5
  54. package/translations/ja.json +49 -5
  55. package/translations/ko.json +49 -5
  56. package/translations/ms.json +49 -5
  57. package/translations/zh.json +49 -5
@@ -17,8 +17,6 @@ export declare class FigureReleasesPopup extends FigureReleasesPopup_base {
17
17
  name: string;
18
18
  /** Whether the name is archived: the action row offers to unarchive it instead of archiving it. */
19
19
  archived: boolean;
20
- /** Whether the domain draws the name as an item: the action row offers to take the mark away instead of marking it. */
21
- item: boolean;
22
20
  /** The id of the release it draws with now; '' when nothing is in use. */
23
21
  drawing: string;
24
22
  private releases;
@@ -38,8 +36,7 @@ export declare class FigureReleasesPopup extends FigureReleasesPopup_base {
38
36
  private show;
39
37
  private archive;
40
38
  private unarchive;
41
- private markItem;
42
- /** Archives, unarchives or marks the name; a refusal (a board still uses it) is said at the top and the popup stays. */
39
+ /** Archives or unarchives the name; a refusal (a board still uses it) is said at the top and the popup stays. */
43
40
  private change;
44
41
  private save;
45
42
  }
@@ -49,14 +49,6 @@ const UNARCHIVE = gql `
49
49
  }
50
50
  }
51
51
  `;
52
- /* Whether the domain draws the name as an item a holder holds -- a carrier in fmsim (ADR-0155 개정 1 E). */
53
- const MARK_ITEM = gql `
54
- mutation ($name: String!, $item: Boolean!) {
55
- markFigureItem(name: $name, item: $item) {
56
- name
57
- }
58
- }
59
- `;
60
52
  const CHOOSE = gql `
61
53
  mutation ($name: String!, $releaseId: String!) {
62
54
  chooseFigureRelease(name: $name, releaseId: $releaseId) {
@@ -97,8 +89,6 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
97
89
  this.name = '';
98
90
  /** Whether the name is archived: the action row offers to unarchive it instead of archiving it. */
99
91
  this.archived = false;
100
- /** Whether the domain draws the name as an item: the action row offers to take the mark away instead of marking it. */
101
- this.item = false;
102
92
  /** The id of the release it draws with now; '' when nothing is in use. */
103
93
  this.drawing = '';
104
94
  this.releases = [];
@@ -112,7 +102,6 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
112
102
  this.assets = new Map();
113
103
  this.archive = () => this.change(ARCHIVE);
114
104
  this.unarchive = () => this.change(UNARCHIVE);
115
- this.markItem = () => this.change(MARK_ITEM, { item: !this.item });
116
105
  this.save = async () => {
117
106
  this.saving = true;
118
107
  try {
@@ -328,9 +317,6 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
328
317
  <md-text-button slot="start" ?disabled=${this.saving} @click=${this.archived ? this.unarchive : this.archive}>
329
318
  ${i18next.t(this.archived ? 'figure-library.button.unarchive' : 'figure-library.button.archive')}
330
319
  </md-text-button>
331
- <md-text-button slot="start" ?disabled=${this.saving} @click=${this.markItem}>
332
- ${i18next.t(this.item ? 'figure-library.button.unmark-item' : 'figure-library.button.mark-item')}
333
- </md-text-button>
334
320
  <button slot="cancel" @click=${() => closePopup(this)}>${i18next.t('figure-library.button.cancel')}</button>
335
321
  <button slot="confirm" raised ?disabled=${!changed || this.saving} @click=${this.save}>${i18next.t('figure-library.button.save')}</button>
336
322
  </ox-popup-actions>
@@ -418,11 +404,11 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
418
404
  next[column] = id;
419
405
  this.shown = next;
420
406
  }
421
- /** Archives, unarchives or marks the name; a refusal (a board still uses it) is said at the top and the popup stays. */
422
- async change(mutation, variables = {}) {
407
+ /** Archives or unarchives the name; a refusal (a board still uses it) is said at the top and the popup stays. */
408
+ async change(mutation) {
423
409
  this.saving = true;
424
410
  try {
425
- const response = await client.mutate({ mutation, variables: { name: this.name, ...variables } });
411
+ const response = await client.mutate({ mutation, variables: { name: this.name } });
426
412
  if (response.errors?.length)
427
413
  throw new Error(response.errors[0].message);
428
414
  this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }));
@@ -444,10 +430,6 @@ __decorate([
444
430
  property({ type: Boolean }),
445
431
  __metadata("design:type", Object)
446
432
  ], FigureReleasesPopup.prototype, "archived", void 0);
447
- __decorate([
448
- property({ type: Boolean }),
449
- __metadata("design:type", Object)
450
- ], FigureReleasesPopup.prototype, "item", void 0);
451
433
  __decorate([
452
434
  property(),
453
435
  __metadata("design:type", Object)
@@ -1 +1 @@
1
- {"version":3,"file":"figure-releases-popup.js","sourceRoot":"","sources":["../../client/viewparts/figure-releases-popup.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/text-button.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@things-factory/figure-viewer/dist-client/figure-asset-viewer.js'\nimport '@things-factory/figure-viewer/dist-client/figure-facts-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport type { FigureAsset } from '@hatiolab/figure-model'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport { ButtonStyles, CommonPopupStyles, FormFieldStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { versionText } from './figure-version.js'\nimport { defaultPair, SIDE_BY_SIDE } from './release-pair.js'\n\nconst RELEASES_OF = gql`\n query ($name: String!) {\n figureLibraryReleasesOf(name: $name) {\n id\n name\n ref\n version\n category\n source\n formatSupported\n assetFormat\n kernelVersion\n changes\n deprecated\n supersededBy\n comment\n sourceUrl\n releasedAt\n createdAt\n }\n }\n`\n\n/* Archiving is how a figure leaves the library; its releases stay (ADR-0114 결정 18 · 20). */\nconst ARCHIVE = gql`\n mutation ($name: String!) {\n archiveFigure(name: $name) {\n name\n }\n }\n`\n\nconst UNARCHIVE = gql`\n mutation ($name: String!) {\n unarchiveFigure(name: $name) {\n name\n }\n }\n`\n\n/* Whether the domain draws the name as an item a holder holds -- a carrier in fmsim (ADR-0155 개정 1 E). */\nconst MARK_ITEM = gql`\n mutation ($name: String!, $item: Boolean!) {\n markFigureItem(name: $name, item: $item) {\n name\n }\n }\n`\n\nconst CHOOSE = gql`\n mutation ($name: String!, $releaseId: String!) {\n chooseFigureRelease(name: $name, releaseId: $releaseId) {\n name\n }\n }\n`\n\ntype Change = { code?: string; values?: Record<string, unknown>; detail?: string; blocking?: boolean }\n\n/** A time in the reader's language (a bare toLocaleString follows the browser, not the app). */\nconst when = (value?: string | null) => (value ? new Date(value).toLocaleString(i18next.language) : '')\n\n/**\n * A contract change in words. figure-model gives a code and values; `detail` is English for logs and is\n * the sentence only when this module has no words for a new code (open question P8 in figure-library.md).\n */\nconst changeText = (change: Change) =>\n change.code\n ? i18next.t(`figure-library.contract.${change.code}`, { ...(change.values ?? {}), defaultValue: change.detail ?? change.code })\n : change.detail ?? ''\n\n/** The contract changes a release carries against its previous release, as the authoring server measured them. */\nconst changesOf = (release: any): Change[] => {\n try {\n const parsed = release.changes ? JSON.parse(release.changes) : []\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\n/**\n * Two releases of one figure on live canvases, side by side (ADR-0114, amended 2026-10-12): each drawn as a board draws\n * it, sized within its ranges, posed and played, with what it is and its places beside it -- operato-figure's preview\n * (@things-factory/figure-viewer), not a second one. With more releases, each column picks the release it shows; the\n * one in use and the latest stand first. The operator picks the release the figure draws with and saves; save stays\n * off until the pick differs. A release this server cannot read shows why instead of a canvas and cannot be picked.\n */\n@customElement('figure-releases-popup')\nexport class FigureReleasesPopup extends localize(i18next)(LitElement) {\n static styles = [\n CommonPopupStyles,\n ScrollbarStyles,\n ButtonStyles,\n FormFieldStyles,\n css`\n /*\n The popup takes the overlay's width (a share of the window, all of it on a narrow one) and never more: the two\n columns sit side by side when they have room and stack when they do not, and the actions stay in view.\n */\n :host {\n min-height: 0;\n width: 100%;\n --popup-min-width: 0;\n }\n\n /*\n Each column is as tall as the body, so its canvas stays in view while only its tab's body scrolls (user\n 2026-10-15: a clip played at the bottom of a scrolled column moved a figure no longer seen). Stacked, the body\n scrolls from one column to the next.\n */\n .body {\n flex: 1;\n overflow: auto;\n container-type: size;\n }\n\n .columns {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr));\n gap: var(--spacing-large, 12px);\n align-items: start;\n }\n\n section.column {\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: 100cqh;\n box-sizing: border-box;\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: var(--ui-r, 10px);\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n }\n\n section.column > * {\n flex: none;\n }\n\n /*\n The canvas and what a release is share the column: the canvas takes at most half of it, so its facts, size and\n motion always have the other half however wide the column is (user 2026-10-22: a 4:3 canvas across a wide\n column left the facts below the fold, or out of sight).\n */\n section.column > figure-asset-viewer {\n flex: 1;\n min-height: 0;\n --figure-asset-viewer-canvas-max: 50%;\n }\n\n section.column[picked] {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n box-shadow: inset 0 0 0 1px var(--ui-accent, var(--md-sys-color-primary));\n }\n\n /*\n Side by side, which release a column is stays in view while its facts scroll by. Stacked, each column's canvas\n stands right under its own header and the header leaves with its column (below two columns' width).\n */\n .head {\n position: sticky;\n top: 0;\n z-index: 1;\n border-radius: var(--ui-r, 10px) var(--ui-r, 10px) 0 0;\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) 16px;\n border-bottom: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n }\n\n @container (max-width: 771px) {\n .head {\n position: static;\n }\n }\n\n .head label {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n font-weight: 600;\n }\n\n .head select {\n height: var(--form-element-height-small, 26px);\n min-width: 72px;\n font-size: var(--ui-t-body, 13px);\n }\n\n .head strong {\n font-size: var(--ui-t-title, 15px);\n }\n\n .marks {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n\n .mark {\n padding: 0 var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font-size: var(--ui-t-small, 11.5px);\n white-space: nowrap;\n }\n\n .mark.on {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n color: var(--ui-accent, var(--md-sys-color-primary));\n font-weight: 600;\n }\n\n .mark.crit {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .reason {\n margin: 0;\n padding: var(--spacing-huge, 24px) 16px;\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n /* The release's own facts (note, dates, source, format, contract change) under the figure's. */\n dl.release {\n display: grid;\n grid-template-columns: 96px minmax(0, 1fr);\n gap: 3px 12px;\n margin: 0;\n padding: 10px 16px;\n line-height: 1.45;\n }\n\n dl.release dt {\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n dl.release dd {\n margin: 0;\n overflow-wrap: anywhere;\n }\n\n dl.release dd small {\n display: block;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n ul {\n margin: 0;\n padding-left: 1.2em;\n }\n\n li.breaking {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .finding {\n margin: 0 0 var(--spacing-large, 12px);\n padding-left: var(--spacing-large, 12px);\n border-left: 2px solid var(--ui-crit, var(--md-sys-color-error));\n }\n `\n ]\n\n /** The full figure name. */\n @property() name = ''\n /** Whether the name is archived: the action row offers to unarchive it instead of archiving it. */\n @property({ type: Boolean }) archived = false\n /** Whether the domain draws the name as an item: the action row offers to take the mark away instead of marking it. */\n @property({ type: Boolean }) item = false\n /** The id of the release it draws with now; '' when nothing is in use. */\n @property() drawing = ''\n\n @state() private releases: any[] = []\n /** The release each column shows, by id. */\n @state() private shown: string[] = []\n @state() private picked = ''\n @state() private saving = false\n @state() private failure = ''\n /** The tab both columns show: choosing one in a column turns the other to it, so both are compared on one view. */\n @state() private tab = 'info'\n\n private assets = new Map<string, FigureAsset | null>()\n\n async connectedCallback() {\n super.connectedCallback()\n this.picked = this.drawing\n const response = await client.query({ query: RELEASES_OF, variables: { name: this.name }, fetchPolicy: 'network-only' })\n this.releases = response.data?.figureLibraryReleasesOf ?? []\n this.shown = defaultPair(this.releases, this.drawing)\n }\n\n render() {\n const changed = !!this.picked && this.picked !== this.drawing\n const byId = new Map(this.releases.map(release => [release.id, release]))\n\n return html`\n <div class=\"body\">\n ${this.failure ? html`<p class=\"finding\" role=\"alert\">${this.failure}</p>` : nothing}\n <div class=\"columns\">\n ${this.shown.map((id, column) => (byId.get(id) ? this.renderColumn(byId.get(id), column) : nothing))}\n </div>\n </div>\n <ox-popup-actions>\n <md-text-button slot=\"start\" ?disabled=${this.saving} @click=${this.archived ? this.unarchive : this.archive}>\n ${i18next.t(this.archived ? 'figure-library.button.unarchive' : 'figure-library.button.archive')}\n </md-text-button>\n <md-text-button slot=\"start\" ?disabled=${this.saving} @click=${this.markItem}>\n ${i18next.t(this.item ? 'figure-library.button.unmark-item' : 'figure-library.button.mark-item')}\n </md-text-button>\n <button slot=\"cancel\" @click=${() => closePopup(this)}>${i18next.t('figure-library.button.cancel')}</button>\n <button slot=\"confirm\" raised ?disabled=${!changed || this.saving} @click=${this.save}>${i18next.t('figure-library.button.save')}</button>\n </ox-popup-actions>\n `\n }\n\n private assetOf(release: any): FigureAsset | null {\n if (!this.assets.has(release.id)) {\n let asset: FigureAsset | null = null\n try {\n asset = release.formatSupported ? (JSON.parse(release.source) as FigureAsset) : null\n } catch {\n asset = null\n }\n this.assets.set(release.id, asset)\n }\n return this.assets.get(release.id)!\n }\n\n private renderColumn(release: any, column: number) {\n const picked = release.id === this.picked\n /* A release this server cannot read is never used: it is shown, not picked (ADR-0114, amended 2026-10-12). */\n const asset = this.assetOf(release)\n const unusable = !asset\n const latest = release.id === this.releases[0]?.id\n const choosable = this.releases.length > SIDE_BY_SIDE\n\n return html`\n <section class=\"column\" ?picked=${picked}>\n <div class=\"head\">\n <label>\n <input type=\"radio\" name=\"release\" .checked=${picked} ?disabled=${unusable} @change=${() => (this.picked = release.id)} />\n ${choosable\n ? html`<select aria-label=${i18next.t('figure-library.label.release-shown')} @change=${(e: Event) => this.show(column, (e.target as HTMLSelectElement).value)}>\n ${this.releases.map(\n other => html`<option value=${other.id} ?selected=${other.id === release.id}>${versionText(other.version)}</option>`\n )}\n </select>`\n : html`<strong>${versionText(release.version)}</strong>`}\n </label>\n <span class=\"marks\">\n ${release.id === this.drawing ? html`<span class=\"mark on\">${i18next.t('figure-library.text.in-use')}</span>` : nothing}\n ${latest ? html`<span class=\"mark\">${i18next.t('figure-library.text.latest')}</span>` : nothing}\n ${unusable ? html`<span class=\"mark crit\">${i18next.t('figure-library.text.format-unsupported')}</span>` : nothing}\n ${release.deprecated ? html`<span class=\"mark\">${i18next.t('figure-library.text.deprecated')}</span>` : nothing}\n </span>\n </div>\n ${asset\n ? html`<figure-asset-viewer .asset=${asset} .tab=${this.tab} @tab-change=${(e: CustomEvent<{ tab: string }>) => (this.tab = e.detail.tab)}>\n <figure-facts-list slot=\"facts\" .asset=${asset} .row=${{ category: release.category }}></figure-facts-list>\n ${this.renderReleaseFacts(release, 'facts')}\n </figure-asset-viewer>`\n : html`<p class=\"reason\" role=\"note\">${i18next.t('figure-library.text.cannot-use-format', { format: release.assetFormat })}</p>\n ${this.renderReleaseFacts(release)}`}\n </section>\n `\n }\n\n private renderReleaseFacts(release: any, slot?: string) {\n const changes = changesOf(release)\n\n return html`<dl class=\"release\" slot=${slot ?? nothing}>\n ${release.comment ? html`<dt>${i18next.t('figure-library.label.release-note')}</dt><dd>${release.comment}</dd>` : nothing}\n ${release.version > 1\n ? html`<dt>${i18next.t('figure-library.text.contract-since', { version: versionText(release.version - 1) })}</dt>\n <dd>\n ${changes.length\n ? html`<ul>\n ${changes.map(\n change => html`<li class=${change.blocking ? 'breaking' : ''}>\n ${changeText(change)}${change.blocking ? html` · ${i18next.t('figure-library.text.breaking')}` : nothing}\n </li>`\n )}\n </ul>`\n : i18next.t('figure-library.text.no-contract-change')}\n </dd>`\n : nothing}\n <dt>${i18next.t('figure-library.label.format')}</dt>\n <dd>\n ${release.assetFormat}\n ${release.kernelVersion ? html`<small>${i18next.t('figure-library.text.kernel', { version: release.kernelVersion })}</small>` : nothing}\n </dd>\n <dt>${i18next.t('figure-library.label.released-at')}</dt>\n <dd>${when(release.releasedAt)}</dd>\n <dt>${i18next.t('figure-library.label.imported-at')}</dt>\n <dd>${when(release.createdAt)}</dd>\n <dt>${i18next.t('figure-library.label.source')}</dt>\n <dd>${release.sourceUrl ?? ''}</dd>\n </dl>`\n }\n\n private show(column: number, id: string) {\n const next = [...this.shown]\n next[column] = id\n this.shown = next\n }\n\n private archive = () => this.change(ARCHIVE)\n\n private unarchive = () => this.change(UNARCHIVE)\n\n private markItem = () => this.change(MARK_ITEM, { item: !this.item })\n\n /** Archives, unarchives or marks the name; a refusal (a board still uses it) is said at the top and the popup stays. */\n private async change(mutation: typeof ARCHIVE, variables: Record<string, unknown> = {}) {\n this.saving = true\n try {\n const response = await client.mutate({ mutation, variables: { name: this.name, ...variables } })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }))\n closePopup(this)\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.saving = false\n }\n }\n\n private save = async () => {\n this.saving = true\n try {\n const response = await client.mutate({ mutation: CHOOSE, variables: { name: this.name, releaseId: this.picked } })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }))\n closePopup(this)\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.saving = false\n }\n }\n}\n"]}
1
+ {"version":3,"file":"figure-releases-popup.js","sourceRoot":"","sources":["../../client/viewparts/figure-releases-popup.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/text-button.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@things-factory/figure-viewer/dist-client/figure-asset-viewer.js'\nimport '@things-factory/figure-viewer/dist-client/figure-facts-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport type { FigureAsset } from '@hatiolab/figure-model'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport { ButtonStyles, CommonPopupStyles, FormFieldStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { versionText } from './figure-version.js'\nimport { defaultPair, SIDE_BY_SIDE } from './release-pair.js'\n\nconst RELEASES_OF = gql`\n query ($name: String!) {\n figureLibraryReleasesOf(name: $name) {\n id\n name\n ref\n version\n category\n source\n formatSupported\n assetFormat\n kernelVersion\n changes\n deprecated\n supersededBy\n comment\n sourceUrl\n releasedAt\n createdAt\n }\n }\n`\n\n/* Archiving is how a figure leaves the library; its releases stay (ADR-0114 결정 18 · 20). */\nconst ARCHIVE = gql`\n mutation ($name: String!) {\n archiveFigure(name: $name) {\n name\n }\n }\n`\n\nconst UNARCHIVE = gql`\n mutation ($name: String!) {\n unarchiveFigure(name: $name) {\n name\n }\n }\n`\n\nconst CHOOSE = gql`\n mutation ($name: String!, $releaseId: String!) {\n chooseFigureRelease(name: $name, releaseId: $releaseId) {\n name\n }\n }\n`\n\ntype Change = { code?: string; values?: Record<string, unknown>; detail?: string; blocking?: boolean }\n\n/** A time in the reader's language (a bare toLocaleString follows the browser, not the app). */\nconst when = (value?: string | null) => (value ? new Date(value).toLocaleString(i18next.language) : '')\n\n/**\n * A contract change in words. figure-model gives a code and values; `detail` is English for logs and is\n * the sentence only when this module has no words for a new code (open question P8 in figure-library.md).\n */\nconst changeText = (change: Change) =>\n change.code\n ? i18next.t(`figure-library.contract.${change.code}`, { ...(change.values ?? {}), defaultValue: change.detail ?? change.code })\n : change.detail ?? ''\n\n/** The contract changes a release carries against its previous release, as the authoring server measured them. */\nconst changesOf = (release: any): Change[] => {\n try {\n const parsed = release.changes ? JSON.parse(release.changes) : []\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\n/**\n * Two releases of one figure on live canvases, side by side (ADR-0114, amended 2026-10-12): each drawn as a board draws\n * it, sized within its ranges, posed and played, with what it is and its places beside it -- operato-figure's preview\n * (@things-factory/figure-viewer), not a second one. With more releases, each column picks the release it shows; the\n * one in use and the latest stand first. The operator picks the release the figure draws with and saves; save stays\n * off until the pick differs. A release this server cannot read shows why instead of a canvas and cannot be picked.\n */\n@customElement('figure-releases-popup')\nexport class FigureReleasesPopup extends localize(i18next)(LitElement) {\n static styles = [\n CommonPopupStyles,\n ScrollbarStyles,\n ButtonStyles,\n FormFieldStyles,\n css`\n /*\n The popup takes the overlay's width (a share of the window, all of it on a narrow one) and never more: the two\n columns sit side by side when they have room and stack when they do not, and the actions stay in view.\n */\n :host {\n min-height: 0;\n width: 100%;\n --popup-min-width: 0;\n }\n\n /*\n Each column is as tall as the body, so its canvas stays in view while only its tab's body scrolls (user\n 2026-10-15: a clip played at the bottom of a scrolled column moved a figure no longer seen). Stacked, the body\n scrolls from one column to the next.\n */\n .body {\n flex: 1;\n overflow: auto;\n container-type: size;\n }\n\n .columns {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr));\n gap: var(--spacing-large, 12px);\n align-items: start;\n }\n\n section.column {\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: 100cqh;\n box-sizing: border-box;\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: var(--ui-r, 10px);\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n }\n\n section.column > * {\n flex: none;\n }\n\n /*\n The canvas and what a release is share the column: the canvas takes at most half of it, so its facts, size and\n motion always have the other half however wide the column is (user 2026-10-22: a 4:3 canvas across a wide\n column left the facts below the fold, or out of sight).\n */\n section.column > figure-asset-viewer {\n flex: 1;\n min-height: 0;\n --figure-asset-viewer-canvas-max: 50%;\n }\n\n section.column[picked] {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n box-shadow: inset 0 0 0 1px var(--ui-accent, var(--md-sys-color-primary));\n }\n\n /*\n Side by side, which release a column is stays in view while its facts scroll by. Stacked, each column's canvas\n stands right under its own header and the header leaves with its column (below two columns' width).\n */\n .head {\n position: sticky;\n top: 0;\n z-index: 1;\n border-radius: var(--ui-r, 10px) var(--ui-r, 10px) 0 0;\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) 16px;\n border-bottom: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n }\n\n @container (max-width: 771px) {\n .head {\n position: static;\n }\n }\n\n .head label {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n font-weight: 600;\n }\n\n .head select {\n height: var(--form-element-height-small, 26px);\n min-width: 72px;\n font-size: var(--ui-t-body, 13px);\n }\n\n .head strong {\n font-size: var(--ui-t-title, 15px);\n }\n\n .marks {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n\n .mark {\n padding: 0 var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font-size: var(--ui-t-small, 11.5px);\n white-space: nowrap;\n }\n\n .mark.on {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n color: var(--ui-accent, var(--md-sys-color-primary));\n font-weight: 600;\n }\n\n .mark.crit {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .reason {\n margin: 0;\n padding: var(--spacing-huge, 24px) 16px;\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n /* The release's own facts (note, dates, source, format, contract change) under the figure's. */\n dl.release {\n display: grid;\n grid-template-columns: 96px minmax(0, 1fr);\n gap: 3px 12px;\n margin: 0;\n padding: 10px 16px;\n line-height: 1.45;\n }\n\n dl.release dt {\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n dl.release dd {\n margin: 0;\n overflow-wrap: anywhere;\n }\n\n dl.release dd small {\n display: block;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n ul {\n margin: 0;\n padding-left: 1.2em;\n }\n\n li.breaking {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .finding {\n margin: 0 0 var(--spacing-large, 12px);\n padding-left: var(--spacing-large, 12px);\n border-left: 2px solid var(--ui-crit, var(--md-sys-color-error));\n }\n `\n ]\n\n /** The full figure name. */\n @property() name = ''\n /** Whether the name is archived: the action row offers to unarchive it instead of archiving it. */\n @property({ type: Boolean }) archived = false\n /** The id of the release it draws with now; '' when nothing is in use. */\n @property() drawing = ''\n\n @state() private releases: any[] = []\n /** The release each column shows, by id. */\n @state() private shown: string[] = []\n @state() private picked = ''\n @state() private saving = false\n @state() private failure = ''\n /** The tab both columns show: choosing one in a column turns the other to it, so both are compared on one view. */\n @state() private tab = 'info'\n\n private assets = new Map<string, FigureAsset | null>()\n\n async connectedCallback() {\n super.connectedCallback()\n this.picked = this.drawing\n const response = await client.query({ query: RELEASES_OF, variables: { name: this.name }, fetchPolicy: 'network-only' })\n this.releases = response.data?.figureLibraryReleasesOf ?? []\n this.shown = defaultPair(this.releases, this.drawing)\n }\n\n render() {\n const changed = !!this.picked && this.picked !== this.drawing\n const byId = new Map(this.releases.map(release => [release.id, release]))\n\n return html`\n <div class=\"body\">\n ${this.failure ? html`<p class=\"finding\" role=\"alert\">${this.failure}</p>` : nothing}\n <div class=\"columns\">\n ${this.shown.map((id, column) => (byId.get(id) ? this.renderColumn(byId.get(id), column) : nothing))}\n </div>\n </div>\n <ox-popup-actions>\n <md-text-button slot=\"start\" ?disabled=${this.saving} @click=${this.archived ? this.unarchive : this.archive}>\n ${i18next.t(this.archived ? 'figure-library.button.unarchive' : 'figure-library.button.archive')}\n </md-text-button>\n <button slot=\"cancel\" @click=${() => closePopup(this)}>${i18next.t('figure-library.button.cancel')}</button>\n <button slot=\"confirm\" raised ?disabled=${!changed || this.saving} @click=${this.save}>${i18next.t('figure-library.button.save')}</button>\n </ox-popup-actions>\n `\n }\n\n private assetOf(release: any): FigureAsset | null {\n if (!this.assets.has(release.id)) {\n let asset: FigureAsset | null = null\n try {\n asset = release.formatSupported ? (JSON.parse(release.source) as FigureAsset) : null\n } catch {\n asset = null\n }\n this.assets.set(release.id, asset)\n }\n return this.assets.get(release.id)!\n }\n\n private renderColumn(release: any, column: number) {\n const picked = release.id === this.picked\n /* A release this server cannot read is never used: it is shown, not picked (ADR-0114, amended 2026-10-12). */\n const asset = this.assetOf(release)\n const unusable = !asset\n const latest = release.id === this.releases[0]?.id\n const choosable = this.releases.length > SIDE_BY_SIDE\n\n return html`\n <section class=\"column\" ?picked=${picked}>\n <div class=\"head\">\n <label>\n <input type=\"radio\" name=\"release\" .checked=${picked} ?disabled=${unusable} @change=${() => (this.picked = release.id)} />\n ${choosable\n ? html`<select aria-label=${i18next.t('figure-library.label.release-shown')} @change=${(e: Event) => this.show(column, (e.target as HTMLSelectElement).value)}>\n ${this.releases.map(\n other => html`<option value=${other.id} ?selected=${other.id === release.id}>${versionText(other.version)}</option>`\n )}\n </select>`\n : html`<strong>${versionText(release.version)}</strong>`}\n </label>\n <span class=\"marks\">\n ${release.id === this.drawing ? html`<span class=\"mark on\">${i18next.t('figure-library.text.in-use')}</span>` : nothing}\n ${latest ? html`<span class=\"mark\">${i18next.t('figure-library.text.latest')}</span>` : nothing}\n ${unusable ? html`<span class=\"mark crit\">${i18next.t('figure-library.text.format-unsupported')}</span>` : nothing}\n ${release.deprecated ? html`<span class=\"mark\">${i18next.t('figure-library.text.deprecated')}</span>` : nothing}\n </span>\n </div>\n ${asset\n ? html`<figure-asset-viewer .asset=${asset} .tab=${this.tab} @tab-change=${(e: CustomEvent<{ tab: string }>) => (this.tab = e.detail.tab)}>\n <figure-facts-list slot=\"facts\" .asset=${asset} .row=${{ category: release.category }}></figure-facts-list>\n ${this.renderReleaseFacts(release, 'facts')}\n </figure-asset-viewer>`\n : html`<p class=\"reason\" role=\"note\">${i18next.t('figure-library.text.cannot-use-format', { format: release.assetFormat })}</p>\n ${this.renderReleaseFacts(release)}`}\n </section>\n `\n }\n\n private renderReleaseFacts(release: any, slot?: string) {\n const changes = changesOf(release)\n\n return html`<dl class=\"release\" slot=${slot ?? nothing}>\n ${release.comment ? html`<dt>${i18next.t('figure-library.label.release-note')}</dt><dd>${release.comment}</dd>` : nothing}\n ${release.version > 1\n ? html`<dt>${i18next.t('figure-library.text.contract-since', { version: versionText(release.version - 1) })}</dt>\n <dd>\n ${changes.length\n ? html`<ul>\n ${changes.map(\n change => html`<li class=${change.blocking ? 'breaking' : ''}>\n ${changeText(change)}${change.blocking ? html` · ${i18next.t('figure-library.text.breaking')}` : nothing}\n </li>`\n )}\n </ul>`\n : i18next.t('figure-library.text.no-contract-change')}\n </dd>`\n : nothing}\n <dt>${i18next.t('figure-library.label.format')}</dt>\n <dd>\n ${release.assetFormat}\n ${release.kernelVersion ? html`<small>${i18next.t('figure-library.text.kernel', { version: release.kernelVersion })}</small>` : nothing}\n </dd>\n <dt>${i18next.t('figure-library.label.released-at')}</dt>\n <dd>${when(release.releasedAt)}</dd>\n <dt>${i18next.t('figure-library.label.imported-at')}</dt>\n <dd>${when(release.createdAt)}</dd>\n <dt>${i18next.t('figure-library.label.source')}</dt>\n <dd>${release.sourceUrl ?? ''}</dd>\n </dl>`\n }\n\n private show(column: number, id: string) {\n const next = [...this.shown]\n next[column] = id\n this.shown = next\n }\n\n private archive = () => this.change(ARCHIVE)\n\n private unarchive = () => this.change(UNARCHIVE)\n\n /** Archives or unarchives the name; a refusal (a board still uses it) is said at the top and the popup stays. */\n private async change(mutation: typeof ARCHIVE) {\n this.saving = true\n try {\n const response = await client.mutate({ mutation, variables: { name: this.name } })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }))\n closePopup(this)\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.saving = false\n }\n }\n\n private save = async () => {\n this.saving = true\n try {\n const response = await client.mutate({ mutation: CHOOSE, variables: { name: this.name, releaseId: this.picked } })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }))\n closePopup(this)\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.saving = false\n }\n }\n}\n"]}
@@ -11,7 +11,7 @@ export interface FigureLibraryDependency {
11
11
  * A released figure this board server imported (ADR-0114 결정 3).
12
12
  *
13
13
  * The release data is immutable: the server that authored it never changes a release, so a row is added once and never
14
- * rewritten from a package. `formatSupported` · `checkedKernel` · `width` · `depth` · `capabilities` · `extensions` are
14
+ * rewritten from a package. `formatSupported` · `checkedKernel` · `width` · `depth` · `capabilities` · `item` · `holder` · `extensions` are
15
15
  * derived, recomputed when this server's kernel is another version than the one that checked them.
16
16
  * Kept as columns so a list filters on them without reading every source. There is no delete path.
17
17
  */
@@ -39,6 +39,8 @@ export declare class FigureLibraryRelease {
39
39
  width?: number;
40
40
  depth?: number;
41
41
  capabilities?: string[];
42
+ item?: boolean;
43
+ holder?: boolean;
42
44
  extensions?: Record<string, unknown>;
43
45
  dependencies?: FigureLibraryDependency[];
44
46
  comment?: string;
@@ -11,7 +11,7 @@ const shell_1 = require("@things-factory/shell");
11
11
  * A released figure this board server imported (ADR-0114 결정 3).
12
12
  *
13
13
  * The release data is immutable: the server that authored it never changes a release, so a row is added once and never
14
- * rewritten from a package. `formatSupported` · `checkedKernel` · `width` · `depth` · `capabilities` · `extensions` are
14
+ * rewritten from a package. `formatSupported` · `checkedKernel` · `width` · `depth` · `capabilities` · `item` · `holder` · `extensions` are
15
15
  * derived, recomputed when this server's kernel is another version than the one that checked them.
16
16
  * Kept as columns so a list filters on them without reading every source. There is no delete path.
17
17
  */
@@ -132,6 +132,16 @@ tslib_1.__decorate([
132
132
  (0, type_graphql_1.Field)(type => [String], { nullable: true, description: 'Derived: the roles of the places the source declares (seat, grip), [] for none. Null when unread.' }),
133
133
  tslib_1.__metadata("design:type", Array)
134
134
  ], FigureLibraryRelease.prototype, "capabilities", void 0);
135
+ tslib_1.__decorate([
136
+ (0, typeorm_1.Column)({ nullable: true }),
137
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Derived: whether the source tags the figure as the look of an item a holder seats and carries (ADR-0155 amendment 2; fmsim: a carrier). Null when unread.' }),
138
+ tslib_1.__metadata("design:type", Boolean)
139
+ ], FigureLibraryRelease.prototype, "item", void 0);
140
+ tslib_1.__decorate([
141
+ (0, typeorm_1.Column)({ nullable: true }),
142
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Derived: whether the figure holds things -- capability names, places or a slot layout. Null when unread.' }),
143
+ tslib_1.__metadata("design:type", Boolean)
144
+ ], FigureLibraryRelease.prototype, "holder", void 0);
135
145
  tslib_1.__decorate([
136
146
  (0, typeorm_1.Column)('simple-json', { nullable: true, default: null }),
137
147
  (0, type_graphql_1.Field)(type => graphql_scalars_1.GraphQLJSON, { nullable: true, description: 'Derived: the extension properties the source carries, by key {owner}/{name} (ADR-0123). Null when none or unread.' })
@@ -1 +1 @@
1
- {"version":3,"file":"figure-library-release.js","sourceRoot":"","sources":["../../../server/service/figure-library-release/figure-library-release.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, Float, ID, Int, ObjectType } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, longTextColumn } from '@things-factory/shell'\n\n/** A file a release depends on, as its package listed it. */\nexport interface FigureLibraryDependency {\n hash: string\n role: string\n size: number\n contentType: string\n}\n\n/**\n * A released figure this board server imported (ADR-0114 결정 3).\n *\n * The release data is immutable: the server that authored it never changes a release, so a row is added once and never\n * rewritten from a package. `formatSupported` · `checkedKernel` · `width` · `depth` · `capabilities` · `extensions` are\n * derived, recomputed when this server's kernel is another version than the one that checked them.\n * Kept as columns so a list filters on them without reading every source. There is no delete path.\n */\n@Entity()\n@Index('ix_figure_library_release_1', (release: FigureLibraryRelease) => [release.domain, release.ref], {\n unique: true,\n where: '\"deleted_at\" IS NULL'\n})\n@Index('ix_figure_library_release_2', (release: FigureLibraryRelease) => [release.domain, release.namespace, release.type])\n@ObjectType({ description: 'A released figure imported into this board server, one row per release reference.' })\nexport class FigureLibraryRelease {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier.' })\n readonly id?: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain that imported the release.' })\n domain?: Domain\n\n @RelationId((release: FigureLibraryRelease) => release.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Display name of the figure at this release.' })\n name: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Description of the figure at this release.' })\n description?: string\n\n @Column()\n @Field({ description: 'Release reference {namespace}/{type}@{version}.' })\n ref: string\n\n @Column()\n @Field({ description: 'Namespace of the full name.' })\n namespace: string\n\n @Column()\n @Field({ description: 'Type of the full name.' })\n type: string\n\n @Column()\n @Field(type => Int, { description: 'Release version.' })\n version: number\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Display names by language.' })\n names?: Record<string, string>\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Category of the figure at this release.' })\n category?: string\n\n @Column({ ...longTextColumn() })\n @Field({ description: 'The released source, as the authoring server released it.' })\n source: string\n\n @Column({ length: 64 })\n @Field({ description: 'SHA-256 of the source. Same reference and hash is the same release.' })\n contentHash: string\n\n @Column()\n @Field({ description: 'The format the source declares (figure-asset-1).' })\n assetFormat: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Kernel version that released it on the authoring server.' })\n kernelVersion?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'What the release measured, as JSON text.' })\n metrics?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'Top view of the release, as JSON text.' })\n topView?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'Contract changes against its previous release, as JSON text.' })\n changes?: string\n\n @Column({ default: false })\n @Field({ description: 'Derived: whether this server kernel reads the source.' })\n formatSupported: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Derived: kernel version that checked the source here.' })\n checkedKernel?: string\n\n @Column({ type: 'float', nullable: true })\n @Field(type => Float, { nullable: true, description: 'Derived: authored width (size.x) in mm. Null when unread.' })\n width?: number\n\n @Column({ type: 'float', nullable: true })\n @Field(type => Float, { nullable: true, description: 'Derived: authored depth (size.z) in mm. Null when unread.' })\n depth?: number\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => [String], { nullable: true, description: 'Derived: the roles of the places the source declares (seat, grip), [] for none. Null when unread.' })\n capabilities?: string[]\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Derived: the extension properties the source carries, by key {owner}/{name} (ADR-0123). Null when none or unread.' })\n /* Not figure-model's recursive JSON type: TypeORM's deep partial of it does not end. */\n extensions?: Record<string, unknown>\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Files the release depends on: [{ hash, role, size, contentType }].' })\n dependencies?: FigureLibraryDependency[]\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'The note the author left when releasing this version.' })\n comment?: string\n\n @Column({ default: false })\n @Field({ description: 'Deprecated at the authoring server.' })\n deprecated: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Full name to use instead of a deprecated figure.' })\n supersededBy?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Address of the figure server the package came from.' })\n sourceUrl?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Domain of the figure server the package came from.' })\n sourceDomain?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'File name of the package it was imported from.' })\n packageName?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When the authoring server released it.' })\n releasedAt?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Creation timestamp (when it was imported).' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Last update timestamp.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Soft-delete timestamp. Releases are not deleted.' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who imported it.' })\n creator?: User\n\n @RelationId((release: FigureLibraryRelease) => release.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who last updated it.' })\n updater?: User\n\n @RelationId((release: FigureLibraryRelease) => release.updater)\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"figure-library-release.js","sourceRoot":"","sources":["../../../server/service/figure-library-release/figure-library-release.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, Float, ID, Int, ObjectType } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, longTextColumn } from '@things-factory/shell'\n\n/** A file a release depends on, as its package listed it. */\nexport interface FigureLibraryDependency {\n hash: string\n role: string\n size: number\n contentType: string\n}\n\n/**\n * A released figure this board server imported (ADR-0114 결정 3).\n *\n * The release data is immutable: the server that authored it never changes a release, so a row is added once and never\n * rewritten from a package. `formatSupported` · `checkedKernel` · `width` · `depth` · `capabilities` · `item` · `holder` · `extensions` are\n * derived, recomputed when this server's kernel is another version than the one that checked them.\n * Kept as columns so a list filters on them without reading every source. There is no delete path.\n */\n@Entity()\n@Index('ix_figure_library_release_1', (release: FigureLibraryRelease) => [release.domain, release.ref], {\n unique: true,\n where: '\"deleted_at\" IS NULL'\n})\n@Index('ix_figure_library_release_2', (release: FigureLibraryRelease) => [release.domain, release.namespace, release.type])\n@ObjectType({ description: 'A released figure imported into this board server, one row per release reference.' })\nexport class FigureLibraryRelease {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier.' })\n readonly id?: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain that imported the release.' })\n domain?: Domain\n\n @RelationId((release: FigureLibraryRelease) => release.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Display name of the figure at this release.' })\n name: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Description of the figure at this release.' })\n description?: string\n\n @Column()\n @Field({ description: 'Release reference {namespace}/{type}@{version}.' })\n ref: string\n\n @Column()\n @Field({ description: 'Namespace of the full name.' })\n namespace: string\n\n @Column()\n @Field({ description: 'Type of the full name.' })\n type: string\n\n @Column()\n @Field(type => Int, { description: 'Release version.' })\n version: number\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Display names by language.' })\n names?: Record<string, string>\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Category of the figure at this release.' })\n category?: string\n\n @Column({ ...longTextColumn() })\n @Field({ description: 'The released source, as the authoring server released it.' })\n source: string\n\n @Column({ length: 64 })\n @Field({ description: 'SHA-256 of the source. Same reference and hash is the same release.' })\n contentHash: string\n\n @Column()\n @Field({ description: 'The format the source declares (figure-asset-1).' })\n assetFormat: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Kernel version that released it on the authoring server.' })\n kernelVersion?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'What the release measured, as JSON text.' })\n metrics?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'Top view of the release, as JSON text.' })\n topView?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'Contract changes against its previous release, as JSON text.' })\n changes?: string\n\n @Column({ default: false })\n @Field({ description: 'Derived: whether this server kernel reads the source.' })\n formatSupported: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Derived: kernel version that checked the source here.' })\n checkedKernel?: string\n\n @Column({ type: 'float', nullable: true })\n @Field(type => Float, { nullable: true, description: 'Derived: authored width (size.x) in mm. Null when unread.' })\n width?: number\n\n @Column({ type: 'float', nullable: true })\n @Field(type => Float, { nullable: true, description: 'Derived: authored depth (size.z) in mm. Null when unread.' })\n depth?: number\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => [String], { nullable: true, description: 'Derived: the roles of the places the source declares (seat, grip), [] for none. Null when unread.' })\n capabilities?: string[]\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Derived: whether the source tags the figure as the look of an item a holder seats and carries (ADR-0155 amendment 2; fmsim: a carrier). Null when unread.' })\n item?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Derived: whether the figure holds things -- capability names, places or a slot layout. Null when unread.' })\n holder?: boolean\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Derived: the extension properties the source carries, by key {owner}/{name} (ADR-0123). Null when none or unread.' })\n /* Not figure-model's recursive JSON type: TypeORM's deep partial of it does not end. */\n extensions?: Record<string, unknown>\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Files the release depends on: [{ hash, role, size, contentType }].' })\n dependencies?: FigureLibraryDependency[]\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'The note the author left when releasing this version.' })\n comment?: string\n\n @Column({ default: false })\n @Field({ description: 'Deprecated at the authoring server.' })\n deprecated: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Full name to use instead of a deprecated figure.' })\n supersededBy?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Address of the figure server the package came from.' })\n sourceUrl?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Domain of the figure server the package came from.' })\n sourceDomain?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'File name of the package it was imported from.' })\n packageName?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When the authoring server released it.' })\n releasedAt?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Creation timestamp (when it was imported).' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Last update timestamp.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Soft-delete timestamp. Releases are not deleted.' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who imported it.' })\n creator?: User\n\n @RelationId((release: FigureLibraryRelease) => release.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who last updated it.' })\n updater?: User\n\n @RelationId((release: FigureLibraryRelease) => release.updater)\n updaterId?: string\n}\n"]}
@@ -19,6 +19,5 @@ export declare class FigureLibraryResolver {
19
19
  importFigurePackage(file: FileUpload, context: ResolverContext): Promise<FigureImportResult>;
20
20
  chooseFigureRelease(name: string, releaseId: string, context: ResolverContext): Promise<FigureTypeMapEntry>;
21
21
  archiveFigure(name: string, context: ResolverContext): Promise<FigureTypeMapEntry>;
22
- markFigureItem(name: string, item: boolean, context: ResolverContext): Promise<FigureTypeMapEntry>;
23
22
  unarchiveFigure(name: string, context: ResolverContext): Promise<FigureTypeMapEntry>;
24
23
  }
@@ -117,10 +117,6 @@ let FigureLibraryResolver = class FigureLibraryResolver {
117
117
  const { domain, user, tx } = context.state;
118
118
  return await (0, type_map_1.archiveFigure)(tx, domain, user, name);
119
119
  }
120
- async markFigureItem(name, item, context) {
121
- const { domain, user, tx } = context.state;
122
- return await (0, type_map_1.markFigureItem)(tx, domain, user, name, item);
123
- }
124
120
  async unarchiveFigure(name, context) {
125
121
  const { domain, user, tx } = context.state;
126
122
  return await (0, type_map_1.unarchiveFigure)(tx, domain, user, name);
@@ -234,17 +230,6 @@ tslib_1.__decorate([
234
230
  tslib_1.__metadata("design:paramtypes", [String, Object]),
235
231
  tslib_1.__metadata("design:returntype", Promise)
236
232
  ], FigureLibraryResolver.prototype, "archiveFigure", null);
237
- tslib_1.__decorate([
238
- (0, type_graphql_1.Directive)('@transaction'),
239
- (0, type_graphql_1.Directive)('@privilege(category: "figure-library", privilege: "mutation", domainOwnerGranted: true)'),
240
- (0, type_graphql_1.Mutation)(returns => figure_type_map_entry_1.FigureTypeMapEntry, { description: 'Marks a full figure name as an item this domain draws (fmsim: a carrier), or takes the mark away.' }),
241
- tslib_1.__param(0, (0, type_graphql_1.Arg)('name', { description: 'Full figure name {namespace}/{type}.' })),
242
- tslib_1.__param(1, (0, type_graphql_1.Arg)('item', { description: 'True to draw the name as an item, false to take the mark away.' })),
243
- tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
244
- tslib_1.__metadata("design:type", Function),
245
- tslib_1.__metadata("design:paramtypes", [String, Boolean, Object]),
246
- tslib_1.__metadata("design:returntype", Promise)
247
- ], FigureLibraryResolver.prototype, "markFigureItem", null);
248
233
  tslib_1.__decorate([
249
234
  (0, type_graphql_1.Directive)('@transaction'),
250
235
  (0, type_graphql_1.Directive)('@privilege(category: "figure-library", privilege: "mutation", domainOwnerGranted: true)'),
@@ -1 +1 @@
1
- {"version":3,"file":"figure-library-resolver.js","sourceRoot":"","sources":["../../server/service/figure-library-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver, UseMiddleware } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\nimport type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\n\nimport { getQueryBuilderFromListParams, getRepository, ListParam, Refusal, refusalKey, SpeakRefusals } from '@things-factory/shell'\n\nimport { FigureLibraryRelease } from './figure-library-release/figure-library-release'\nimport { FigureTypeMapEntry } from './figure-type-map/figure-type-map-entry'\nimport { FigureImportResult, FigureLibraryFacets, FigureLibraryFigureList, FigureLibraryReleaseList } from './figure-library-types'\nimport { figureFacetsOf, figuresOf, releasesOfName } from './library/figures'\nimport { blueprintsOf } from './library/blueprints'\nimport { extensionsOf } from './library/extensions'\nimport { assertPackageName, importFigurePackage } from './library/import'\nimport { boardRequirements, freshen } from './library/inspection'\nimport { chooseRelease, inUseLinesOf, unarchiveFigure, archiveFigure, markFigureItem } from './library/type-map'\n\n/**\n * A refusal in the asker's language as plain text: a board draws it on a canvas, not into HTML, so the values in it\n * (a name with `/`) are not escaped.\n */\nfunction plainTextOf(refusal: Refusal, context: any): string {\n return context.t\n ? context.t(refusalKey(refusal.code), { ...refusal.params, defaultValue: refusal.message, interpolation: { escapeValue: false } })\n : refusal.message\n}\n\n/** The most bytes one package upload may carry. */\nconst PACKAGE_MAX_BYTES = 64 * 1024 * 1024\n\nasync function bytesOf(file: FileUpload): Promise<Buffer> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of file.createReadStream()) {\n size += chunk.length\n if (size > PACKAGE_MAX_BYTES) throw new Refusal('figure-package-too-large', { max: PACKAGE_MAX_BYTES }, 'a figure package is at most {max} bytes.')\n chunks.push(Buffer.from(chunk))\n }\n return Buffer.concat(chunks)\n}\n\n/**\n * The library and the type map of a board server (ADR-0114). Reading is `figure-library` query; changing is its\n * mutation. Boards ask `figureBlueprints` under `figure-published`, the door every figure consumer asks through.\n */\n@Resolver()\n@UseMiddleware(SpeakRefusals)\nexport class FigureLibraryResolver {\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryReleaseList, { description: 'Lists the releases imported into this domain.' })\n async figureLibraryReleases(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<FigureLibraryReleaseList> {\n const { domain, tx } = context.state\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(FigureLibraryRelease, tx),\n params,\n domain,\n alias: 'release',\n searchables: ['ref', 'name', 'description', 'category']\n })\n const [items, total] = await queryBuilder.getManyAndCount()\n const manager = tx ?? getRepository(FigureLibraryRelease).manager\n for (const item of items) await freshen(manager, item)\n return { items, total }\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryFigureList, {\n description: 'Imported figures, one per full name, with the release each draws with. Filters: category, capability (\"-\" for none), name (search), archived (true to include archived figures; left out by default), item (true for only the names drawn as items).'\n })\n async figureLibraryFigures(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<FigureLibraryFigureList> {\n const { domain } = context.state\n const value = (name: string) => {\n const found = params.filters?.find(filter => filter.name === name)?.value\n return Array.isArray(found) ? found[0] : found ?? undefined\n }\n const manager = getRepository(FigureTypeMapEntry).manager\n const result = await figuresOf(manager, domain, {\n category: value('category'),\n capability: value('capability'),\n search: value('name'),\n includeArchived: value('archived') === true || value('archived') === 'true',\n onlyItems: value('item') === true || value('item') === 'true',\n page: params.pagination?.page,\n limit: params.pagination?.limit\n })\n for (const item of result.items) {\n if (item.release) await freshen(manager, item.release)\n await freshen(manager, item.latest)\n }\n return result\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryFacets, { description: 'The categories and capabilities the figure filters offer.' })\n async figureLibraryFacets(@Ctx() context: ResolverContext): Promise<FigureLibraryFacets> {\n return await figureFacetsOf(getRepository(FigureTypeMapEntry).manager, context.state.domain)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [FigureLibraryRelease], { description: 'Every imported release of one full figure name, newest first.' })\n async figureLibraryReleasesOf(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<FigureLibraryRelease[]> {\n return await releasesOfName(getRepository(FigureLibraryRelease).manager, context.state.domain, name)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [FigureTypeMapEntry], { description: 'The type map of this domain: one line per full figure name, with the release it draws with.' })\n async figureTypeMap(@Ctx() context: ResolverContext): Promise<FigureTypeMapEntry[]> {\n const { domain } = context.state\n /* The tray reads this: an archived name is not offered (ADR-0114 결정 18). */\n return await inUseLinesOf(getRepository(FigureTypeMapEntry).manager, domain)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, { nullable: true, description: 'What one board needs from the type map: each figure, its status and node count.' })\n async figureBoardRequirements(@Arg('boardId') boardId: string, @Ctx() context: ResolverContext): Promise<any> {\n const { domain } = context.state\n return await boardRequirements(getRepository(FigureTypeMapEntry).manager, domain, boardId)\n }\n\n @Directive('@privilege(category: \"figure-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, {\n description:\n 'Figures a board asks for together by full name {namespace}/{type}, answered from the type map: { items: [{ type, ref, asset }], refused: [{ type, code, message }] }.'\n })\n async figureBlueprints(\n @Arg('types', type => [String], { description: 'Full figure names {namespace}/{type}. At most 500.' }) types: string[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const { domain } = context.state\n return await blueprintsOf(getRepository(FigureTypeMapEntry).manager, domain, types, refusal => plainTextOf(refusal, context))\n }\n\n @Directive('@privilege(category: \"figure-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, {\n description:\n 'The type map lines whose release carries one extension key (ADR-0123): { items: [{ name, ref, value }], unread: [{ name, ref }] }. name is the canonical name a board draws by; unread lines are releases this server cannot read.'\n })\n async figureExtensions(\n @Arg('key', { description: 'An extension key {owner}/{name}, e.g. fmsim/carrier.' }) key: string,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const { domain } = context.state\n return await extensionsOf(getRepository(FigureTypeMapEntry).manager, domain, key)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureImportResult, { description: 'Imports a figure package into this domain library. A release newer than the one its name draws with becomes the one it draws with.' })\n async importFigurePackage(@Arg('file', () => GraphQLUpload) file: FileUpload, @Ctx() context: ResolverContext): Promise<FigureImportResult> {\n const { domain, user, tx } = context.state\n const upload = await file\n assertPackageName(upload.filename)\n return await importFigurePackage(tx, domain, user, await bytesOf(upload), upload.filename)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Chooses the imported release a full figure name draws with.' })\n async chooseFigureRelease(\n @Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string,\n @Arg('releaseId', { description: 'Id of an imported release of that name.' }) releaseId: string,\n @Ctx() context: ResolverContext\n ): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await chooseRelease(tx, domain, user, name, releaseId)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Archives a full figure name: out of the tray and the batch door, its releases kept. Refused while a board uses it.' })\n async archiveFigure(@Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string, @Ctx() context: ResolverContext): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await archiveFigure(tx, domain, user, name)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Marks a full figure name as an item this domain draws (fmsim: a carrier), or takes the mark away.' })\n async markFigureItem(\n @Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string,\n @Arg('item', { description: 'True to draw the name as an item, false to take the mark away.' }) item: boolean,\n @Ctx() context: ResolverContext\n ): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await markFigureItem(tx, domain, user, name, item)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Brings an archived full figure name back, drawing with the release its line kept.' })\n async unarchiveFigure(@Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string, @Ctx() context: ResolverContext): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await unarchiveFigure(tx, domain, user, name)\n }\n}\n"]}
1
+ {"version":3,"file":"figure-library-resolver.js","sourceRoot":"","sources":["../../server/service/figure-library-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver, UseMiddleware } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\nimport type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\n\nimport { getQueryBuilderFromListParams, getRepository, ListParam, Refusal, refusalKey, SpeakRefusals } from '@things-factory/shell'\n\nimport { FigureLibraryRelease } from './figure-library-release/figure-library-release'\nimport { FigureTypeMapEntry } from './figure-type-map/figure-type-map-entry'\nimport { FigureImportResult, FigureLibraryFacets, FigureLibraryFigureList, FigureLibraryReleaseList } from './figure-library-types'\nimport { figureFacetsOf, figuresOf, releasesOfName } from './library/figures'\nimport { blueprintsOf } from './library/blueprints'\nimport { extensionsOf } from './library/extensions'\nimport { assertPackageName, importFigurePackage } from './library/import'\nimport { boardRequirements, freshen } from './library/inspection'\nimport { chooseRelease, inUseLinesOf, unarchiveFigure, archiveFigure } from './library/type-map'\n\n/**\n * A refusal in the asker's language as plain text: a board draws it on a canvas, not into HTML, so the values in it\n * (a name with `/`) are not escaped.\n */\nfunction plainTextOf(refusal: Refusal, context: any): string {\n return context.t\n ? context.t(refusalKey(refusal.code), { ...refusal.params, defaultValue: refusal.message, interpolation: { escapeValue: false } })\n : refusal.message\n}\n\n/** The most bytes one package upload may carry. */\nconst PACKAGE_MAX_BYTES = 64 * 1024 * 1024\n\nasync function bytesOf(file: FileUpload): Promise<Buffer> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of file.createReadStream()) {\n size += chunk.length\n if (size > PACKAGE_MAX_BYTES) throw new Refusal('figure-package-too-large', { max: PACKAGE_MAX_BYTES }, 'a figure package is at most {max} bytes.')\n chunks.push(Buffer.from(chunk))\n }\n return Buffer.concat(chunks)\n}\n\n/**\n * The library and the type map of a board server (ADR-0114). Reading is `figure-library` query; changing is its\n * mutation. Boards ask `figureBlueprints` under `figure-published`, the door every figure consumer asks through.\n */\n@Resolver()\n@UseMiddleware(SpeakRefusals)\nexport class FigureLibraryResolver {\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryReleaseList, { description: 'Lists the releases imported into this domain.' })\n async figureLibraryReleases(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<FigureLibraryReleaseList> {\n const { domain, tx } = context.state\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(FigureLibraryRelease, tx),\n params,\n domain,\n alias: 'release',\n searchables: ['ref', 'name', 'description', 'category']\n })\n const [items, total] = await queryBuilder.getManyAndCount()\n const manager = tx ?? getRepository(FigureLibraryRelease).manager\n for (const item of items) await freshen(manager, item)\n return { items, total }\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryFigureList, {\n description: 'Imported figures, one per full name, with the release each draws with. Filters: category, capability (\"-\" for none), name (search), archived (true to include archived figures; left out by default), item (true for only the names drawn as items).'\n })\n async figureLibraryFigures(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<FigureLibraryFigureList> {\n const { domain } = context.state\n const value = (name: string) => {\n const found = params.filters?.find(filter => filter.name === name)?.value\n return Array.isArray(found) ? found[0] : found ?? undefined\n }\n const manager = getRepository(FigureTypeMapEntry).manager\n const result = await figuresOf(manager, domain, {\n category: value('category'),\n capability: value('capability'),\n search: value('name'),\n includeArchived: value('archived') === true || value('archived') === 'true',\n onlyItems: value('item') === true || value('item') === 'true',\n page: params.pagination?.page,\n limit: params.pagination?.limit\n })\n for (const item of result.items) {\n if (item.release) await freshen(manager, item.release)\n await freshen(manager, item.latest)\n }\n return result\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryFacets, { description: 'The categories and capabilities the figure filters offer.' })\n async figureLibraryFacets(@Ctx() context: ResolverContext): Promise<FigureLibraryFacets> {\n return await figureFacetsOf(getRepository(FigureTypeMapEntry).manager, context.state.domain)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [FigureLibraryRelease], { description: 'Every imported release of one full figure name, newest first.' })\n async figureLibraryReleasesOf(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<FigureLibraryRelease[]> {\n return await releasesOfName(getRepository(FigureLibraryRelease).manager, context.state.domain, name)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [FigureTypeMapEntry], { description: 'The type map of this domain: one line per full figure name, with the release it draws with.' })\n async figureTypeMap(@Ctx() context: ResolverContext): Promise<FigureTypeMapEntry[]> {\n const { domain } = context.state\n /* The tray reads this: an archived name is not offered (ADR-0114 결정 18). */\n return await inUseLinesOf(getRepository(FigureTypeMapEntry).manager, domain)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, { nullable: true, description: 'What one board needs from the type map: each figure, its status and node count.' })\n async figureBoardRequirements(@Arg('boardId') boardId: string, @Ctx() context: ResolverContext): Promise<any> {\n const { domain } = context.state\n return await boardRequirements(getRepository(FigureTypeMapEntry).manager, domain, boardId)\n }\n\n @Directive('@privilege(category: \"figure-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, {\n description:\n 'Figures a board asks for together by full name {namespace}/{type}, answered from the type map: { items: [{ type, ref, asset }], refused: [{ type, code, message }] }.'\n })\n async figureBlueprints(\n @Arg('types', type => [String], { description: 'Full figure names {namespace}/{type}. At most 500.' }) types: string[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const { domain } = context.state\n return await blueprintsOf(getRepository(FigureTypeMapEntry).manager, domain, types, refusal => plainTextOf(refusal, context))\n }\n\n @Directive('@privilege(category: \"figure-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, {\n description:\n 'The type map lines whose release carries one extension key (ADR-0123): { items: [{ name, ref, value }], unread: [{ name, ref }] }. name is the canonical name a board draws by; unread lines are releases this server cannot read.'\n })\n async figureExtensions(\n @Arg('key', { description: 'An extension key {owner}/{name}, e.g. fmsim/carrier.' }) key: string,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const { domain } = context.state\n return await extensionsOf(getRepository(FigureTypeMapEntry).manager, domain, key)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureImportResult, { description: 'Imports a figure package into this domain library. A release newer than the one its name draws with becomes the one it draws with.' })\n async importFigurePackage(@Arg('file', () => GraphQLUpload) file: FileUpload, @Ctx() context: ResolverContext): Promise<FigureImportResult> {\n const { domain, user, tx } = context.state\n const upload = await file\n assertPackageName(upload.filename)\n return await importFigurePackage(tx, domain, user, await bytesOf(upload), upload.filename)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Chooses the imported release a full figure name draws with.' })\n async chooseFigureRelease(\n @Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string,\n @Arg('releaseId', { description: 'Id of an imported release of that name.' }) releaseId: string,\n @Ctx() context: ResolverContext\n ): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await chooseRelease(tx, domain, user, name, releaseId)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Archives a full figure name: out of the tray and the batch door, its releases kept. Refused while a board uses it.' })\n async archiveFigure(@Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string, @Ctx() context: ResolverContext): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await archiveFigure(tx, domain, user, name)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Brings an archived full figure name back, drawing with the release its line kept.' })\n async unarchiveFigure(@Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string, @Ctx() context: ResolverContext): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await unarchiveFigure(tx, domain, user, name)\n }\n}\n"]}
@@ -96,7 +96,7 @@ tslib_1.__decorate([
96
96
  tslib_1.__metadata("design:type", Date)
97
97
  ], FigureLibraryFigure.prototype, "archivedAt", void 0);
98
98
  tslib_1.__decorate([
99
- (0, type_graphql_1.Field)({ description: 'Whether this domain draws the name as an item a holder holds (fmsim: a carrier).' }),
99
+ (0, type_graphql_1.Field)({ description: 'Whether the release in use is tagged as the look of an item a holder holds (fmsim: a carrier).' }),
100
100
  tslib_1.__metadata("design:type", Boolean)
101
101
  ], FigureLibraryFigure.prototype, "item", void 0);
102
102
  exports.FigureLibraryFigure = FigureLibraryFigure = tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"figure-library-types.js","sourceRoot":"","sources":["../../server/service/figure-library-types.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, Int, ObjectType } from 'type-graphql'\n\nimport { FigureLibraryRelease } from './figure-library-release/figure-library-release'\n\n@ObjectType({ description: 'A page of imported releases.' })\nexport class FigureLibraryReleaseList {\n @Field(type => [FigureLibraryRelease], { description: 'The releases on this page.' })\n items: FigureLibraryRelease[]\n\n @Field(type => Int, { description: 'Total number of releases matching the query.' })\n total: number\n}\n\n@ObjectType({ description: 'What became of one release of an imported package.' })\nexport class FigureImportOutcome {\n @Field({ description: 'Release reference {namespace}/{type}@{version}.' })\n ref: string\n\n @Field({ description: 'added, skipped or refused.' })\n outcome: string\n\n @Field({ nullable: true, description: 'Why it was refused, or skipped-metadata-differs.' })\n code?: string\n\n @Field(type => [String], { nullable: true, description: 'For a skipped release: the fields the package gave differently.' })\n differs?: string[]\n}\n\n@ObjectType({ description: 'A fault that refused a whole package.' })\nexport class FigureImportProblem {\n @Field({ description: 'What is wrong with the package.' })\n code: string\n\n @Field({ nullable: true, description: 'The file inside the package it concerns.' })\n path?: string\n}\n\n@ObjectType({ description: 'The result of importing a figure package.' })\nexport class FigureImportResult {\n @Field(type => [FigureImportProblem], { description: 'Faults that refused the whole package; nothing was imported when there is one.' })\n problems: FigureImportProblem[]\n\n @Field(type => [FigureImportOutcome], { description: 'What became of each release.' })\n outcomes: FigureImportOutcome[]\n}\n\n@ObjectType({ description: 'An imported figure: its full name, the release it draws with, its latest version and how many releases are imported.' })\nexport class FigureLibraryFigure {\n @Field({ description: 'Full figure name {namespace}/{type}.' })\n name: string\n\n @Field(type => FigureLibraryRelease, { nullable: true, description: 'The release this name draws with; null when none of its releases can be drawn here.' })\n release: FigureLibraryRelease | null\n\n @Field(type => FigureLibraryRelease, { description: 'The newest release imported of this name, drawable or not.' })\n latest: FigureLibraryRelease\n\n @Field(type => Int, { description: 'The newest version imported of this name.' })\n latestVersion: number\n\n @Field(type => Int, { description: 'How many releases of this name are imported.' })\n releaseCount: number\n\n @Field({ nullable: true, description: 'When the name was archived; null while in use.' })\n archivedAt?: Date | null\n\n @Field({ description: 'Whether this domain draws the name as an item a holder holds (fmsim: a carrier).' })\n item: boolean\n}\n\n@ObjectType({ description: 'A page of imported figures.' })\nexport class FigureLibraryFigureList {\n @Field(type => [FigureLibraryFigure], { description: 'The figures on this page.' })\n items: FigureLibraryFigure[]\n\n @Field(type => Int, { description: 'Total number of figures matching the query.' })\n total: number\n}\n\n@ObjectType({ description: 'What the figure filters offer.' })\nexport class FigureLibraryFacets {\n @Field(type => [String], { description: 'Categories of the releases that draw.' })\n categories: string[]\n\n @Field({ description: 'Whether a release that draws has no category.' })\n uncategorized: boolean\n\n @Field(type => [String], { description: 'Place roles (seat, grip) the releases that draw declare.' })\n capabilities: string[]\n\n @Field({ description: 'Whether a release that draws declares no place.' })\n incapable: boolean\n}\n"]}
1
+ {"version":3,"file":"figure-library-types.js","sourceRoot":"","sources":["../../server/service/figure-library-types.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, Int, ObjectType } from 'type-graphql'\n\nimport { FigureLibraryRelease } from './figure-library-release/figure-library-release'\n\n@ObjectType({ description: 'A page of imported releases.' })\nexport class FigureLibraryReleaseList {\n @Field(type => [FigureLibraryRelease], { description: 'The releases on this page.' })\n items: FigureLibraryRelease[]\n\n @Field(type => Int, { description: 'Total number of releases matching the query.' })\n total: number\n}\n\n@ObjectType({ description: 'What became of one release of an imported package.' })\nexport class FigureImportOutcome {\n @Field({ description: 'Release reference {namespace}/{type}@{version}.' })\n ref: string\n\n @Field({ description: 'added, skipped or refused.' })\n outcome: string\n\n @Field({ nullable: true, description: 'Why it was refused, or skipped-metadata-differs.' })\n code?: string\n\n @Field(type => [String], { nullable: true, description: 'For a skipped release: the fields the package gave differently.' })\n differs?: string[]\n}\n\n@ObjectType({ description: 'A fault that refused a whole package.' })\nexport class FigureImportProblem {\n @Field({ description: 'What is wrong with the package.' })\n code: string\n\n @Field({ nullable: true, description: 'The file inside the package it concerns.' })\n path?: string\n}\n\n@ObjectType({ description: 'The result of importing a figure package.' })\nexport class FigureImportResult {\n @Field(type => [FigureImportProblem], { description: 'Faults that refused the whole package; nothing was imported when there is one.' })\n problems: FigureImportProblem[]\n\n @Field(type => [FigureImportOutcome], { description: 'What became of each release.' })\n outcomes: FigureImportOutcome[]\n}\n\n@ObjectType({ description: 'An imported figure: its full name, the release it draws with, its latest version and how many releases are imported.' })\nexport class FigureLibraryFigure {\n @Field({ description: 'Full figure name {namespace}/{type}.' })\n name: string\n\n @Field(type => FigureLibraryRelease, { nullable: true, description: 'The release this name draws with; null when none of its releases can be drawn here.' })\n release: FigureLibraryRelease | null\n\n @Field(type => FigureLibraryRelease, { description: 'The newest release imported of this name, drawable or not.' })\n latest: FigureLibraryRelease\n\n @Field(type => Int, { description: 'The newest version imported of this name.' })\n latestVersion: number\n\n @Field(type => Int, { description: 'How many releases of this name are imported.' })\n releaseCount: number\n\n @Field({ nullable: true, description: 'When the name was archived; null while in use.' })\n archivedAt?: Date | null\n\n @Field({ description: 'Whether the release in use is tagged as the look of an item a holder holds (fmsim: a carrier).' })\n item: boolean\n}\n\n@ObjectType({ description: 'A page of imported figures.' })\nexport class FigureLibraryFigureList {\n @Field(type => [FigureLibraryFigure], { description: 'The figures on this page.' })\n items: FigureLibraryFigure[]\n\n @Field(type => Int, { description: 'Total number of figures matching the query.' })\n total: number\n}\n\n@ObjectType({ description: 'What the figure filters offer.' })\nexport class FigureLibraryFacets {\n @Field(type => [String], { description: 'Categories of the releases that draw.' })\n categories: string[]\n\n @Field({ description: 'Whether a release that draws has no category.' })\n uncategorized: boolean\n\n @Field(type => [String], { description: 'Place roles (seat, grip) the releases that draw declare.' })\n capabilities: string[]\n\n @Field({ description: 'Whether a release that draws declares no place.' })\n incapable: boolean\n}\n"]}
@@ -16,7 +16,6 @@ export declare class FigureTypeMapEntry {
16
16
  releaseId?: string;
17
17
  archivedAt?: Date;
18
18
  archivedBy?: User;
19
- item?: boolean;
20
19
  createdAt?: Date;
21
20
  updatedAt?: Date;
22
21
  deletedAt?: Date;
@@ -56,19 +56,8 @@ tslib_1.__decorate([
56
56
  tslib_1.__decorate([
57
57
  (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
58
58
  (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true, description: 'The user who archived it.' }),
59
- tslib_1.__metadata("design:type", auth_base_1.User
60
- /*
61
- Item (ADR-0155 개정 1 E, 2026-10-23): in this domain the name is drawn as an item a holder holds -- a carrier in
62
- fmsim. Set on the library screen; the item type table offers only these names for a look, and a modeller's palette
63
- leaves them out. Kept on the line, so a newer release of the name keeps it.
64
- */
65
- )
59
+ tslib_1.__metadata("design:type", auth_base_1.User)
66
60
  ], FigureTypeMapEntry.prototype, "archivedBy", void 0);
67
- tslib_1.__decorate([
68
- (0, typeorm_1.Column)({ default: false }),
69
- (0, type_graphql_1.Field)({ description: 'Whether this domain draws the name as an item a holder holds (fmsim: a carrier).' }),
70
- tslib_1.__metadata("design:type", Boolean)
71
- ], FigureTypeMapEntry.prototype, "item", void 0);
72
61
  tslib_1.__decorate([
73
62
  (0, typeorm_1.CreateDateColumn)(),
74
63
  (0, type_graphql_1.Field)({ nullable: true, description: 'Creation timestamp.' }),
@@ -1 +1 @@
1
- {"version":3,"file":"figure-type-map-entry.js","sourceRoot":"","sources":["../../../server/service/figure-type-map/figure-type-map-entry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain } from '@things-factory/shell'\n\nimport { FigureLibraryRelease } from '../figure-library-release/figure-library-release'\n\n/**\n * One line of a domain's type map: a full name and the imported release it draws with (ADR-0114 결정 6, amended\n * 2026-10-12). The type map is these lines, one per name; it has no releases of its own. Importing a release of a new\n * name adds its line; a newer release of a name moves the line to it; the operator may choose another imported release.\n */\n@Entity()\n@Index('ix_figure_type_map_entry_1', (entry: FigureTypeMapEntry) => [entry.domain, entry.name], {\n unique: true,\n where: '\"deleted_at\" IS NULL'\n})\n@ObjectType({ description: 'A line of the domain type map: full name {namespace}/{type} to the imported release it draws with.' })\nexport class FigureTypeMapEntry {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier.' })\n readonly id?: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain the line belongs to.' })\n domain?: Domain\n\n @RelationId((entry: FigureTypeMapEntry) => entry.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Full figure name {namespace}/{type} boards store.' })\n name: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Note on the line.' })\n description?: string\n\n @ManyToOne(type => FigureLibraryRelease)\n @Field(type => FigureLibraryRelease, { nullable: true, description: 'The imported release this name draws with.' })\n release?: FigureLibraryRelease\n\n @RelationId((entry: FigureTypeMapEntry) => entry.release)\n releaseId?: string\n\n /*\n Archived (ADR-0114 결정 18, 2026-10-22): the way a figure leaves the library. The line and its releases stay -- a\n release is never changed or deleted (결정 3) -- but the name is out of the tray, the type map and the batch door.\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When the name was archived: out of the tray and the batch door. Null while in use.' })\n archivedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who archived it.' })\n archivedBy?: User\n\n /*\n Item (ADR-0155 개정 1 E, 2026-10-23): in this domain the name is drawn as an item a holder holds -- a carrier in\n fmsim. Set on the library screen; the item type table offers only these names for a look, and a modeller's palette\n leaves them out. Kept on the line, so a newer release of the name keeps it.\n */\n @Column({ default: false })\n @Field({ description: 'Whether this domain draws the name as an item a holder holds (fmsim: a carrier).' })\n item?: boolean\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Creation timestamp.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Last update timestamp.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Soft-delete timestamp.' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who created it.' })\n creator?: User\n\n @RelationId((entry: FigureTypeMapEntry) => entry.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who last updated it.' })\n updater?: User\n\n @RelationId((entry: FigureTypeMapEntry) => entry.updater)\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"figure-type-map-entry.js","sourceRoot":"","sources":["../../../server/service/figure-type-map/figure-type-map-entry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain } from '@things-factory/shell'\n\nimport { FigureLibraryRelease } from '../figure-library-release/figure-library-release'\n\n/**\n * One line of a domain's type map: a full name and the imported release it draws with (ADR-0114 결정 6, amended\n * 2026-10-12). The type map is these lines, one per name; it has no releases of its own. Importing a release of a new\n * name adds its line; a newer release of a name moves the line to it; the operator may choose another imported release.\n */\n@Entity()\n@Index('ix_figure_type_map_entry_1', (entry: FigureTypeMapEntry) => [entry.domain, entry.name], {\n unique: true,\n where: '\"deleted_at\" IS NULL'\n})\n@ObjectType({ description: 'A line of the domain type map: full name {namespace}/{type} to the imported release it draws with.' })\nexport class FigureTypeMapEntry {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier.' })\n readonly id?: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain the line belongs to.' })\n domain?: Domain\n\n @RelationId((entry: FigureTypeMapEntry) => entry.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Full figure name {namespace}/{type} boards store.' })\n name: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Note on the line.' })\n description?: string\n\n @ManyToOne(type => FigureLibraryRelease)\n @Field(type => FigureLibraryRelease, { nullable: true, description: 'The imported release this name draws with.' })\n release?: FigureLibraryRelease\n\n @RelationId((entry: FigureTypeMapEntry) => entry.release)\n releaseId?: string\n\n /*\n Archived (ADR-0114 결정 18, 2026-10-22): the way a figure leaves the library. The line and its releases stay -- a\n release is never changed or deleted (결정 3) -- but the name is out of the tray, the type map and the batch door.\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When the name was archived: out of the tray and the batch door. Null while in use.' })\n archivedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who archived it.' })\n archivedBy?: User\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Creation timestamp.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Last update timestamp.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Soft-delete timestamp.' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who created it.' })\n creator?: User\n\n @RelationId((entry: FigureTypeMapEntry) => entry.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who last updated it.' })\n updater?: User\n\n @RelationId((entry: FigureTypeMapEntry) => entry.updater)\n updaterId?: string\n}\n"]}