@operato/board 10.29.27 → 10.29.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@operato/board",
3
- "version": "10.29.27",
3
+ "version": "10.29.29",
4
4
  "description": "Webcomponent for board following open-wc recommendations",
5
5
  "author": "heartyoh",
6
6
  "type": "module",
@@ -120,18 +120,18 @@
120
120
  "dependencies": {
121
121
  "@material/web": "^2.0.0",
122
122
  "@open-wc/scoped-elements": "^2.1.3",
123
- "@operato/app": "^10.29.27",
124
- "@operato/data-grist": "^10.29.27",
125
- "@operato/font": "^10.29.27",
123
+ "@operato/app": "^10.29.29",
124
+ "@operato/data-grist": "^10.29.29",
125
+ "@operato/font": "^10.29.29",
126
126
  "@operato/graphql": "^10.29.27",
127
127
  "@operato/i18n": "^10.29.27",
128
- "@operato/input": "^10.29.27",
129
- "@operato/layout": "^10.29.27",
130
- "@operato/markdown": "^10.29.23",
131
- "@operato/popup": "^10.29.27",
132
- "@operato/property-editor": "^10.29.27",
133
- "@operato/property-panel": "^10.29.27",
134
- "@operato/styles": "^10.29.23",
128
+ "@operato/input": "^10.29.29",
129
+ "@operato/layout": "^10.29.29",
130
+ "@operato/markdown": "^10.29.29",
131
+ "@operato/popup": "^10.29.29",
132
+ "@operato/property-editor": "^10.29.29",
133
+ "@operato/property-panel": "^10.29.29",
134
+ "@operato/styles": "^10.29.29",
135
135
  "@operato/utils": "^10.29.23",
136
136
  "@types/file-saver": "^2.0.4",
137
137
  "@types/sortablejs": "^1.10.7",
@@ -180,5 +180,5 @@
180
180
  "prettier --write"
181
181
  ]
182
182
  },
183
- "gitHead": "aa70087b5929f12cec0506c19f1aec0a83610a79"
183
+ "gitHead": "807f487e5ba47dac781b343133dc2603e405c845"
184
184
  }
@@ -2,14 +2,7 @@ import { expect } from '@open-wc/testing'
2
2
 
3
3
  import { Component, hasFigure, registerTypeResolver, resetFigures, resolveUnknownTypes } from '@hatiolab/things-scene'
4
4
 
5
- import {
6
- createFigureResolver,
7
- FIGURE_TYPE_MAP_CHANGED,
8
- figureMapReleaseOfPage,
9
- resetFigureMapPage,
10
- setFigureMapChoice,
11
- type FigureBlueprintsAnswer
12
- } from '../src/figure-provider.js'
5
+ import { createFigureResolver, type FigureBlueprintsAnswer } from '../src/figure-provider.js'
13
6
 
