@aelionsdk/project-schema 0.1.0-beta.1 → 1.1.0-rc.1

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/README.md CHANGED
@@ -1,7 +1,29 @@
1
- # @aelionsdk/project-schema
1
+ # `@aelionsdk/project-schema`
2
2
 
3
- Project v1 types, validation and canonical serialization for AelionSDK
3
+ Project v1 types, bounded admission, validation and canonical serialization for
4
+ AelionSDK.
4
5
 
5
- Install with `npm install @aelionsdk/project-schema@next`.
6
+ ## Install
6
7
 
7
- Version 0.1.0-beta.1 is a prerelease and its API may change before the first stable release. This package is part of [AelionSDK](https://github.com/FoyonaCZY/AelionSDK); see the repository README for supported browsers, examples and deployment requirements.
8
+ ```bash
9
+ npm install @aelionsdk/project-schema@next
10
+ ```
11
+
12
+ `next` currently resolves to `1.1.0-rc.1`. Use this package in importers,
13
+ services and Project tooling that must validate data without creating a browser
14
+ Session.
15
+
16
+ ## Public surface
17
+
18
+ - Project v1 TypeScript types;
19
+ - bounded plain-JSON admission;
20
+ - `ProjectValidator` and stable diagnostics;
21
+ - canonical clone and serialization helpers.
22
+
23
+ Treat every file or network Project as untrusted input. Run admission before
24
+ schema and semantic validation; never invoke accessors or iterators on
25
+ untrusted values.
26
+
27
+ See the [Project Schema reference](https://foyonaczy.github.io/AelionSDK/reference/project-schema/)
28
+ and [API reference](https://foyonaczy.github.io/AelionSDK/api/aelionsdk/project-schema/overview/).
29
+ Licensed under MIT.
@@ -0,0 +1,13 @@
1
+ import type { ImageSequenceReference } from './types.js';
2
+ /**
3
+ * Map an item time to the image-sequence frame whose interval contains it.
4
+ *
5
+ * Frames are uniform-duration and contiguous starting at zero. The mapping is
6
+ * deterministic and integer-based so preview and export agree on every frame
7
+ * boundary. Returns `undefined` when `itemTimeUs` is negative or at/after the
8
+ * last frame boundary, which callers must treat as fail-closed.
9
+ */
10
+ export declare function imageSequenceFrameIndex(sequence: ImageSequenceReference, itemTimeUs: number): number | undefined;
11
+ /** Total duration of the sequence in microseconds. */
12
+ export declare function imageSequenceDurationUs(sequence: ImageSequenceReference): number;
13
+ //# sourceMappingURL=image-sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-sequence.d.ts","sourceRoot":"","sources":["../src/image-sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,sBAAsB,EAChC,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,SAAS,CAOpB;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,CAEhF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Map an item time to the image-sequence frame whose interval contains it.
3
+ *
4
+ * Frames are uniform-duration and contiguous starting at zero. The mapping is
5
+ * deterministic and integer-based so preview and export agree on every frame
6
+ * boundary. Returns `undefined` when `itemTimeUs` is negative or at/after the
7
+ * last frame boundary, which callers must treat as fail-closed.
8
+ */
9
+ export function imageSequenceFrameIndex(sequence, itemTimeUs) {
10
+ if (!Number.isSafeInteger(itemTimeUs) || itemTimeUs < 0)
11
+ return undefined;
12
+ const frameDurationUs = sequence.frameDurationUs;
13
+ if (!Number.isSafeInteger(frameDurationUs) || frameDurationUs <= 0)
14
+ return undefined;
15
+ const index = Math.floor(itemTimeUs / frameDurationUs);
16
+ if (index < 0 || index >= sequence.frameAssetIds.length)
17
+ return undefined;
18
+ return index;
19
+ }
20
+ /** Total duration of the sequence in microseconds. */
21
+ export function imageSequenceDurationUs(sequence) {
22
+ return sequence.frameDurationUs * sequence.frameAssetIds.length;
23
+ }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './admission.js';
2
2
  export * from './canonical.js';
3
+ export * from './image-sequence.js';
3
4
  export * from './types.js';
4
5
  export * from './validate.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './admission.js';
2
2
  export * from './canonical.js';
3
+ export * from './image-sequence.js';
3
4
  export * from './types.js';
4
5
  export * from './validate.js';
package/dist/types.d.ts CHANGED
@@ -14,10 +14,49 @@ export interface ProjectSettings extends JsonObject {
14
14
  locale?: string;
15
15
  timezone?: string;
16
16
  }
17
+ /**
18
+ * Frame manifest of an `image-sequence` asset. Frames are uniform-duration
19
+ * stills; each `frameAssetIds` entry references an `image` Asset in the same
20
+ * Project. Sampling a sequence at an item time maps to the frame whose
21
+ * interval contains that time (see {@link imageSequenceFrameIndex}).
22
+ */
23
+ export interface ImageSequenceReference extends JsonObject {
24
+ /** Duration of every frame in microseconds. */
25
+ readonly frameDurationUs: number;
26
+ /** Ordered image Asset ids, one per frame, referencing `image` kind Assets. */
27
+ readonly frameAssetIds: EntityId[];
28
+ }
17
29
  export interface ProjectEntity extends JsonObject {
18
30
  id: EntityId;
19
31
  }
32
+ export interface SequenceColorFormat extends JsonObject {
33
+ width: number;
34
+ height: number;
35
+ pixelAspectRatio: Rational & JsonObject;
36
+ frameRate: Rational & JsonObject;
37
+ sampleRate: 44_100 | 48_000 | 96_000;
38
+ channelLayout: 'mono' | 'stereo' | '5.1';
39
+ workingColorSpace: 'srgb-linear' | 'display-p3-linear' | 'rec2020-linear';
40
+ /** Defaults to `bt709` for legacy Project v1 documents. */
41
+ colorPrimaries?: 'bt709' | 'display-p3' | 'bt2020';
42
+ /** Defaults to `srgb` for legacy Project v1 documents. */
43
+ transferFunction?: 'srgb' | 'gamma22' | 'pq' | 'hlg';
44
+ /** Defaults to `rgb` for the linear compositing surface. */
45
+ matrixCoefficients?: 'rgb' | 'bt709' | 'bt2020-ncl';
46
+ /** Defaults to `full` for the linear compositing surface. */
47
+ colorRange?: 'full' | 'limited';
48
+ /** Defaults to `4:4:4`; an encoder may require an explicit conversion to `4:2:0`. */
49
+ chromaSubsampling?: 'rgb' | '4:4:4' | '4:2:2' | '4:2:0';
50
+ /** Defaults to `premultiplied` inside the renderer. */
51
+ alphaMode?: 'opaque' | 'premultiplied';
52
+ /** Defaults to `none`; HDR must fail closed when it cannot be presented without conversion. */
53
+ toneMapping?: 'none' | 'bt2390' | 'reinhard';
54
+ /** Defaults to 8 for legacy Project v1 documents. */
55
+ bitDepth?: 8 | 10;
56
+ backgroundColor: JsonObject;
57
+ }
20
58
  export interface SequenceEntity extends ProjectEntity {
59
+ format: SequenceColorFormat & JsonObject;
21
60
  trackIds: EntityId[];
22
61
  transitionIds: EntityId[];
23
62
  materialInstanceIds: EntityId[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,UAAU,EAAa,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGjF,OAAO,EAAoB,KAAK,aAAa,EAAuB,MAAM,YAAY,CAAC;AAmCvF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;CACjC;AAsrBD,qBAAa,gBAAgB;;gBAGR,OAAO,EAAE,uBAAuB;IAY5C,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,wBAAwB,CAAC;CA+ClE"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,UAAU,EAAa,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGjF,OAAO,EAAoB,KAAK,aAAa,EAAuB,MAAM,YAAY,CAAC;AAmCvF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;CACjC;AAkwBD,qBAAa,gBAAgB;;gBAGR,OAAO,EAAE,uBAAuB;IAY5C,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,wBAAwB,CAAC;CAgDlE"}
package/dist/validate.js CHANGED
@@ -352,11 +352,43 @@ function validateAudioSemantics(project, diagnostics) {
352
352
  function validateColorSemantics(project, diagnostics) {
353
353
  for (const sequence of Object.values(project.sequences)) {
354
354
  const format = sequence.format;
355
- if (format.transferFunction !== 'pq' && format.transferFunction !== 'hlg')
356
- continue;
357
- if (format.workingColorSpace !== 'rec2020-linear' || format.bitDepth !== 10) {
355
+ const expectedPrimaries = format.workingColorSpace === 'display-p3-linear'
356
+ ? 'display-p3'
357
+ : format.workingColorSpace === 'rec2020-linear'
358
+ ? 'bt2020'
359
+ : 'bt709';
360
+ if (format.colorPrimaries !== undefined && format.colorPrimaries !== expectedPrimaries) {
361
+ diagnostics.push(semanticDiagnostic('PROJECT_COLOR_PRIMARIES_MISMATCH', `Sequence ${sequence.id} color primaries do not match its linear working space`, ['sequences', sequence.id, 'format', 'colorPrimaries'], sequence.id));
362
+ }
363
+ const hdr = format.transferFunction === 'pq' || format.transferFunction === 'hlg';
364
+ if (hdr && (format.workingColorSpace !== 'rec2020-linear' || format.bitDepth !== 10)) {
358
365
  diagnostics.push(semanticDiagnostic('PROJECT_HDR_FORMAT_INVALID', `HDR Sequence ${sequence.id} requires rec2020-linear working space and 10-bit output`, ['sequences', sequence.id, 'format'], sequence.id));
359
366
  }
367
+ if (format.toneMapping !== undefined && format.toneMapping !== 'none' && !hdr) {
368
+ diagnostics.push(semanticDiagnostic('PROJECT_TONE_MAPPING_INPUT_INVALID', `Sequence ${sequence.id} tone mapping requires PQ or HLG input`, ['sequences', sequence.id, 'format', 'toneMapping'], sequence.id));
369
+ }
370
+ if (format.chromaSubsampling === 'rgb' && format.matrixCoefficients !== 'rgb') {
371
+ diagnostics.push(semanticDiagnostic('PROJECT_RGB_MATRIX_INVALID', `Sequence ${sequence.id} RGB chroma requires RGB matrix coefficients`, ['sequences', sequence.id, 'format', 'matrixCoefficients'], sequence.id));
372
+ }
373
+ }
374
+ }
375
+ function validateImageSequenceReferences(project, diagnostics) {
376
+ for (const asset of Object.values(project.assets)) {
377
+ if (asset.kind !== 'image-sequence')
378
+ continue;
379
+ const sequence = asset.imageSequence;
380
+ const frameAssetIds = sequence?.frameAssetIds;
381
+ if (frameAssetIds === undefined)
382
+ continue;
383
+ frameAssetIds.forEach((frameAssetId, index) => {
384
+ const frameAsset = project.assets[frameAssetId];
385
+ if (frameAsset === undefined) {
386
+ diagnostics.push(semanticDiagnostic('PROJECT_IMAGE_SEQUENCE_FRAME_MISSING', `Image sequence ${asset.id} references missing frame Asset ${frameAssetId}`, ['assets', asset.id, 'imageSequence', 'frameAssetIds', index], asset.id));
387
+ }
388
+ else if (frameAsset.kind !== 'image') {
389
+ diagnostics.push(semanticDiagnostic('PROJECT_IMAGE_SEQUENCE_FRAME_KIND_INVALID', `Frame Asset ${frameAssetId} of image sequence ${asset.id} must be an image Asset`, ['assets', asset.id, 'imageSequence', 'frameAssetIds', index], asset.id));
390
+ }
391
+ });
360
392
  }
361
393
  }
362
394
  export class ProjectValidator {
@@ -410,6 +442,7 @@ export class ProjectValidator {
410
442
  validateTimeMappingSemantics(project, diagnostics);
411
443
  validateAudioSemantics(project, diagnostics);
412
444
  validateColorSemantics(project, diagnostics);
445
+ validateImageSequenceReferences(project, diagnostics);
413
446
  return diagnostics.diagnostics.length === 0 ? ok({ project }) : err(...diagnostics.diagnostics);
414
447
  }
415
448
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aelionsdk/project-schema",
3
- "version": "0.1.0-beta.1",
3
+ "version": "1.1.0-rc.1",
4
4
  "description": "Project v1 types, validation and canonical serialization for AelionSDK",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -27,15 +27,15 @@
27
27
  "!dist/.tsbuildinfo"
28
28
  ],
29
29
  "engines": {
30
- "node": ">=20.19"
30
+ "node": ">=24 <25"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public",
34
34
  "provenance": true
35
35
  },
36
36
  "dependencies": {
37
- "@aelionsdk/core": "0.1.0-beta.1",
38
- "ajv": "8.17.1",
37
+ "@aelionsdk/core": "1.1.0-rc.1",
38
+ "ajv": "8.18.0",
39
39
  "ajv-formats": "3.0.1"
40
40
  },
41
41
  "scripts": {