@flighthq/shape-formats 0.3.1-next.975.01aea94 → 0.4.0-edge.1908.751021c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/shapeJson.d.ts.map +1 -1
- package/dist/shapeJson.js +20 -13
- package/dist/shapeJson.js.map +1 -1
- package/package.json +4 -4
- package/src/shapeJson.test.ts +58 -6
package/dist/shapeJson.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shapeJson.d.ts","sourceRoot":"","sources":["../src/shapeJson.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"shapeJson.d.ts","sourceRoot":"","sources":["../src/shapeJson.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAOrG,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,MAAM,CAmC1G;AASD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,KAAK,GAAG,IAAI,CAsCpG"}
|
package/dist/shapeJson.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { createMatrix } from '@flighthq/geometry/contract';
|
|
2
2
|
import { appendShapeBeginTextureFill, appendShapeBeginFill, appendShapeBeginGradientFill, appendShapeCircle, appendShapeCubicCurveTo, appendShapeCurveTo, appendShapeDrawTriangles, appendShapeEllipse, appendShapeEndFill, appendShapeLineTextureStyle, appendShapeLineGradientStyle, appendShapeLineStyle, appendShapeLineTo, appendShapeMoveTo, appendShapePath, appendShapeRectangle, appendShapeRoundRectangle, createShape, } from '@flighthq/shape/contract';
|
|
3
3
|
// Serializes a shape's full drawing-command stream to a native JSON string that `parseShapeJson`
|
|
4
|
-
// restores. Every
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// serialize as an ordinal `ShapeTextureReference` (see the type) rather than the live `Texture`.
|
|
4
|
+
// restores. Every stored command is checked against the same positional and finiteness predicates the
|
|
5
|
+
// reader uses before anything is emitted: a writer that can produce a document its own reader rejects
|
|
6
|
+
// has broken the format's round-trip contract. `beginTextureFill`/`lineTextureStyle` textures serialize
|
|
7
|
+
// as an ordinal `ShapeTextureReference` (see the type) rather than the live `Texture`.
|
|
9
8
|
export function formatShapeJson(shape, options) {
|
|
10
9
|
const commands = shape.data.commands;
|
|
11
10
|
const entries = [];
|
|
@@ -15,9 +14,13 @@ export function formatShapeJson(shape, options) {
|
|
|
15
14
|
const key = commands[i];
|
|
16
15
|
const argCount = commands[i + 1];
|
|
17
16
|
const base = i + 2;
|
|
17
|
+
const commandArgs = commands.slice(base, base + argCount);
|
|
18
|
+
if (!isValidShapeCommandArgs(key, commandArgs)) {
|
|
19
|
+
throw new TypeError(`Shape command "${key}" cannot be represented as shape JSON`);
|
|
20
|
+
}
|
|
18
21
|
const args = [];
|
|
19
22
|
for (let a = 0; a < argCount; a++) {
|
|
20
|
-
const value =
|
|
23
|
+
const value = commandArgs[a];
|
|
21
24
|
if (value === null) {
|
|
22
25
|
// An omitted fill/line matrix, or absent triangle indices/uv data.
|
|
23
26
|
args.push(null);
|
|
@@ -111,12 +114,7 @@ function reconstructShapeCommandArg(value, resolveTexture) {
|
|
|
111
114
|
const resolved = resolveTexture?.({ index: value.texture.index }) ?? null;
|
|
112
115
|
return resolved === null ? DROP_COMMAND : resolved;
|
|
113
116
|
}
|
|
114
|
-
if (
|
|
115
|
-
typeof value.b === 'number' &&
|
|
116
|
-
typeof value.c === 'number' &&
|
|
117
|
-
typeof value.d === 'number' &&
|
|
118
|
-
typeof value.tx === 'number' &&
|
|
119
|
-
typeof value.ty === 'number') {
|
|
117
|
+
if (isMatrixValue(value)) {
|
|
120
118
|
return createMatrix(value.a, value.b, value.c, value.d, value.tx, value.ty);
|
|
121
119
|
}
|
|
122
120
|
return MALFORMED_ARG;
|
|
@@ -176,6 +174,15 @@ function isFiniteNumberArray(value) {
|
|
|
176
174
|
return true;
|
|
177
175
|
}
|
|
178
176
|
function isMatrixValue(value) {
|
|
177
|
+
return (isMatrixLike(value) &&
|
|
178
|
+
Number.isFinite(value.a) &&
|
|
179
|
+
Number.isFinite(value.b) &&
|
|
180
|
+
Number.isFinite(value.c) &&
|
|
181
|
+
Number.isFinite(value.d) &&
|
|
182
|
+
Number.isFinite(value.tx) &&
|
|
183
|
+
Number.isFinite(value.ty));
|
|
184
|
+
}
|
|
185
|
+
function isMatrixLike(value) {
|
|
179
186
|
return (isPlainObject(value) &&
|
|
180
187
|
typeof value.a === 'number' &&
|
|
181
188
|
typeof value.b === 'number' &&
|
|
@@ -195,7 +202,7 @@ function isSerializableScalarOrArray(value) {
|
|
|
195
202
|
const MALFORMED_ARG = Symbol('shapeFormats.malformedArg');
|
|
196
203
|
// Sentinel returned when a texture reference cannot be resolved; the owning command is dropped.
|
|
197
204
|
const DROP_COMMAND = Symbol('shapeFormats.dropCommand');
|
|
198
|
-
const SHAPE_JSON_FORMAT =
|
|
205
|
+
const SHAPE_JSON_FORMAT = 3;
|
|
199
206
|
const GRADIENT_ARG_SPEC = {
|
|
200
207
|
required: 4,
|
|
201
208
|
types: ['string', 'numbers', 'numbers', 'numbers', 'matrixOrNull', 'string', 'string', 'number'],
|
package/dist/shapeJson.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shapeJson.js","sourceRoot":"","sources":["../src/shapeJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,EACpB,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,EAC5B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EACzB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,iGAAiG;AACjG,
|
|
1
|
+
{"version":3,"file":"shapeJson.js","sourceRoot":"","sources":["../src/shapeJson.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/shape-formats",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0-edge.1908.751021c",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/geometry": "0.
|
|
42
|
-
"@flighthq/shape": "0.
|
|
43
|
-
"@flighthq/types": "0.
|
|
41
|
+
"@flighthq/geometry": "0.4.0-edge.1908.751021c",
|
|
42
|
+
"@flighthq/shape": "0.4.0-edge.1908.751021c",
|
|
43
|
+
"@flighthq/types": "0.4.0-edge.1908.751021c"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"typescript": "^5.3.0"
|
package/src/shapeJson.test.ts
CHANGED
|
@@ -76,18 +76,46 @@ describe('formatShapeJson', () => {
|
|
|
76
76
|
const shape = createShape();
|
|
77
77
|
appendShapeBeginFill(shape, 0x112233ff, 1);
|
|
78
78
|
const parsed = JSON.parse(formatShapeJson(shape));
|
|
79
|
-
expect(parsed.shapeFormat).toBe(
|
|
79
|
+
expect(parsed.shapeFormat).toBe(3);
|
|
80
80
|
expect(Array.isArray(parsed.commands)).toBe(true);
|
|
81
81
|
expect(parsed.commands[0]).toEqual({ key: 'beginFill', args: [0x112233ff, 1] });
|
|
82
82
|
});
|
|
83
83
|
|
|
84
84
|
it('serializes a matrix argument as its {a,b,c,d,tx,ty} fields', () => {
|
|
85
85
|
const shape = createShape();
|
|
86
|
-
appendShapeBeginGradientFill(
|
|
86
|
+
appendShapeBeginGradientFill(
|
|
87
|
+
shape,
|
|
88
|
+
'radial',
|
|
89
|
+
[0x000000ff],
|
|
90
|
+
[1],
|
|
91
|
+
[0],
|
|
92
|
+
createMatrix(2, 0, 0, 3, 5, 7),
|
|
93
|
+
'pad',
|
|
94
|
+
'rgb',
|
|
95
|
+
0,
|
|
96
|
+
);
|
|
87
97
|
const parsed = JSON.parse(formatShapeJson(shape));
|
|
88
98
|
expect(parsed.commands[0].args[4]).toEqual({ a: 2, b: 0, c: 0, d: 3, tx: 5, ty: 7 });
|
|
89
99
|
});
|
|
90
100
|
|
|
101
|
+
it.each(['a', 'b', 'c', 'd', 'tx', 'ty'] as const)(
|
|
102
|
+
'round-trips a large finite %s matrix field and refuses a non-finite one',
|
|
103
|
+
(field) => {
|
|
104
|
+
const shape = createShape();
|
|
105
|
+
const matrix = createMatrix(2, 0, 0, 3, 5, 7);
|
|
106
|
+
matrix[field] = 1e308;
|
|
107
|
+
appendShapeBeginGradientFill(shape, 'radial', [0x000000ff], [1], [0], matrix, 'pad', 'rgb', 0);
|
|
108
|
+
|
|
109
|
+
const text = formatShapeJson(shape);
|
|
110
|
+
const restored = parseShapeJson(text);
|
|
111
|
+
expect(restored).not.toBeNull();
|
|
112
|
+
expect(formatShapeJson(restored!)).toBe(text);
|
|
113
|
+
|
|
114
|
+
matrix[field] = Infinity;
|
|
115
|
+
expect(() => formatShapeJson(shape)).toThrow(TypeError);
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
|
|
91
119
|
it('serializes a texture as an ordinal reference, never the texture', () => {
|
|
92
120
|
const shape = createShape();
|
|
93
121
|
appendShapeBeginTextureFill(shape, createFakeTexture(), null);
|
|
@@ -122,7 +150,7 @@ describe('parseShapeJson', () => {
|
|
|
122
150
|
});
|
|
123
151
|
|
|
124
152
|
it('returns null for a mismatched version tag', () => {
|
|
125
|
-
expect(parseShapeJson(JSON.stringify({ shapeFormat:
|
|
153
|
+
expect(parseShapeJson(JSON.stringify({ shapeFormat: 999, commands: [] }))).toBeNull();
|
|
126
154
|
});
|
|
127
155
|
|
|
128
156
|
it('returns null when the top level is not an object', () => {
|
|
@@ -130,12 +158,12 @@ describe('parseShapeJson', () => {
|
|
|
130
158
|
});
|
|
131
159
|
|
|
132
160
|
it('returns null for an unknown command key', () => {
|
|
133
|
-
const json = JSON.stringify({ shapeFormat:
|
|
161
|
+
const json = JSON.stringify({ shapeFormat: 3, commands: [{ key: 'notACommand', args: [] }] });
|
|
134
162
|
expect(parseShapeJson(json)).toBeNull();
|
|
135
163
|
});
|
|
136
164
|
|
|
137
165
|
it('returns null for a malformed argument object', () => {
|
|
138
|
-
const json = JSON.stringify({ shapeFormat:
|
|
166
|
+
const json = JSON.stringify({ shapeFormat: 3, commands: [{ key: 'beginFill', args: [{ nonsense: true }, 1] }] });
|
|
139
167
|
expect(parseShapeJson(json)).toBeNull();
|
|
140
168
|
});
|
|
141
169
|
|
|
@@ -187,7 +215,7 @@ describe('parseShapeJson', () => {
|
|
|
187
215
|
|
|
188
216
|
describe('parseShapeJson argument validation', () => {
|
|
189
217
|
function document(commands: readonly unknown[]): string {
|
|
190
|
-
return JSON.stringify({ shapeFormat:
|
|
218
|
+
return JSON.stringify({ shapeFormat: 3, commands });
|
|
191
219
|
}
|
|
192
220
|
|
|
193
221
|
// Every rejection below used to build a Shape instead. The parser checked that an entry looked like
|
|
@@ -259,6 +287,30 @@ describe('parseShapeJson argument validation', () => {
|
|
|
259
287
|
).toBeNull();
|
|
260
288
|
});
|
|
261
289
|
|
|
290
|
+
it.each(['a', 'b', 'c', 'd', 'tx', 'ty'])('rejects a non-finite %s matrix field', (field) => {
|
|
291
|
+
const values: Record<string, string> = { a: '1', b: '0', c: '0', d: '1', tx: '2', ty: '3' };
|
|
292
|
+
values[field] = '1e999';
|
|
293
|
+
const matrix = `{${Object.entries(values)
|
|
294
|
+
.map(([key, value]) => `"${key}":${value}`)
|
|
295
|
+
.join(',')}}`;
|
|
296
|
+
const text =
|
|
297
|
+
`{"shapeFormat":2,"commands":[{"key":"beginGradientFill","args":` +
|
|
298
|
+
`["linear",[1],[1],[0],${matrix},"pad","rgb",0]}]}`;
|
|
299
|
+
|
|
300
|
+
expect(parseShapeJson(text)).toBeNull();
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('rejects a matrix field serialized from Infinity to null', () => {
|
|
304
|
+
const text = document([
|
|
305
|
+
{
|
|
306
|
+
key: 'beginGradientFill',
|
|
307
|
+
args: ['linear', [1], [1], [0], { a: Infinity, b: 0, c: 0, d: 1, tx: 2, ty: 3 }, 'pad', 'rgb', 0],
|
|
308
|
+
},
|
|
309
|
+
]);
|
|
310
|
+
expect(text).toContain('"a":null');
|
|
311
|
+
expect(parseShapeJson(text)).toBeNull();
|
|
312
|
+
});
|
|
313
|
+
|
|
262
314
|
// A texture command still drops rather than failing the parse: an unresolved reference is a missing
|
|
263
315
|
// asset, not a malformed document, and that distinction predates this validation.
|
|
264
316
|
it('drops rather than rejects a texture command whose reference does not resolve', () => {
|