14
7
  /**
15
8
  * The path a figure takes to a board (ADR-0063 결정 2, ADR-0114): one batch question by full name.
@@ -69,24 +62,18 @@ const figureAssetOf = (type: string) => ({
69
62
  }
70
63
  })
71
64
 
72
- /** A server that answers from a table, from one map release, and records each question. */
73
- function serverOf(
74
- published: Record<string, unknown>,
75
- release: { version: number; revision: number } | null = { version: 1, revision: 1 },
76
- refusals: Record<string, string> = {}
77
- ) {
78
- const asked: { types: string[]; map: string }[] = []
79
- const state = { release }
65
+ /** A server that answers from a table and records each question. */
66
+ function serverOf(published: Record<string, unknown>, refusals: Record<string, string> = {}) {
67
+ const asked: string[][] = []
80
68
  return {
81
69
  asked,
82
- state,
83
- fetch: async (types: readonly string[], map: string): Promise<FigureBlueprintsAnswer> => {
84
- asked.push({ types: [...types], map })
70
+ fetch: async (types: readonly string[]): Promise<FigureBlueprintsAnswer> => {
71
+ asked.push([...types])
85
72
  const items = types.filter(type => published[type]).map(type => ({ type, ref: `${type}@1`, asset: published[type] }))
86
73
  const refused = types
87
74
  .filter(type => !published[type])
88
75
  .map(type => ({ type, code: 'figure-not-in-type-map', message: refusals[type] ?? `${type} is not in the type map` }))
89
- return { release: state.release, items, refused }
76
+ return { items, refused }
90
77
  }
91
78
  }
92
79
  }
@@ -96,7 +83,6 @@ const name = (label: string) => `hatiolab.com/${label}-${Math.random().toString(
96
83
  describe('figure 공급자 — 보드가 Figure 를 정식 이름으로 한 번에 묻는다', () => {
97
84
  afterEach(() => {
98
85
  resetFigures()
99
- resetFigureMapPage()
100
86
  })
101
87
 
102
88
  it('등록되지 않은 type 을 대소문자와 관계없이 한 번에 묻는다 — 이미 등록된 것은 묻지 않는다', async () => {
@@ -105,7 +91,7 @@ describe('figure 공급자 — 보드가 Figure 를 정식 이름으로 한 번
105
91
 
106
92
  await createFigureResolver(fetch)([mixer, 'rect', 'Conveyor', 'text', 'VEH_AGV_01'])
107
93
 
108
- expect(asked).to.deep.equal([{ types: [mixer, 'Conveyor', 'VEH_AGV_01'], map: 'ACTIVE' }])
94
+ expect(asked).to.deep.equal([[mixer, 'Conveyor', 'VEH_AGV_01']])
109
95
  })
110
96
 
111
97
  it('이미 등록된 이름은 묻지 않고, figure 가 그 컴포넌트를 덮지 않는다', async () => {
@@ -135,7 +121,7 @@ describe('figure 공급자 — 보드가 Figure 를 정식 이름으로 한 번
135
121
  const missing = name('missing')
136
122
  const brokenAsset = figureAssetOf(broken)
137
123
  brokenAsset.appearance = []
138
- const { fetch } = serverOf({ [good]: figureAssetOf(good), [broken]: brokenAsset }, { version: 1, revision: 1 }, { [missing]: '타입 맵에 없습니다' })
124
+ const { fetch } = serverOf({ [good]: figureAssetOf(good), [broken]: brokenAsset }, { [missing]: '타입 맵에 없습니다' })
139
125
 
140
126
  const answer = await createFigureResolver(fetch)([good, broken, missing])
141
127
 
@@ -158,60 +144,18 @@ describe('figure 공급자 — 보드가 Figure 를 정식 이름으로 한 번
158
144
  expect(message).to.contain('no route to the door')
159
145
  })
160
146
 
161
- it('★ 페이지는 처음 받은 맵 릴리스를 기억하고, 후보의 revision 이 바뀐 답은 등록하지 않는다', async () => {
147
+ it('★ 같은 페이지에서 나중에 묻는 이름도 그때 서버가 준 것으로 등록한다 — 먼저 등록한 것은 그대로다', async () => {
162
148
  const first = name('first')
163
149
  const later = name('later')
164
- const server = serverOf({ [first]: figureAssetOf(first), [later]: figureAssetOf(later) }, { version: 2, revision: 3 })
150
+ const server = serverOf({ [first]: figureAssetOf(first), [later]: figureAssetOf(later) })
165
151
  const resolver = createFigureResolver(server.fetch)
166
- setFigureMapChoice('CANDIDATE')
167
152
 
168
153
  await resolver([first])
169
- expect(figureMapReleaseOfPage()).to.deep.equal({ map: 'CANDIDATE', version: 2, revision: 3 })
154
+ await resolver([first, later])
170
155
 
171
- let changed: any = null
172
- const listen = (e: Event) => (changed = (e as CustomEvent).detail)
173
- window.addEventListener(FIGURE_TYPE_MAP_CHANGED, listen)
174
- try {
175
- server.state.release = { version: 2, revision: 4 }
176
- const answer = await resolver([later])
177
- expect(hasFigure(later)).to.equal(false)
178
- expect(answer!.refused.map(r => r.type)).to.deep.equal([later])
179
- expect(changed).to.deep.equal({ was: { map: 'CANDIDATE', version: 2, revision: 3 }, now: { map: 'CANDIDATE', version: 2, revision: 4 } })
180
- expect(figureMapReleaseOfPage()).to.deep.equal({ map: 'CANDIDATE', version: 2, revision: 3 })
181
- } finally {
182
- window.removeEventListener(FIGURE_TYPE_MAP_CHANGED, listen)
183
- }
184
- })
185
-
186
- it('★ 활성 맵과 후보 맵의 등록을 한 페이지에서 섞지 않는다', async () => {
187
- const active = name('active')
188
- const preview = name('preview')
189
- const server = serverOf({ [active]: figureAssetOf(active), [preview]: figureAssetOf(preview) }, { version: 1, revision: 1 })
190
- const resolver = createFigureResolver(server.fetch)
191
-
192
- await resolver([active])
193
- expect(figureMapReleaseOfPage()).to.deep.equal({ map: 'ACTIVE', version: 1, revision: 1 })
194
-
195
- setFigureMapChoice('CANDIDATE')
196
- const answer = await resolver([preview])
197
-
198
- expect(server.asked.map(a => a.map)).to.deep.equal(['ACTIVE', 'CANDIDATE'])
199
- expect(hasFigure(preview)).to.equal(false)
200
- expect(answer!.refused.map(r => r.type)).to.deep.equal([preview])
201
- })
202
-
203
- it('맵 릴리스가 없는 서버(저작 서버의 최신 정책)는 기억하지 않는다', async () => {
204
- const a = name('a')
205
- const b = name('b')
206
- const server = serverOf({ [a]: figureAssetOf(a), [b]: figureAssetOf(b) }, null)
207
- const resolver = createFigureResolver(server.fetch)
208
-
209
- await resolver([a])
210
- await resolver([b])
211
-
212
- expect(figureMapReleaseOfPage()).to.equal(null)
213
- expect(hasFigure(a)).to.equal(true)
214
- expect(hasFigure(b)).to.equal(true)
156
+ expect(server.asked).to.deep.equal([[first], [later]])
157
+ expect(hasFigure(first)).to.equal(true)
158
+ expect(hasFigure(later)).to.equal(true)
215
159
  })
216
160
 
217
161
  it('씬의 자리에 앉아 동작한다 — 받은 것은 그려지고 나머지는 자리표시로 남는다', async () => {