@flighthq/shape-formats 0.2.1-next.841.373388f → 0.3.0-next.1032.e2b99fc
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/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +2 -0
- package/dist/contract.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/shapeJson.d.ts +1 -1
- package/dist/shapeJson.d.ts.map +1 -1
- package/dist/shapeJson.js +19 -19
- package/dist/shapeJson.js.map +1 -1
- package/package.json +8 -4
- package/src/shapeJson.test.ts +25 -27
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
package/dist/contract.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { formatShapeJson, parseShapeJson } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { formatShapeJson, parseShapeJson } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/shapeJson.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Shape, ShapeJsonFormatOptions, ShapeJsonParseOptions } from '@flighthq/types';
|
|
1
|
+
import type { Shape, ShapeJsonFormatOptions, ShapeJsonParseOptions } from '@flighthq/types/contract';
|
|
2
2
|
export declare function formatShapeJson(shape: Readonly<Shape>, options?: Readonly<ShapeJsonFormatOptions>): string;
|
|
3
3
|
export declare function parseShapeJson(text: string, options?: Readonly<ShapeJsonParseOptions>): Shape | null;
|
|
4
4
|
//# sourceMappingURL=shapeJson.d.ts.map
|
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,
|
|
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;AAMrG,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,MAAM,CA+B1G;AAMD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,KAAK,GAAG,IAAI,CAqCpG"}
|
package/dist/shapeJson.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { createMatrix } from '@flighthq/geometry';
|
|
2
|
-
import {
|
|
1
|
+
import { createMatrix } from '@flighthq/geometry/contract';
|
|
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 losslessly. Every non-
|
|
5
|
-
// `
|
|
6
|
-
// than the live `
|
|
4
|
+
// restores losslessly. Every non-texture command round-trips exactly; `beginTextureFill`/
|
|
5
|
+
// `lineTextureStyle` textures serialize as an ordinal `ShapeTextureReference` (see the type) rather
|
|
6
|
+
// than the live `Texture`.
|
|
7
7
|
export function formatShapeJson(shape, options) {
|
|
8
8
|
const commands = shape.data.commands;
|
|
9
9
|
const entries = [];
|
|
10
|
-
let
|
|
10
|
+
let textureOrdinal = 0;
|
|
11
11
|
let i = 0;
|
|
12
12
|
while (i < commands.length) {
|
|
13
13
|
const key = commands[i];
|
|
@@ -29,9 +29,9 @@ export function formatShapeJson(shape, options) {
|
|
|
29
29
|
args.push(value);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
// The only remaining object arg in the command registry is a live
|
|
32
|
+
// The only remaining object arg in the command registry is a live Texture;
|
|
33
33
|
// it has no serializable id, so it becomes an ordinal reference resolved on parse.
|
|
34
|
-
args.push({
|
|
34
|
+
args.push({ texture: { index: textureOrdinal++ } });
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
entries.push({ key, args });
|
|
@@ -42,7 +42,7 @@ export function formatShapeJson(shape, options) {
|
|
|
42
42
|
// Restores a `Shape` from a `formatShapeJson` string by replaying each command through the matching
|
|
43
43
|
// `appendShape*` builder. Returns `null` for malformed JSON, a missing/mismatched `shapeFormat`
|
|
44
44
|
// version tag, a non-array `commands` field, a malformed command entry, an unknown command key, or a
|
|
45
|
-
// malformed argument.
|
|
45
|
+
// malformed argument. Texture-bearing commands whose reference cannot be resolved are dropped.
|
|
46
46
|
export function parseShapeJson(text, options) {
|
|
47
47
|
let root;
|
|
48
48
|
try {
|
|
@@ -58,7 +58,7 @@ export function parseShapeJson(text, options) {
|
|
|
58
58
|
const rawCommands = root.commands;
|
|
59
59
|
if (!Array.isArray(rawCommands))
|
|
60
60
|
return null;
|
|
61
|
-
const
|
|
61
|
+
const resolveTexture = options?.resolveTexture;
|
|
62
62
|
const shape = createShape();
|
|
63
63
|
for (const entry of rawCommands) {
|
|
64
64
|
if (!isPlainObject(entry))
|
|
@@ -73,7 +73,7 @@ export function parseShapeJson(text, options) {
|
|
|
73
73
|
const args = [];
|
|
74
74
|
let drop = false;
|
|
75
75
|
for (const raw of rawArgs) {
|
|
76
|
-
const reconstructed = reconstructShapeCommandArg(raw,
|
|
76
|
+
const reconstructed = reconstructShapeCommandArg(raw, resolveTexture);
|
|
77
77
|
if (reconstructed === MALFORMED_ARG)
|
|
78
78
|
return null;
|
|
79
79
|
if (reconstructed === DROP_COMMAND) {
|
|
@@ -89,8 +89,8 @@ export function parseShapeJson(text, options) {
|
|
|
89
89
|
return shape;
|
|
90
90
|
}
|
|
91
91
|
// Rebuilds a single command argument from its serialized form. Returns `MALFORMED_ARG` for an
|
|
92
|
-
// unrecognized object shape and `DROP_COMMAND` when a
|
|
93
|
-
function reconstructShapeCommandArg(value,
|
|
92
|
+
// unrecognized object shape and `DROP_COMMAND` when a texture reference cannot be resolved.
|
|
93
|
+
function reconstructShapeCommandArg(value, resolveTexture) {
|
|
94
94
|
if (value === null)
|
|
95
95
|
return null;
|
|
96
96
|
const type = typeof value;
|
|
@@ -100,8 +100,8 @@ function reconstructShapeCommandArg(value, resolveBitmap) {
|
|
|
100
100
|
return value;
|
|
101
101
|
if (!isPlainObject(value))
|
|
102
102
|
return MALFORMED_ARG;
|
|
103
|
-
if (isPlainObject(value.
|
|
104
|
-
const resolved =
|
|
103
|
+
if (isPlainObject(value.texture) && typeof value.texture.index === 'number') {
|
|
104
|
+
const resolved = resolveTexture?.({ index: value.texture.index }) ?? null;
|
|
105
105
|
return resolved === null ? DROP_COMMAND : resolved;
|
|
106
106
|
}
|
|
107
107
|
if (typeof value.a === 'number' &&
|
|
@@ -132,11 +132,11 @@ function isSerializableScalarOrArray(value) {
|
|
|
132
132
|
}
|
|
133
133
|
// Sentinel returned when a command argument is structurally invalid; parse aborts to `null`.
|
|
134
134
|
const MALFORMED_ARG = Symbol('shapeFormats.malformedArg');
|
|
135
|
-
// Sentinel returned when a
|
|
135
|
+
// Sentinel returned when a texture reference cannot be resolved; the owning command is dropped.
|
|
136
136
|
const DROP_COMMAND = Symbol('shapeFormats.dropCommand');
|
|
137
|
-
const SHAPE_JSON_FORMAT =
|
|
137
|
+
const SHAPE_JSON_FORMAT = 2;
|
|
138
138
|
const SHAPE_COMMAND_APPENDERS = {
|
|
139
|
-
|
|
139
|
+
beginTextureFill: appendShapeBeginTextureFill,
|
|
140
140
|
beginFill: appendShapeBeginFill,
|
|
141
141
|
beginGradientFill: appendShapeBeginGradientFill,
|
|
142
142
|
cubicCurveTo: appendShapeCubicCurveTo,
|
|
@@ -148,7 +148,7 @@ const SHAPE_COMMAND_APPENDERS = {
|
|
|
148
148
|
drawRoundRectangle: appendShapeRoundRectangle,
|
|
149
149
|
drawTriangles: appendShapeDrawTriangles,
|
|
150
150
|
endFill: appendShapeEndFill,
|
|
151
|
-
|
|
151
|
+
lineTextureStyle: appendShapeLineTextureStyle,
|
|
152
152
|
lineGradientStyle: appendShapeLineGradientStyle,
|
|
153
153
|
lineStyle: appendShapeLineStyle,
|
|
154
154
|
lineTo: appendShapeLineTo,
|
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,
|
|
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.3.0-next.1032.e2b99fc",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
".": {
|
|
14
14
|
"types": "./dist/index.d.ts",
|
|
15
15
|
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./contract": {
|
|
18
|
+
"types": "./dist/contract.d.ts",
|
|
19
|
+
"default": "./dist/contract.js"
|
|
16
20
|
}
|
|
17
21
|
},
|
|
18
22
|
"files": [
|
|
@@ -32,9 +36,9 @@
|
|
|
32
36
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
33
37
|
},
|
|
34
38
|
"dependencies": {
|
|
35
|
-
"@flighthq/geometry": "0.
|
|
36
|
-
"@flighthq/shape": "0.
|
|
37
|
-
"@flighthq/types": "0.
|
|
39
|
+
"@flighthq/geometry": "0.3.0-next.1032.e2b99fc",
|
|
40
|
+
"@flighthq/shape": "0.3.0-next.1032.e2b99fc",
|
|
41
|
+
"@flighthq/types": "0.3.0-next.1032.e2b99fc"
|
|
38
42
|
},
|
|
39
43
|
"devDependencies": {
|
|
40
44
|
"typescript": "^5.3.0"
|
package/src/shapeJson.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createMatrix } from '@flighthq/geometry';
|
|
1
|
+
import { createMatrix } from '@flighthq/geometry/contract';
|
|
2
2
|
import {
|
|
3
|
-
|
|
3
|
+
appendShapeBeginTextureFill,
|
|
4
4
|
appendShapeBeginFill,
|
|
5
5
|
appendShapeBeginGradientFill,
|
|
6
6
|
appendShapeCubicCurveTo,
|
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
appendShapePath,
|
|
13
13
|
createShape,
|
|
14
14
|
getShapeCommandCount,
|
|
15
|
-
} from '@flighthq/shape';
|
|
16
|
-
import type {
|
|
15
|
+
} from '@flighthq/shape/contract';
|
|
16
|
+
import type { Texture } from '@flighthq/types/contract';
|
|
17
17
|
|
|
18
18
|
import { formatShapeJson, parseShapeJson } from './shapeJson';
|
|
19
19
|
|
|
@@ -41,10 +41,10 @@ function createEveryNonBitmapCommandShape() {
|
|
|
41
41
|
return shape;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
// A minimal stand-in for a live
|
|
44
|
+
// A minimal stand-in for a live Texture; the codec never inspects texture internals, only
|
|
45
45
|
// swaps the object for an ordinal reference and back.
|
|
46
|
-
function
|
|
47
|
-
return {
|
|
46
|
+
function createFakeTexture(): Texture {
|
|
47
|
+
return {} as Texture;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
describe('formatShapeJson', () => {
|
|
@@ -52,7 +52,7 @@ describe('formatShapeJson', () => {
|
|
|
52
52
|
const shape = createShape();
|
|
53
53
|
appendShapeBeginFill(shape, 0x112233ff, 1);
|
|
54
54
|
const parsed = JSON.parse(formatShapeJson(shape));
|
|
55
|
-
expect(parsed.shapeFormat).toBe(
|
|
55
|
+
expect(parsed.shapeFormat).toBe(2);
|
|
56
56
|
expect(Array.isArray(parsed.commands)).toBe(true);
|
|
57
57
|
expect(parsed.commands[0]).toEqual({ key: 'beginFill', args: [0x112233ff, 1] });
|
|
58
58
|
});
|
|
@@ -64,14 +64,12 @@ describe('formatShapeJson', () => {
|
|
|
64
64
|
expect(parsed.commands[0].args[4]).toEqual({ a: 2, b: 0, c: 0, d: 3, tx: 5, ty: 7 });
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
-
it('serializes a
|
|
67
|
+
it('serializes a texture as an ordinal reference, never the texture', () => {
|
|
68
68
|
const shape = createShape();
|
|
69
|
-
|
|
69
|
+
appendShapeBeginTextureFill(shape, createFakeTexture(), null);
|
|
70
70
|
const parsed = JSON.parse(formatShapeJson(shape));
|
|
71
|
-
expect(parsed.commands[0].args[0]).toEqual({
|
|
71
|
+
expect(parsed.commands[0].args[0]).toEqual({ texture: { index: 0 } });
|
|
72
72
|
expect(parsed.commands[0].args[1]).toBeNull();
|
|
73
|
-
expect(parsed.commands[0].args[2]).toBe(true);
|
|
74
|
-
expect(parsed.commands[0].args[3]).toBe(false);
|
|
75
73
|
});
|
|
76
74
|
|
|
77
75
|
it('honors the space option for pretty-printing', () => {
|
|
@@ -82,7 +80,7 @@ describe('formatShapeJson', () => {
|
|
|
82
80
|
});
|
|
83
81
|
|
|
84
82
|
describe('parseShapeJson', () => {
|
|
85
|
-
it('round-trips every non-
|
|
83
|
+
it('round-trips every non-texture command losslessly', () => {
|
|
86
84
|
const shape = createEveryNonBitmapCommandShape();
|
|
87
85
|
const json = formatShapeJson(shape);
|
|
88
86
|
const restored = parseShapeJson(json);
|
|
@@ -100,7 +98,7 @@ describe('parseShapeJson', () => {
|
|
|
100
98
|
});
|
|
101
99
|
|
|
102
100
|
it('returns null for a mismatched version tag', () => {
|
|
103
|
-
expect(parseShapeJson(JSON.stringify({ shapeFormat:
|
|
101
|
+
expect(parseShapeJson(JSON.stringify({ shapeFormat: 3, commands: [] }))).toBeNull();
|
|
104
102
|
});
|
|
105
103
|
|
|
106
104
|
it('returns null when the top level is not an object', () => {
|
|
@@ -108,40 +106,40 @@ describe('parseShapeJson', () => {
|
|
|
108
106
|
});
|
|
109
107
|
|
|
110
108
|
it('returns null for an unknown command key', () => {
|
|
111
|
-
const json = JSON.stringify({ shapeFormat:
|
|
109
|
+
const json = JSON.stringify({ shapeFormat: 2, commands: [{ key: 'notACommand', args: [] }] });
|
|
112
110
|
expect(parseShapeJson(json)).toBeNull();
|
|
113
111
|
});
|
|
114
112
|
|
|
115
113
|
it('returns null for a malformed argument object', () => {
|
|
116
|
-
const json = JSON.stringify({ shapeFormat:
|
|
114
|
+
const json = JSON.stringify({ shapeFormat: 2, commands: [{ key: 'beginFill', args: [{ nonsense: true }, 1] }] });
|
|
117
115
|
expect(parseShapeJson(json)).toBeNull();
|
|
118
116
|
});
|
|
119
117
|
|
|
120
|
-
it('round-trips a bitmap fill through the resolver', () => {
|
|
121
|
-
const
|
|
118
|
+
it('round-trips a bitmap fill through the texture resolver', () => {
|
|
119
|
+
const texture = createFakeTexture();
|
|
122
120
|
const shape = createShape();
|
|
123
|
-
|
|
121
|
+
appendShapeBeginTextureFill(shape, texture, createMatrix(1, 0, 0, 1, 3, 4));
|
|
124
122
|
appendShapeMoveTo(shape, 5, 6);
|
|
125
123
|
|
|
126
124
|
const seen: number[] = [];
|
|
127
125
|
const restored = parseShapeJson(formatShapeJson(shape), {
|
|
128
|
-
|
|
126
|
+
resolveTexture: (reference) => {
|
|
129
127
|
seen.push(reference.index);
|
|
130
|
-
return
|
|
128
|
+
return texture;
|
|
131
129
|
},
|
|
132
130
|
});
|
|
133
131
|
|
|
134
132
|
expect(restored).not.toBeNull();
|
|
135
133
|
expect(seen).toEqual([0]);
|
|
136
134
|
expect(getShapeCommandCount(restored!)).toBe(2);
|
|
137
|
-
expect(restored!.data.commands[0]).toBe('
|
|
138
|
-
expect(restored!.data.commands[2]).toBe(
|
|
135
|
+
expect(restored!.data.commands[0]).toBe('beginTextureFill');
|
|
136
|
+
expect(restored!.data.commands[2]).toBe(texture);
|
|
139
137
|
});
|
|
140
138
|
|
|
141
139
|
it('drops a bitmap fill when no resolver is supplied and keeps the rest intact', () => {
|
|
142
140
|
const shape = createShape();
|
|
143
141
|
appendShapeBeginFill(shape, 0xffffffff, 1);
|
|
144
|
-
|
|
142
|
+
appendShapeBeginTextureFill(shape, createFakeTexture(), null);
|
|
145
143
|
appendShapeLineTo(shape, 9, 9);
|
|
146
144
|
|
|
147
145
|
const restored = parseShapeJson(formatShapeJson(shape));
|
|
@@ -153,10 +151,10 @@ describe('parseShapeJson', () => {
|
|
|
153
151
|
|
|
154
152
|
it('drops a bitmap fill when the resolver returns null', () => {
|
|
155
153
|
const shape = createShape();
|
|
156
|
-
|
|
154
|
+
appendShapeBeginTextureFill(shape, createFakeTexture(), null);
|
|
157
155
|
appendShapeEndFill(shape);
|
|
158
156
|
|
|
159
|
-
const restored = parseShapeJson(formatShapeJson(shape), {
|
|
157
|
+
const restored = parseShapeJson(formatShapeJson(shape), { resolveTexture: () => null });
|
|
160
158
|
expect(restored).not.toBeNull();
|
|
161
159
|
expect(getShapeCommandCount(restored!)).toBe(1);
|
|
162
160
|
expect(restored!.data.commands[0]).toBe('endFill');
|