@kumwe/studio-media 0.1.0-alpha.7 → 0.1.0-beta.3
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 +11 -1
- package/THIRD_PARTY_NOTICES.md +9 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/media-field.d.ts +56 -0
- package/dist/media-field.d.ts.map +1 -0
- package/dist/media-field.js +1 -0
- package/dist/media-library.js +1 -93
- package/dist/upload-controller.js +1 -196
- package/dist/upload-policy.js +1 -71
- package/dist/validate-media-reference.js +1 -24
- package/package.json +5 -3
- package/dist/index.js.map +0 -1
- package/dist/media-library.js.map +0 -1
- package/dist/upload-controller.js.map +0 -1
- package/dist/upload-policy.js.map +0 -1
- package/dist/validate-media-reference.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# `@kumwe/studio-media`
|
|
2
2
|
|
|
3
|
-
Status: pre-Gate-A
|
|
3
|
+
Status: governed beta development, still pre-Gate-A and not production-supported. The exact coordinated
|
|
4
|
+
version is in the workspace `studio-release.json`; this package supplies orchestration primitives, not a
|
|
5
|
+
production media backend.
|
|
4
6
|
|
|
5
7
|
Host-neutral media orchestration. Hosts provide authentication, storage, upload, processing, and
|
|
6
8
|
authorization through this package's runtime `MediaProvider`; the package supplies cancellation-safe
|
|
@@ -10,6 +12,14 @@ Studio artifacts store the protocol's usage-specific `MediaReference`, while `Me
|
|
|
10
12
|
host's library projection. URLs are delivery details returned by the receiving host and belong in
|
|
11
13
|
neither persisted contract.
|
|
12
14
|
|
|
15
|
+
`StudioMediaFieldController` provides the reusable browse/search/page/select/replace and
|
|
16
|
+
paste/drop/upload workflow, including progress, cancel/retry, alternative text, decorative mode,
|
|
17
|
+
caption, focal point, rendition intent, and orphan recovery. Inject a `MediaProvider` and, for
|
|
18
|
+
host-authorized chunked uploads, a `MediaUploadTransport`. Dynamic host bindings are read-only.
|
|
19
|
+
|
|
20
|
+
The controller's observable value contains only the stable `MediaReference`; asset projections,
|
|
21
|
+
bytes, paths, delivery URLs, credentials, and upload grants never enter the artifact.
|
|
22
|
+
|
|
13
23
|
## Upload orchestration
|
|
14
24
|
|
|
15
25
|
`MediaUploadController` drives the canonical media-upload-session state machine —
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/generate-third-party-notices.mjs. Do not edit by hand. -->
|
|
4
|
+
|
|
5
|
+
Package: `@kumwe/studio-media`
|
|
6
|
+
|
|
7
|
+
Production closure SHA-256: `4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945`
|
|
8
|
+
|
|
9
|
+
This package has no third-party runtime dependencies.
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { MediaLibrary, MEDIA_PROVIDER_FAILURE, selectBestRendition, type MediaLi
|
|
|
2
2
|
export { MediaUploadController, MEDIA_UPLOAD_FAILURE, MEDIA_UPLOAD_TOO_LARGE, type MediaUploadChunk, type MediaUploadControllerOptions, type MediaUploadListener, type MediaUploadTransport, } from './upload-controller.js';
|
|
3
3
|
export { evaluateUploadPolicy, planFromPolicy, type MediaUploadPolicy, type MediaUploadPolicyDecision, } from './upload-policy.js';
|
|
4
4
|
export { validateMediaReference } from './validate-media-reference.js';
|
|
5
|
+
export { StudioMediaFieldController, type StudioMediaFieldListener, type StudioMediaFieldOptions, type StudioMediaFieldState, type StudioMediaFieldStatus, } from './media-field.js';
|
|
5
6
|
//# 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,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EACL,0BAA0B,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
export { MediaUploadController, MEDIA_UPLOAD_FAILURE, MEDIA_UPLOAD_TOO_LARGE, } from './upload-controller.js';
|
|
3
|
-
export { evaluateUploadPolicy, planFromPolicy, } from './upload-policy.js';
|
|
4
|
-
export { validateMediaReference } from './validate-media-reference.js';
|
|
5
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export{MediaLibrary,MEDIA_PROVIDER_FAILURE,selectBestRendition}from"./media-library.js";export{MediaUploadController,MEDIA_UPLOAD_FAILURE,MEDIA_UPLOAD_TOO_LARGE}from"./upload-controller.js";export{evaluateUploadPolicy,planFromPolicy}from"./upload-policy.js";export{validateMediaReference}from"./validate-media-reference.js";export{StudioMediaFieldController}from"./media-field.js";
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type FieldBinding, type MediaAsset, type MediaReference, type MediaRenditionIntent, type MediaUploadSession, type StudioDiagnostic } from '@kumwe/studio-protocol';
|
|
2
|
+
import { type MediaLibraryState, type MediaProvider } from './media-library.js';
|
|
3
|
+
import { type MediaUploadTransport } from './upload-controller.js';
|
|
4
|
+
export interface StudioMediaFieldOptions {
|
|
5
|
+
binding?: FieldBinding;
|
|
6
|
+
mediaTypes?: string[];
|
|
7
|
+
onChange?: (state: StudioMediaFieldState) => void;
|
|
8
|
+
provider: MediaProvider;
|
|
9
|
+
readOnly?: boolean;
|
|
10
|
+
uploadTransport?: MediaUploadTransport;
|
|
11
|
+
usage: `${string}/${string}`;
|
|
12
|
+
value?: MediaReference;
|
|
13
|
+
}
|
|
14
|
+
export type StudioMediaFieldStatus = 'browsing' | 'empty' | 'error' | 'orphaned' | 'ready' | 'uploading';
|
|
15
|
+
export interface StudioMediaFieldState {
|
|
16
|
+
asset?: MediaAsset;
|
|
17
|
+
diagnostics: StudioDiagnostic[];
|
|
18
|
+
library: MediaLibraryState;
|
|
19
|
+
readOnly: boolean;
|
|
20
|
+
status: StudioMediaFieldStatus;
|
|
21
|
+
upload?: MediaUploadSession;
|
|
22
|
+
value?: MediaReference;
|
|
23
|
+
}
|
|
24
|
+
export type StudioMediaFieldListener = (state: StudioMediaFieldState) => void;
|
|
25
|
+
/**
|
|
26
|
+
* Host-neutral media-field state machine. It coordinates the complete author
|
|
27
|
+
* journey while persisting only a canonical MediaReference — never bytes,
|
|
28
|
+
* delivery URLs, upload grants, Editor state, or catalogue projections.
|
|
29
|
+
*/
|
|
30
|
+
export declare class StudioMediaFieldController {
|
|
31
|
+
#private;
|
|
32
|
+
constructor(options: StudioMediaFieldOptions);
|
|
33
|
+
get state(): StudioMediaFieldState;
|
|
34
|
+
cancelUpload(): void;
|
|
35
|
+
clear(): void;
|
|
36
|
+
dispose(): void;
|
|
37
|
+
drop(files: FileList | readonly File[]): Promise<StudioMediaFieldState>;
|
|
38
|
+
loadNext(): Promise<StudioMediaFieldState>;
|
|
39
|
+
open(): Promise<StudioMediaFieldState>;
|
|
40
|
+
paste(items: DataTransferItemList | readonly DataTransferItem[]): Promise<StudioMediaFieldState>;
|
|
41
|
+
resolve(): Promise<StudioMediaFieldState>;
|
|
42
|
+
retryUpload(): Promise<StudioMediaFieldState>;
|
|
43
|
+
search(search: string): Promise<StudioMediaFieldState>;
|
|
44
|
+
select(asset: MediaAsset): void;
|
|
45
|
+
setAltText(altText: string): void;
|
|
46
|
+
setCaption(caption: string | undefined): void;
|
|
47
|
+
setDecorative(decorative: boolean): void;
|
|
48
|
+
setFocalPoint(point: {
|
|
49
|
+
x: number;
|
|
50
|
+
y: number;
|
|
51
|
+
} | undefined): void;
|
|
52
|
+
setRenditionIntent(intent: MediaRenditionIntent | undefined): void;
|
|
53
|
+
subscribe(listener: StudioMediaFieldListener): () => void;
|
|
54
|
+
upload(file: File): Promise<StudioMediaFieldState>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=media-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-field.d.ts","sourceRoot":"","sources":["../src/media-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAgB,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG1F,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,KAAK,EAAE,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,MAAM,sBAAsB,GAChC,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC;AAEtE,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAE9E;;;;GAIG;AACH,qBAAa,0BAA0B;;gBAelB,OAAO,EAAE,uBAAuB;IAkCnD,IAAW,KAAK,IAAI,qBAAqB,CAWxC;IAEM,YAAY,IAAI,IAAI;IAKpB,KAAK,IAAI,IAAI;IAQb,OAAO,IAAI,IAAI;IAKT,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,IAAI,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIvE,QAAQ,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAM1C,IAAI,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAItC,KAAK,CAChB,KAAK,EAAE,oBAAoB,GAAG,SAAS,gBAAgB,EAAE,GACxD,OAAO,CAAC,qBAAqB,CAAC;IAQpB,OAAO,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAqBzC,WAAW,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAQ7C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAU5D,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAqB/B,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAajC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAa7C,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAexC,aAAa,CAAC,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,GAAG,IAAI;IAWhE,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,SAAS,GAAG,IAAI;IAWlE,SAAS,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,IAAI;IAQnD,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC;CA6DhE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{STUDIO_CONTRACT_VERSION as e}from"@kumwe/studio-protocol";import{MediaLibrary as t}from"./media-library.js";import{MediaUploadController as n}from"./upload-controller.js";import{validateMediaReference as r}from"./validate-media-reference.js";export class StudioMediaFieldController{#library;#listeners=new Set;#mediaTypes;#onChange;#provider;#readOnly;#upload;#usage;#asset;#libraryState={assets:[],status:`idle`};#status;#uploadState;#value;constructor(e){this.#provider=e.provider,this.#usage=e.usage,this.#mediaTypes=e.mediaTypes===void 0?void 0:[...e.mediaTypes],this.#onChange=e.onChange,this.#readOnly=e.readOnly===!0||e.binding!==void 0&&e.binding.source.kind!==`static-value`,this.#value=e.value===void 0?void 0:structuredClone(e.value),this.#upload=e.uploadTransport===void 0?void 0:new n(e.uploadTransport),this.#status=this.#value===void 0?`empty`:`browsing`,this.#library=new t(e.provider),this.#library.subscribe(e=>{this.#libraryState=e,e.status===`error`&&(this.#status=`error`),this.#emit(!1)}),this.#upload!==void 0&&this.#upload.subscribe(e=>{this.#uploadState=e,this.#status=e.state===`failed`?`error`:e.state===`complete`?`browsing`:`uploading`,this.#emit(!1)})}get state(){let e={diagnostics:this.#value===void 0?[]:r(this.#value),library:structuredClone(this.#libraryState),readOnly:this.#readOnly,status:this.#status};return this.#asset!==void 0&&(e.asset=structuredClone(this.#asset)),this.#uploadState!==void 0&&(e.upload=structuredClone(this.#uploadState)),this.#value!==void 0&&(e.value=structuredClone(this.#value)),e}cancelUpload(){this.#assertMutable(),this.#upload?.cancel()}clear(){this.#assertMutable(),this.#asset=void 0,this.#value=void 0,this.#status=`empty`,this.#emit(!0)}dispose(){this.#library.dispose(),this.#listeners.clear()}async drop(e){return this.#uploadFiles([...e])}async loadNext(){return this.#status=`browsing`,await this.#library.loadNext(),this.state}async open(){return this.search(``)}async paste(e){let t=[...e].filter(e=>e.kind===`file`).map(e=>e.getAsFile()).filter(e=>e!==null);return this.#uploadFiles(t)}async resolve(){if(this.#value===void 0)return this.state;this.#status=`browsing`,this.#emit(!1);try{let e=await this.#provider.get(this.#value.assetId);e===null?(this.#asset=void 0,this.#status=`orphaned`):(this.#asset=e,this.#status=e.state===`rejected`||e.state===`quarantined`?`error`:`ready`)}catch{this.#status=`error`}return this.#emit(!1),this.state}async retryUpload(){if(this.#assertMutable(),this.#upload===void 0)throw Error(`This media field has no upload transport.`);let e=await this.#upload.retry();return await this.#acceptCompletedUpload(e),this.state}async search(e){return this.#status=`browsing`,await this.#library.search({limit:40,...this.#mediaTypes===void 0?{}:{mediaTypes:this.#mediaTypes},...e.trim().length===0?{}:{search:e.trim().slice(0,500)}}),this.state}select(t){this.#assertMutable(),this.#asset=structuredClone(t);let n=t.metadata.altText?.trim();this.#value={accessibility:{altText:n===void 0||n.length===0?t.filename:n,...t.metadata.caption===void 0?{}:{caption:t.metadata.caption},mode:`informative`},assetId:t.id,assetRevision:t.revision,contractVersion:e,kind:`media-reference`,usage:this.#usage},this.#status=t.state===`ready`?`ready`:t.state===`processing`?`uploading`:`error`,this.#emit(!0)}setAltText(e){this.#assertMutable();let t=this.#requireValue(),n=t.accessibility.mode===`informative`?t.accessibility.caption:void 0;t.accessibility={altText:e.trim().slice(0,5e3),...n===void 0?{}:{caption:n},mode:`informative`},this.#emit(!0)}setCaption(e){this.#assertMutable();let t=this.#requireValue();t.accessibility.mode===`informative`&&(t.accessibility={...t.accessibility,...e===void 0||e.length===0?{}:{caption:e.slice(0,2e4)}},this.#emit(!0))}setDecorative(e){this.#assertMutable();let t=this.#requireValue();if(e)t.accessibility={mode:`decorative`};else{let e=this.#asset?.metadata.altText?.trim()??``,n=this.#asset?.filename??``;t.accessibility={altText:e.length>0?e:n.length>0?n:`Media`,mode:`informative`}}this.#emit(!0)}setFocalPoint(e){this.#assertMutable();let t=this.#requireValue();e===void 0?delete t.focalPoint:t.focalPoint={x:i(e.x),y:i(e.y)},this.#emit(!0)}setRenditionIntent(e){this.#assertMutable();let t=this.#requireValue();e===void 0?delete t.renditionIntent:t.renditionIntent=structuredClone(e),this.#emit(!0)}subscribe(e){return this.#listeners.add(e),e(this.state),()=>{this.#listeners.delete(e)}}async upload(e){return this.#uploadFiles([e])}#assertMutable(){if(this.#readOnly)throw Error(`Dynamic and read-only media fields cannot be mutated.`)}async#acceptCompletedUpload(t){if(t.state!==`complete`||t.asset===void 0)return;let n=await this.#provider.get(t.asset.id);if(n===null){this.#value={accessibility:{altText:t.request.filename,mode:`informative`},assetId:t.asset.id,assetRevision:t.asset.revision,contractVersion:e,kind:`media-reference`,usage:this.#usage},this.#asset=void 0,this.#status=`orphaned`,this.#emit(!0);return}this.select(n)}#emit(e){let t=this.state;e&&this.#onChange?.(t);for(let e of this.#listeners)e(t)}#requireValue(){if(this.#value===void 0)throw Error(`Select media before editing its usage.`);return this.#value}async#uploadFiles(e){this.#assertMutable();let t=e[0];if(t===void 0)return this.state;if(this.#mediaTypes!==void 0&&!this.#mediaTypes.includes(t.type))throw TypeError(`Media type "${t.type}" is not accepted by this field.`);if(this.#status=`uploading`,this.#emit(!1),this.#upload===void 0){let e=await this.#provider.upload({alt:t.name,file:t});return this.select(e),this.state}let n=await this.#upload.upload(t,{filename:t.name,mediaType:t.type||`application/octet-stream`,purpose:this.#usage});return await this.#acceptCompletedUpload(n),this.state}}function i(e){if(!Number.isFinite(e))throw TypeError(`Focal coordinates must be finite numbers.`);return Math.max(0,Math.min(1,e))}
|
package/dist/media-library.js
CHANGED
|
@@ -1,93 +1 @@
|
|
|
1
|
-
export const MEDIA_PROVIDER_FAILURE
|
|
2
|
-
defaultMessage: 'The media library could not be loaded.',
|
|
3
|
-
key: 'studio.media/provider-failed',
|
|
4
|
-
});
|
|
5
|
-
export class MediaLibrary {
|
|
6
|
-
#listeners = new Set();
|
|
7
|
-
#provider;
|
|
8
|
-
#abortController;
|
|
9
|
-
#state = { assets: [], status: 'idle' };
|
|
10
|
-
constructor(provider) {
|
|
11
|
-
this.#provider = provider;
|
|
12
|
-
}
|
|
13
|
-
get state() {
|
|
14
|
-
return structuredClone(this.#state);
|
|
15
|
-
}
|
|
16
|
-
dispose() {
|
|
17
|
-
this.#abortController?.abort();
|
|
18
|
-
this.#listeners.clear();
|
|
19
|
-
}
|
|
20
|
-
async loadNext() {
|
|
21
|
-
if (this.#state.query === undefined || this.#state.nextCursor === undefined) {
|
|
22
|
-
return this.state;
|
|
23
|
-
}
|
|
24
|
-
return this.#load({ ...this.#state.query, cursor: this.#state.nextCursor }, [
|
|
25
|
-
...this.#state.assets,
|
|
26
|
-
]);
|
|
27
|
-
}
|
|
28
|
-
async search(query) {
|
|
29
|
-
const normalized = {
|
|
30
|
-
limit: Math.max(1, Math.min(100, Math.trunc(query.limit))),
|
|
31
|
-
};
|
|
32
|
-
if (query.mediaTypes !== undefined) {
|
|
33
|
-
normalized.mediaTypes = [...query.mediaTypes];
|
|
34
|
-
}
|
|
35
|
-
if (query.search !== undefined) {
|
|
36
|
-
normalized.search = query.search;
|
|
37
|
-
}
|
|
38
|
-
return this.#load(normalized, []);
|
|
39
|
-
}
|
|
40
|
-
subscribe(listener) {
|
|
41
|
-
this.#listeners.add(listener);
|
|
42
|
-
listener(this.state);
|
|
43
|
-
return () => {
|
|
44
|
-
this.#listeners.delete(listener);
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
async #load(query, existing) {
|
|
48
|
-
this.#abortController?.abort();
|
|
49
|
-
const controller = new AbortController();
|
|
50
|
-
this.#abortController = controller;
|
|
51
|
-
this.#setState({ assets: existing, query, status: 'loading' });
|
|
52
|
-
try {
|
|
53
|
-
const page = await this.#provider.list(query, controller.signal);
|
|
54
|
-
if (controller.signal.aborted) {
|
|
55
|
-
return this.state;
|
|
56
|
-
}
|
|
57
|
-
const next = {
|
|
58
|
-
assets: [...existing, ...page.assets],
|
|
59
|
-
query,
|
|
60
|
-
status: 'ready',
|
|
61
|
-
};
|
|
62
|
-
if (page.nextCursor !== undefined) {
|
|
63
|
-
next.nextCursor = page.nextCursor;
|
|
64
|
-
}
|
|
65
|
-
this.#setState(next);
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
if (!controller.signal.aborted) {
|
|
69
|
-
this.#setState({
|
|
70
|
-
assets: existing,
|
|
71
|
-
error: { ...MEDIA_PROVIDER_FAILURE },
|
|
72
|
-
query,
|
|
73
|
-
status: 'error',
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return this.state;
|
|
78
|
-
}
|
|
79
|
-
#setState(state) {
|
|
80
|
-
this.#state = state;
|
|
81
|
-
for (const listener of this.#listeners) {
|
|
82
|
-
listener(this.state);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
export function selectBestRendition(asset, targetWidth) {
|
|
87
|
-
if (asset.renditions === undefined || asset.renditions.length === 0) {
|
|
88
|
-
return undefined;
|
|
89
|
-
}
|
|
90
|
-
const ordered = [...asset.renditions].sort((left, right) => left.width - right.width);
|
|
91
|
-
return ordered.find((rendition) => rendition.width >= targetWidth) ?? ordered.at(-1);
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=media-library.js.map
|
|
1
|
+
export const MEDIA_PROVIDER_FAILURE=Object.freeze({defaultMessage:`The media library could not be loaded.`,key:`studio.media/provider-failed`});export class MediaLibrary{#listeners=new Set;#provider;#abortController;#state={assets:[],status:`idle`};constructor(e){this.#provider=e}get state(){return structuredClone(this.#state)}dispose(){this.#abortController?.abort(),this.#listeners.clear()}async loadNext(){return this.#state.query===void 0||this.#state.nextCursor===void 0?this.state:this.#load({...this.#state.query,cursor:this.#state.nextCursor},[...this.#state.assets])}async search(e){let t={limit:Math.max(1,Math.min(100,Math.trunc(e.limit)))};return e.mediaTypes!==void 0&&(t.mediaTypes=[...e.mediaTypes]),e.search!==void 0&&(t.search=e.search),this.#load(t,[])}subscribe(e){return this.#listeners.add(e),e(this.state),()=>{this.#listeners.delete(e)}}async#load(t,n){this.#abortController?.abort();let r=new AbortController;this.#abortController=r,this.#setState({assets:n,query:t,status:`loading`});try{let e=await this.#provider.list(t,r.signal);if(r.signal.aborted)return this.state;let i={assets:[...n,...e.assets],query:t,status:`ready`};e.nextCursor!==void 0&&(i.nextCursor=e.nextCursor),this.#setState(i)}catch{r.signal.aborted||this.#setState({assets:n,error:{...MEDIA_PROVIDER_FAILURE},query:t,status:`error`})}return this.state}#setState(e){this.#state=e;for(let e of this.#listeners)e(this.state)}}export function selectBestRendition(e,t){if(e.renditions===void 0||e.renditions.length===0)return;let n=[...e.renditions].sort((e,t)=>e.width-t.width);return n.find(e=>e.width>=t)??n.at(-1)}
|
|
@@ -1,196 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
export const MEDIA_UPLOAD_FAILURE = Object.freeze({
|
|
3
|
-
defaultMessage: 'The upload could not be completed.',
|
|
4
|
-
key: 'studio.media/upload-failed',
|
|
5
|
-
});
|
|
6
|
-
export const MEDIA_UPLOAD_TOO_LARGE = Object.freeze({
|
|
7
|
-
defaultMessage: 'The file is larger than the host allows for this upload.',
|
|
8
|
-
key: 'studio.media/upload-too-large',
|
|
9
|
-
});
|
|
10
|
-
const ACTIVE_STATES = new Set([
|
|
11
|
-
'authorized',
|
|
12
|
-
'requested',
|
|
13
|
-
'transferring',
|
|
14
|
-
'verifying',
|
|
15
|
-
]);
|
|
16
|
-
export class MediaUploadController {
|
|
17
|
-
#listeners = new Set();
|
|
18
|
-
#sessionId;
|
|
19
|
-
#transport;
|
|
20
|
-
#abortController;
|
|
21
|
-
#file;
|
|
22
|
-
#session;
|
|
23
|
-
constructor(transport, options) {
|
|
24
|
-
this.#transport = transport;
|
|
25
|
-
this.#sessionId = options?.sessionId ?? (() => crypto.randomUUID());
|
|
26
|
-
}
|
|
27
|
-
get session() {
|
|
28
|
-
if (this.#session === undefined) {
|
|
29
|
-
throw new Error('No upload session has been started.');
|
|
30
|
-
}
|
|
31
|
-
return structuredClone(this.#session);
|
|
32
|
-
}
|
|
33
|
-
cancel() {
|
|
34
|
-
const current = this.#session;
|
|
35
|
-
if (current === undefined || !ACTIVE_STATES.has(current.state)) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
this.#abortController?.abort();
|
|
39
|
-
this.#setSession({ ...structuredClone(current), state: 'cancelled' });
|
|
40
|
-
void this.#transport.abort(current.id).catch(() => undefined);
|
|
41
|
-
}
|
|
42
|
-
async retry() {
|
|
43
|
-
const current = this.#session;
|
|
44
|
-
const file = this.#file;
|
|
45
|
-
if (current?.state !== 'failed' || file === undefined) {
|
|
46
|
-
throw new Error('Only a failed upload session can be retried.');
|
|
47
|
-
}
|
|
48
|
-
return this.#run(file, structuredClone(current.request));
|
|
49
|
-
}
|
|
50
|
-
subscribe(listener) {
|
|
51
|
-
this.#listeners.add(listener);
|
|
52
|
-
if (this.#session !== undefined) {
|
|
53
|
-
listener(this.session);
|
|
54
|
-
}
|
|
55
|
-
return () => {
|
|
56
|
-
this.#listeners.delete(listener);
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
async upload(file, request) {
|
|
60
|
-
if (this.#session !== undefined && ACTIVE_STATES.has(this.#session.state)) {
|
|
61
|
-
throw new Error('An upload session is already in progress.');
|
|
62
|
-
}
|
|
63
|
-
if (file.size < 1) {
|
|
64
|
-
throw new Error('Cannot upload an empty file.');
|
|
65
|
-
}
|
|
66
|
-
const descriptor = {
|
|
67
|
-
byteSize: file.size,
|
|
68
|
-
filename: request.filename,
|
|
69
|
-
mediaType: request.mediaType,
|
|
70
|
-
purpose: request.purpose,
|
|
71
|
-
};
|
|
72
|
-
if (request.checksum !== undefined) {
|
|
73
|
-
descriptor.checksum = request.checksum;
|
|
74
|
-
}
|
|
75
|
-
this.#file = file;
|
|
76
|
-
return this.#run(file, descriptor);
|
|
77
|
-
}
|
|
78
|
-
#fail() {
|
|
79
|
-
const current = this.#session;
|
|
80
|
-
if (current === undefined) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
const failed = {
|
|
84
|
-
contractVersion: current.contractVersion,
|
|
85
|
-
failure: {
|
|
86
|
-
code: 'studio.media/upload-failed',
|
|
87
|
-
message: { ...MEDIA_UPLOAD_FAILURE },
|
|
88
|
-
severity: 'error',
|
|
89
|
-
},
|
|
90
|
-
id: current.id,
|
|
91
|
-
kind: 'media-upload-session',
|
|
92
|
-
progress: { ...current.progress },
|
|
93
|
-
request: { ...current.request },
|
|
94
|
-
state: 'failed',
|
|
95
|
-
};
|
|
96
|
-
if (current.plan !== undefined) {
|
|
97
|
-
failed.plan = { ...current.plan };
|
|
98
|
-
}
|
|
99
|
-
this.#setSession(failed);
|
|
100
|
-
}
|
|
101
|
-
async #run(file, request) {
|
|
102
|
-
const controller = new AbortController();
|
|
103
|
-
this.#abortController = controller;
|
|
104
|
-
const totalBytes = request.byteSize;
|
|
105
|
-
const base = {
|
|
106
|
-
contractVersion: STUDIO_CONTRACT_VERSION,
|
|
107
|
-
id: this.#sessionId(request),
|
|
108
|
-
kind: 'media-upload-session',
|
|
109
|
-
request,
|
|
110
|
-
};
|
|
111
|
-
this.#setSession({
|
|
112
|
-
...base,
|
|
113
|
-
progress: { totalBytes, transferredBytes: 0 },
|
|
114
|
-
state: 'requested',
|
|
115
|
-
});
|
|
116
|
-
try {
|
|
117
|
-
const plan = await this.#transport.authorize(request, controller.signal);
|
|
118
|
-
if (controller.signal.aborted) {
|
|
119
|
-
return this.session;
|
|
120
|
-
}
|
|
121
|
-
if (totalBytes > plan.maximumBytes) {
|
|
122
|
-
this.#setSession({
|
|
123
|
-
...base,
|
|
124
|
-
failure: {
|
|
125
|
-
code: 'studio.media/upload-too-large',
|
|
126
|
-
message: { ...MEDIA_UPLOAD_TOO_LARGE },
|
|
127
|
-
parameters: { byteSize: totalBytes, maximumBytes: plan.maximumBytes },
|
|
128
|
-
severity: 'error',
|
|
129
|
-
},
|
|
130
|
-
plan,
|
|
131
|
-
progress: { totalBytes, transferredBytes: 0 },
|
|
132
|
-
state: 'failed',
|
|
133
|
-
});
|
|
134
|
-
return this.session;
|
|
135
|
-
}
|
|
136
|
-
this.#setSession({
|
|
137
|
-
...base,
|
|
138
|
-
plan,
|
|
139
|
-
progress: { totalBytes, transferredBytes: 0 },
|
|
140
|
-
state: 'authorized',
|
|
141
|
-
});
|
|
142
|
-
this.#setSession({
|
|
143
|
-
...base,
|
|
144
|
-
plan,
|
|
145
|
-
progress: { totalBytes, transferredBytes: 0 },
|
|
146
|
-
state: 'transferring',
|
|
147
|
-
});
|
|
148
|
-
const chunkBytes = Math.max(1, plan.chunkBytes ?? totalBytes);
|
|
149
|
-
let transferredBytes = 0;
|
|
150
|
-
while (transferredBytes < totalBytes) {
|
|
151
|
-
const data = file.slice(transferredBytes, Math.min(transferredBytes + chunkBytes, totalBytes));
|
|
152
|
-
await this.#transport.transfer({ data, offset: transferredBytes, sessionId: base.id }, controller.signal);
|
|
153
|
-
if (controller.signal.aborted) {
|
|
154
|
-
return this.session;
|
|
155
|
-
}
|
|
156
|
-
transferredBytes = Math.min(transferredBytes + data.size, totalBytes);
|
|
157
|
-
this.#setSession({
|
|
158
|
-
...base,
|
|
159
|
-
plan,
|
|
160
|
-
progress: { totalBytes, transferredBytes },
|
|
161
|
-
state: 'transferring',
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
this.#setSession({
|
|
165
|
-
...base,
|
|
166
|
-
plan,
|
|
167
|
-
progress: { totalBytes, transferredBytes: totalBytes },
|
|
168
|
-
state: 'verifying',
|
|
169
|
-
});
|
|
170
|
-
const asset = await this.#transport.finalize(base.id, controller.signal);
|
|
171
|
-
if (controller.signal.aborted) {
|
|
172
|
-
return this.session;
|
|
173
|
-
}
|
|
174
|
-
this.#setSession({
|
|
175
|
-
...base,
|
|
176
|
-
asset,
|
|
177
|
-
plan,
|
|
178
|
-
progress: { totalBytes, transferredBytes: totalBytes },
|
|
179
|
-
state: 'complete',
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
if (!controller.signal.aborted) {
|
|
184
|
-
this.#fail();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return this.session;
|
|
188
|
-
}
|
|
189
|
-
#setSession(session) {
|
|
190
|
-
this.#session = session;
|
|
191
|
-
for (const listener of this.#listeners) {
|
|
192
|
-
listener(this.session);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
//# sourceMappingURL=upload-controller.js.map
|
|
1
|
+
import{STUDIO_CONTRACT_VERSION as e}from"@kumwe/studio-protocol";export const MEDIA_UPLOAD_FAILURE=Object.freeze({defaultMessage:`The upload could not be completed.`,key:`studio.media/upload-failed`});export const MEDIA_UPLOAD_TOO_LARGE=Object.freeze({defaultMessage:`The file is larger than the host allows for this upload.`,key:`studio.media/upload-too-large`});const r=new Set([`authorized`,`requested`,`transferring`,`verifying`]);export class MediaUploadController{#listeners=new Set;#sessionId;#transport;#abortController;#file;#session;constructor(e,t){this.#transport=e,this.#sessionId=t?.sessionId??(()=>crypto.randomUUID())}get session(){if(this.#session===void 0)throw Error(`No upload session has been started.`);return structuredClone(this.#session)}cancel(){let e=this.#session;e===void 0||!r.has(e.state)||(this.#abortController?.abort(),this.#setSession({...structuredClone(e),state:`cancelled`}),this.#transport.abort(e.id).catch(()=>void 0))}async retry(){let e=this.#session,t=this.#file;if(e?.state!==`failed`||t===void 0)throw Error(`Only a failed upload session can be retried.`);return this.#run(t,structuredClone(e.request))}subscribe(e){return this.#listeners.add(e),this.#session!==void 0&&e(this.session),()=>{this.#listeners.delete(e)}}async upload(e,t){if(this.#session!==void 0&&r.has(this.#session.state))throw Error(`An upload session is already in progress.`);if(e.size<1)throw Error(`Cannot upload an empty file.`);let n={byteSize:e.size,filename:t.filename,mediaType:t.mediaType,purpose:t.purpose};return t.checksum!==void 0&&(n.checksum=t.checksum),this.#file=e,this.#run(e,n)}#fail(){let e=this.#session;if(e===void 0)return;let n={contractVersion:e.contractVersion,failure:{code:`studio.media/upload-failed`,message:{...MEDIA_UPLOAD_FAILURE},severity:`error`},id:e.id,kind:`media-upload-session`,progress:{...e.progress},request:{...e.request},state:`failed`};e.plan!==void 0&&(n.plan={...e.plan}),this.#setSession(n)}async#run(t,r){let i=new AbortController;this.#abortController=i;let a=r.byteSize,o={contractVersion:e,id:this.#sessionId(r),kind:`media-upload-session`,request:r};this.#setSession({...o,progress:{totalBytes:a,transferredBytes:0},state:`requested`});try{let e=await this.#transport.authorize(r,i.signal);if(i.signal.aborted)return this.session;if(a>e.maximumBytes)return this.#setSession({...o,failure:{code:`studio.media/upload-too-large`,message:{...MEDIA_UPLOAD_TOO_LARGE},parameters:{byteSize:a,maximumBytes:e.maximumBytes},severity:`error`},plan:e,progress:{totalBytes:a,transferredBytes:0},state:`failed`}),this.session;this.#setSession({...o,plan:e,progress:{totalBytes:a,transferredBytes:0},state:`authorized`}),this.#setSession({...o,plan:e,progress:{totalBytes:a,transferredBytes:0},state:`transferring`});let s=Math.max(1,e.chunkBytes??a),c=0;for(;c<a;){let n=t.slice(c,Math.min(c+s,a));if(await this.#transport.transfer({data:n,offset:c,sessionId:o.id},i.signal),i.signal.aborted)return this.session;c=Math.min(c+n.size,a),this.#setSession({...o,plan:e,progress:{totalBytes:a,transferredBytes:c},state:`transferring`})}this.#setSession({...o,plan:e,progress:{totalBytes:a,transferredBytes:a},state:`verifying`});let l=await this.#transport.finalize(o.id,i.signal);if(i.signal.aborted)return this.session;this.#setSession({...o,asset:l,plan:e,progress:{totalBytes:a,transferredBytes:a},state:`complete`})}catch{i.signal.aborted||this.#fail()}return this.session}#setSession(e){this.#session=e;for(let e of this.#listeners)e(this.session)}}
|
package/dist/upload-policy.js
CHANGED
|
@@ -1,71 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
/** The deterministic upload plan a policy grants, independent of any request. */
|
|
3
|
-
export function planFromPolicy(policy) {
|
|
4
|
-
const plan = {
|
|
5
|
-
maximumBytes: policy.maximumBytes,
|
|
6
|
-
resumable: policy.resumable,
|
|
7
|
-
};
|
|
8
|
-
if (policy.chunkBytes !== undefined) {
|
|
9
|
-
plan.chunkBytes = policy.chunkBytes;
|
|
10
|
-
}
|
|
11
|
-
return plan;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Evaluates one upload request against a host-declared policy, in the fixed
|
|
15
|
-
* order filename, media type, size. Rejections use the closed media failure
|
|
16
|
-
* vocabulary: an oversize request fails with `studio.media/upload-too-large`
|
|
17
|
-
* carrying the byte counts only as machine-readable diagnostic parameters
|
|
18
|
-
* (the exact diagnostic `MediaUploadController` raises at the same boundary),
|
|
19
|
-
* and every other violation fails with the generic
|
|
20
|
-
* `studio.media/upload-failed` — user-facing messages never echo the raw
|
|
21
|
-
* size, media type, or filename. The canonical corpus in
|
|
22
|
-
* `schemas/vectors/media/` replays this decision.
|
|
23
|
-
*/
|
|
24
|
-
export function evaluateUploadPolicy(policy, request) {
|
|
25
|
-
if (!isCanonicalFilename(request.filename) ||
|
|
26
|
-
!policy.acceptedMediaTypes.includes(request.mediaType) ||
|
|
27
|
-
!Number.isInteger(request.byteSize) ||
|
|
28
|
-
request.byteSize < 1) {
|
|
29
|
-
return {
|
|
30
|
-
failure: {
|
|
31
|
-
code: 'studio.media/upload-failed',
|
|
32
|
-
message: { ...MEDIA_UPLOAD_FAILURE },
|
|
33
|
-
severity: 'error',
|
|
34
|
-
},
|
|
35
|
-
outcome: 'rejected',
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
if (request.byteSize > policy.maximumBytes) {
|
|
39
|
-
return {
|
|
40
|
-
failure: {
|
|
41
|
-
code: 'studio.media/upload-too-large',
|
|
42
|
-
message: { ...MEDIA_UPLOAD_TOO_LARGE },
|
|
43
|
-
parameters: { byteSize: request.byteSize, maximumBytes: policy.maximumBytes },
|
|
44
|
-
severity: 'error',
|
|
45
|
-
},
|
|
46
|
-
outcome: 'rejected',
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return { outcome: 'accepted', plan: planFromPolicy(policy) };
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Mirrors the filename rule of `media-upload-session.schema.json`: one to 255
|
|
53
|
-
* code points, no C0 control characters, no DEL, and no path separators —
|
|
54
|
-
* per the media contract, filenames are display metadata, never storage
|
|
55
|
-
* paths.
|
|
56
|
-
*/
|
|
57
|
-
function isCanonicalFilename(filename) {
|
|
58
|
-
let length = 0;
|
|
59
|
-
for (const character of filename) {
|
|
60
|
-
length += 1;
|
|
61
|
-
if (length > 255) {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
const codePoint = character.codePointAt(0) ?? 0;
|
|
65
|
-
if (codePoint <= 0x1f || codePoint === 0x7f || character === '/' || character === '\\') {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return length >= 1;
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=upload-policy.js.map
|
|
1
|
+
import{MEDIA_UPLOAD_FAILURE as e,MEDIA_UPLOAD_TOO_LARGE as t}from"./upload-controller.js";export function planFromPolicy(e){let t={maximumBytes:e.maximumBytes,resumable:e.resumable};return e.chunkBytes!==void 0&&(t.chunkBytes=e.chunkBytes),t}export function evaluateUploadPolicy(r,a){return!i(a.filename)||!r.acceptedMediaTypes.includes(a.mediaType)||!Number.isInteger(a.byteSize)||a.byteSize<1?{failure:{code:`studio.media/upload-failed`,message:{...e},severity:`error`},outcome:`rejected`}:a.byteSize>r.maximumBytes?{failure:{code:`studio.media/upload-too-large`,message:{...t},parameters:{byteSize:a.byteSize,maximumBytes:r.maximumBytes},severity:`error`},outcome:`rejected`}:{outcome:`accepted`,plan:planFromPolicy(r)}}function i(e){let t=0;for(let n of e){if(t+=1,t>255)return!1;let e=n.codePointAt(0)??0;if(e<=31||e===127||n===`/`||n===`\\`)return!1}return t>=1}
|
|
@@ -1,24 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Semantic validation the media-reference schema cannot express: a
|
|
3
|
-
* rectangle crop uses normalized coordinates and MUST remain inside the
|
|
4
|
-
* source bounds. Schema validation is assumed to have passed already.
|
|
5
|
-
*/
|
|
6
|
-
export function validateMediaReference(reference) {
|
|
7
|
-
const diagnostics = [];
|
|
8
|
-
const crop = reference.cropIntent;
|
|
9
|
-
if (crop?.mode === 'rectangle') {
|
|
10
|
-
if (crop.x + crop.width > 1 || crop.y + crop.height > 1) {
|
|
11
|
-
diagnostics.push({
|
|
12
|
-
code: 'studio.media/crop-out-of-bounds',
|
|
13
|
-
location: { artifactId: reference.assetId },
|
|
14
|
-
message: {
|
|
15
|
-
defaultMessage: 'The crop rectangle extends beyond the source media bounds.',
|
|
16
|
-
key: 'studio.media/crop-out-of-bounds',
|
|
17
|
-
},
|
|
18
|
-
severity: 'error',
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return diagnostics;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=validate-media-reference.js.map
|
|
1
|
+
export function validateMediaReference(e){let t=[],n=e.cropIntent;return n?.mode===`rectangle`&&(n.x+n.width>1||n.y+n.height>1)&&t.push({code:`studio.media/crop-out-of-bounds`,location:{artifactId:e.assetId},message:{defaultMessage:`The crop rectangle extends beyond the source media bounds.`,key:`studio.media/crop-out-of-bounds`},severity:`error`}),t}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kumwe/studio-media",
|
|
3
|
-
"version": "0.1.0-
|
|
3
|
+
"version": "0.1.0-beta.3",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/kumwe/studio.git",
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"files": [
|
|
15
15
|
"LICENSE",
|
|
16
|
+
"THIRD_PARTY_NOTICES.md",
|
|
17
|
+
"third-party-licenses",
|
|
16
18
|
"dist",
|
|
17
19
|
"README.md"
|
|
18
20
|
],
|
|
@@ -23,10 +25,10 @@
|
|
|
23
25
|
}
|
|
24
26
|
},
|
|
25
27
|
"scripts": {
|
|
26
|
-
"build": "tsc -b"
|
|
28
|
+
"build": "tsc -b && node ../../scripts/minify-package-dist.mjs --package packages/media"
|
|
27
29
|
},
|
|
28
30
|
"dependencies": {
|
|
29
|
-
"@kumwe/studio-protocol": "0.1.0-
|
|
31
|
+
"@kumwe/studio-protocol": "0.1.0-beta.3"
|
|
30
32
|
},
|
|
31
33
|
"publishConfig": {
|
|
32
34
|
"access": "public",
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,GAMpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,GAKvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,cAAc,GAGf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-library.js","sourceRoot":"","sources":["../src/media-library.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-controller.js","sourceRoot":"","sources":["../src/upload-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-policy.js","sourceRoot":"","sources":["../src/upload-policy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAmBtF,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,MAAM,IAAI,GAAoB;QAC5B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IACF,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAyB,EACzB,OAAqC;IAErC,IACE,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC;QACtC,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;QACtD,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,EACpB,CAAC;QACD,OAAO;YACL,OAAO,EAAE;gBACP,IAAI,EAAE,4BAA4B;gBAClC,OAAO,EAAE,EAAE,GAAG,oBAAoB,EAAE;gBACpC,QAAQ,EAAE,OAAO;aAClB;YACD,OAAO,EAAE,UAAU;SACpB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE;gBACP,IAAI,EAAE,+BAA+B;gBACrC,OAAO,EAAE,EAAE,GAAG,sBAAsB,EAAE;gBACtC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;gBAC7E,QAAQ,EAAE,OAAO;aAClB;YACD,OAAO,EAAE,UAAU;SACpB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,CAAC;QACZ,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,MAAM,IAAI,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-media-reference.js","sourceRoot":"","sources":["../src/validate-media-reference.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAyB;IAC9D,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC;IAClC,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,iCAAiC;gBACvC,QAAQ,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,OAAO,EAAE;gBAC3C,OAAO,EAAE;oBACP,cAAc,EAAE,4DAA4D;oBAC5E,GAAG,EAAE,iCAAiC;iBACvC;gBACD,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|