@operato/board 10.29.27 → 10.29.28
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/CHANGELOG.md +9 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +266 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +8258 -0
- package/dist/src/figure-provider.d.ts +3 -25
- package/dist/src/figure-provider.js +6 -43
- package/dist/src/figure-provider.js.map +1 -1
- package/dist/test/figure-provider.test.js +14 -53
- package/dist/test/figure-provider.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/test/figure-provider.test.ts +15 -71
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@operato/board",
|
|
3
|
-
"version": "10.29.
|
|
3
|
+
"version": "10.29.28",
|
|
4
4
|
"description": "Webcomponent for board following open-wc recommendations",
|
|
5
5
|
"author": "heartyoh",
|
|
6
6
|
"type": "module",
|
|
@@ -120,17 +120,17 @@
|
|
|
120
120
|
"dependencies": {
|
|
121
121
|
"@material/web": "^2.0.0",
|
|
122
122
|
"@open-wc/scoped-elements": "^2.1.3",
|
|
123
|
-
"@operato/app": "^10.29.
|
|
124
|
-
"@operato/data-grist": "^10.29.
|
|
125
|
-
"@operato/font": "^10.29.
|
|
123
|
+
"@operato/app": "^10.29.28",
|
|
124
|
+
"@operato/data-grist": "^10.29.28",
|
|
125
|
+
"@operato/font": "^10.29.28",
|
|
126
126
|
"@operato/graphql": "^10.29.27",
|
|
127
127
|
"@operato/i18n": "^10.29.27",
|
|
128
|
-
"@operato/input": "^10.29.
|
|
128
|
+
"@operato/input": "^10.29.28",
|
|
129
129
|
"@operato/layout": "^10.29.27",
|
|
130
130
|
"@operato/markdown": "^10.29.23",
|
|
131
131
|
"@operato/popup": "^10.29.27",
|
|
132
|
-
"@operato/property-editor": "^10.29.
|
|
133
|
-
"@operato/property-panel": "^10.29.
|
|
132
|
+
"@operato/property-editor": "^10.29.28",
|
|
133
|
+
"@operato/property-panel": "^10.29.28",
|
|
134
134
|
"@operato/styles": "^10.29.23",
|
|
135
135
|
"@operato/utils": "^10.29.23",
|
|
136
136
|
"@types/file-saver": "^2.0.4",
|
|
@@ -180,5 +180,5 @@
|
|
|
180
180
|
"prettier --write"
|
|
181
181
|
]
|
|
182
182
|
},
|
|
183
|
-
"gitHead": "
|
|
183
|
+
"gitHead": "cf6d84547fbf6a32a315c08f85c4dfc35a30d4a5"
|
|
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
|
|
73
|
-
function serverOf(
|
|
74
|
-
|
|
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
|
-
|
|
83
|
-
|
|
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 {
|
|
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([
|
|
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 }, {
|
|
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('★
|
|
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) }
|
|
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
|
-
|
|
154
|
+
await resolver([first, later])
|
|
170
155
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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 () => {
|