@se-studio/contentful-cms 3.10.2 → 3.11.0
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 +12 -0
- package/README.md +1 -1
- package/dist/cli/hosted-inline-limit.d.ts +4 -0
- package/dist/cli/hosted-inline-limit.d.ts.map +1 -0
- package/dist/cli/hosted-inline-limit.js +15 -0
- package/dist/cli/hosted-inline-limit.js.map +1 -0
- package/dist/cli/read-json-input.d.ts +16 -1
- package/dist/cli/read-json-input.d.ts.map +1 -1
- package/dist/cli/read-json-input.js +100 -12
- package/dist/cli/read-json-input.js.map +1 -1
- package/dist/commands/apply-from-json.d.ts.map +1 -1
- package/dist/commands/apply-from-json.js +10 -3
- package/dist/commands/apply-from-json.js.map +1 -1
- package/dist/commands/article-tags-from-json.d.ts.map +1 -1
- package/dist/commands/article-tags-from-json.js +12 -3
- package/dist/commands/article-tags-from-json.js.map +1 -1
- package/dist/commands/asset.d.ts.map +1 -1
- package/dist/commands/asset.js +2 -0
- package/dist/commands/asset.js.map +1 -1
- package/dist/commands/create-from-json.d.ts.map +1 -1
- package/dist/commands/create-from-json.js +16 -4
- package/dist/commands/create-from-json.js.map +1 -1
- package/dist/commands/create-person-from-json.d.ts.map +1 -1
- package/dist/commands/create-person-from-json.js +12 -3
- package/dist/commands/create-person-from-json.js.map +1 -1
- package/dist/commands/create-person.d.ts.map +1 -1
- package/dist/commands/create-person.js +20 -5
- package/dist/commands/create-person.js.map +1 -1
- package/dist/commands/create-taxonomy-from-json.d.ts.map +1 -1
- package/dist/commands/create-taxonomy-from-json.js +12 -3
- package/dist/commands/create-taxonomy-from-json.js.map +1 -1
- package/dist/commands/create-taxonomy.d.ts.map +1 -1
- package/dist/commands/create-taxonomy.js +28 -8
- package/dist/commands/create-taxonomy.js.map +1 -1
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +9 -3
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +3 -0
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/rtf.d.ts.map +1 -1
- package/dist/commands/rtf.js +20 -8
- package/dist/commands/rtf.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +12 -3
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/session-diff.d.ts.map +1 -1
- package/dist/commands/session-diff.js +13 -0
- package/dist/commands/session-diff.js.map +1 -1
- package/dist/commands/set.d.ts.map +1 -1
- package/dist/commands/set.js +78 -38
- package/dist/commands/set.js.map +1 -1
- package/dist/commands/staged-upload.d.ts.map +1 -1
- package/dist/commands/staged-upload.js +2 -0
- package/dist/commands/staged-upload.js.map +1 -1
- package/dist/contentful/cma-user-agent.d.ts +1 -1
- package/dist/diff/long-text.d.ts +24 -0
- package/dist/diff/long-text.d.ts.map +1 -0
- package/dist/diff/long-text.js +65 -0
- package/dist/diff/long-text.js.map +1 -0
- package/dist/generated/help-topics.d.ts.map +1 -1
- package/dist/generated/help-topics.js +1 -1
- package/dist/generated/help-topics.js.map +1 -1
- package/dist/generated/hosted-guide.d.ts +1 -1
- package/dist/generated/hosted-guide.d.ts.map +1 -1
- package/dist/generated/hosted-guide.js +1 -1
- package/dist/generated/hosted-guide.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/mcp/tools/cms-edit.d.ts +1 -1
- package/dist/mcp/tools/cms-edit.d.ts.map +1 -1
- package/dist/mcp/tools/cms-edit.js +18 -10
- package/dist/mcp/tools/cms-edit.js.map +1 -1
- package/dist/mcp/tools/staged-upload.d.ts.map +1 -1
- package/dist/mcp/tools/staged-upload.js +27 -10
- package/dist/mcp/tools/staged-upload.js.map +1 -1
- package/dist/media-pipeline/prepare-source.d.ts.map +1 -1
- package/dist/media-pipeline/prepare-source.js +2 -0
- package/dist/media-pipeline/prepare-source.js.map +1 -1
- package/dist/preview/entry-urls.d.ts.map +1 -1
- package/dist/preview/entry-urls.js +8 -6
- package/dist/preview/entry-urls.js.map +1 -1
- package/dist/rtf/resolveRtfInput.d.ts +7 -2
- package/dist/rtf/resolveRtfInput.d.ts.map +1 -1
- package/dist/rtf/resolveRtfInput.js +49 -7
- package/dist/rtf/resolveRtfInput.js.map +1 -1
- package/dist/session/dirty.js +3 -3
- package/dist/session/dirty.js.map +1 -1
- package/dist/snapshot/fields.d.ts +1 -0
- package/dist/snapshot/fields.d.ts.map +1 -1
- package/dist/snapshot/fields.js +23 -0
- package/dist/snapshot/fields.js.map +1 -1
- package/dist/staged-upload/consume-text.d.ts +11 -0
- package/dist/staged-upload/consume-text.d.ts.map +1 -0
- package/dist/staged-upload/consume-text.js +55 -0
- package/dist/staged-upload/consume-text.js.map +1 -0
- package/dist/staged-upload/mime.d.ts +9 -1
- package/dist/staged-upload/mime.d.ts.map +1 -1
- package/dist/staged-upload/mime.js +52 -3
- package/dist/staged-upload/mime.js.map +1 -1
- package/dist/staged-upload/request.d.ts +2 -0
- package/dist/staged-upload/request.d.ts.map +1 -1
- package/dist/staged-upload/request.js +24 -12
- package/dist/staged-upload/request.js.map +1 -1
- package/dist/staged-upload/store.d.ts +2 -0
- package/dist/staged-upload/store.d.ts.map +1 -1
- package/dist/staged-upload/store.js +13 -7
- package/dist/staged-upload/store.js.map +1 -1
- package/dist/staged-upload/types.d.ts +4 -0
- package/dist/staged-upload/types.d.ts.map +1 -1
- package/docs/editor-tasks/create-html-component.md +15 -5
- package/docs/editor-tasks/preview-verify.md +6 -5
- package/docs/help/create-from-json.md +7 -4
- package/docs/help/fields-html-component.md +11 -1
- package/docs/help/index.md +1 -1
- package/docs/help/workflow.md +1 -1
- package/docs/mcp/hosted-guide.md +13 -11
- package/package.json +3 -3
- package/skills/core/SKILL.md +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-urls.js","sourceRoot":"","sources":["../../src/preview/entry-urls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAoCxD,uEAAuE;AACvE,MAAM,iBAAiB,GAAuB;IAC5C,uBAAuB;IACvB,SAAS;IACT,iBAAiB;IACjB,YAAY;IACZ,iBAAiB;CAClB,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,OAA2B;IAC/D,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CACpF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAClD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAe,EACf,WAAmB,EACnB,OAAe,EACf,OAAmC;IAEnC,MAAM,IAAI,GAAG,qCAAqC,OAAO,iBAAiB,WAAW,YAAY,OAAO,EAAE,CAAC;IAC3G,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAAe,EACf,WAAmB,EACnB,OAAe,EACf,eAAuB;IAEvB,MAAM,QAAQ,GAAG,qCAAqC,OAAO,iBAAiB,WAAW,YAAY,OAAO,UAAU,CAAC;IACvH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YAChC,OAAO,EAAE,eAAe,CAAC,eAAe,CAAC;SAC1C,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,UAAU,EAAE,GAAG,CAAC,MAAM;gBACtB,iBAAiB,EACf,8CAA8C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"entry-urls.js","sourceRoot":"","sources":["../../src/preview/entry-urls.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { RtfInputFormat } from './types.js';
|
|
2
|
+
export interface ResolvedRtfInput {
|
|
3
|
+
raw: string;
|
|
4
|
+
consumeStaged: (() => Promise<void>) | null;
|
|
5
|
+
}
|
|
2
6
|
/**
|
|
3
7
|
* Resolves raw string input for `cms-edit rtf` from CLI arguments (any format).
|
|
4
|
-
* Precedence: `--base64` → `--content` → positional arg.
|
|
8
|
+
* Precedence: `--staged` (exclusive) → `--base64` → `--content` → positional arg.
|
|
9
|
+
* Hosted MCP applies the 8k inline cap to --content/--base64/positional.
|
|
5
10
|
*/
|
|
6
|
-
export declare function resolveRtfInput(
|
|
11
|
+
export declare function resolveRtfInput(format: RtfInputFormat, inputArg: string | undefined, content?: string, base64?: string, staged?: string): Promise<ResolvedRtfInput>;
|
|
7
12
|
/**
|
|
8
13
|
* @deprecated Use {@link resolveRtfInput} with format `'markdown'`.
|
|
9
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveRtfInput.d.ts","sourceRoot":"","sources":["../../src/rtf/resolveRtfInput.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolveRtfInput.d.ts","sourceRoot":"","sources":["../../src/rtf/resolveRtfInput.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAsD3B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -1,23 +1,65 @@
|
|
|
1
|
+
import { readTextInput } from '../cli/read-json-input.js';
|
|
2
|
+
import { consumeStagedUpload, peekStagedUtf8 } from '../staged-upload/consume-text.js';
|
|
1
3
|
/**
|
|
2
4
|
* Resolves raw string input for `cms-edit rtf` from CLI arguments (any format).
|
|
3
|
-
* Precedence: `--base64` → `--content` → positional arg.
|
|
5
|
+
* Precedence: `--staged` (exclusive) → `--base64` → `--content` → positional arg.
|
|
6
|
+
* Hosted MCP applies the 8k inline cap to --content/--base64/positional.
|
|
4
7
|
*/
|
|
5
|
-
export async function resolveRtfInput(
|
|
8
|
+
export async function resolveRtfInput(format, inputArg, content, base64, staged) {
|
|
9
|
+
if (staged) {
|
|
10
|
+
if ((inputArg !== undefined && inputArg !== '') ||
|
|
11
|
+
(content !== undefined && content !== '') ||
|
|
12
|
+
(base64 !== undefined && base64 !== '')) {
|
|
13
|
+
throw new Error('Cannot combine --staged with positional content, --content, or --base64.');
|
|
14
|
+
}
|
|
15
|
+
const peeked = await peekStagedUtf8(staged, format === 'json' ? ['json'] : ['text']);
|
|
16
|
+
return {
|
|
17
|
+
raw: peeked.text,
|
|
18
|
+
consumeStaged: async () => {
|
|
19
|
+
await consumeStagedUpload(staged);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
6
23
|
if (base64) {
|
|
7
|
-
return
|
|
24
|
+
return {
|
|
25
|
+
raw: readTextInput({
|
|
26
|
+
base64,
|
|
27
|
+
contentFlag: '--content',
|
|
28
|
+
base64Flag: '--base64',
|
|
29
|
+
label: 'rtf',
|
|
30
|
+
}),
|
|
31
|
+
consumeStaged: null,
|
|
32
|
+
};
|
|
8
33
|
}
|
|
9
34
|
if (content !== undefined && content !== '') {
|
|
10
|
-
return
|
|
35
|
+
return {
|
|
36
|
+
raw: readTextInput({
|
|
37
|
+
content,
|
|
38
|
+
contentFlag: '--content',
|
|
39
|
+
base64Flag: '--base64',
|
|
40
|
+
label: 'rtf',
|
|
41
|
+
}),
|
|
42
|
+
consumeStaged: null,
|
|
43
|
+
};
|
|
11
44
|
}
|
|
12
45
|
if (inputArg !== undefined && inputArg !== '') {
|
|
13
|
-
return
|
|
46
|
+
return {
|
|
47
|
+
raw: readTextInput({
|
|
48
|
+
content: inputArg,
|
|
49
|
+
contentFlag: 'positional content',
|
|
50
|
+
base64Flag: '--base64',
|
|
51
|
+
label: 'rtf',
|
|
52
|
+
}),
|
|
53
|
+
consumeStaged: null,
|
|
54
|
+
};
|
|
14
55
|
}
|
|
15
|
-
throw new Error('Provide content as: positional arg, --content <string>, or --
|
|
56
|
+
throw new Error('Provide content as: positional arg, --content <string>, --base64 <encoded>, or --staged <id>.');
|
|
16
57
|
}
|
|
17
58
|
/**
|
|
18
59
|
* @deprecated Use {@link resolveRtfInput} with format `'markdown'`.
|
|
19
60
|
*/
|
|
20
61
|
export async function resolveMarkdownInput(markdownArg, content, base64) {
|
|
21
|
-
|
|
62
|
+
const resolved = await resolveRtfInput('markdown', markdownArg, content, base64);
|
|
63
|
+
return resolved.raw;
|
|
22
64
|
}
|
|
23
65
|
//# sourceMappingURL=resolveRtfInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveRtfInput.js","sourceRoot":"","sources":["../../src/rtf/resolveRtfInput.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolveRtfInput.js","sourceRoot":"","sources":["../../src/rtf/resolveRtfInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAQvF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAsB,EACtB,QAA4B,EAC5B,OAAgB,EAChB,MAAe,EACf,MAAe;IAEf,IAAI,MAAM,EAAE,CAAC;QACX,IACE,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,CAAC;YAC3C,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,CAAC;YACzC,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,CAAC,EACvC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACrF,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,IAAI;YAChB,aAAa,EAAE,KAAK,IAAI,EAAE;gBACxB,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;SACF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,GAAG,EAAE,aAAa,CAAC;gBACjB,MAAM;gBACN,WAAW,EAAE,WAAW;gBACxB,UAAU,EAAE,UAAU;gBACtB,KAAK,EAAE,KAAK;aACb,CAAC;YACF,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QAC5C,OAAO;YACL,GAAG,EAAE,aAAa,CAAC;gBACjB,OAAO;gBACP,WAAW,EAAE,WAAW;gBACxB,UAAU,EAAE,UAAU;gBACtB,KAAK,EAAE,KAAK;aACb,CAAC;YACF,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC9C,OAAO;YACL,GAAG,EAAE,aAAa,CAAC;gBACjB,OAAO,EAAE,QAAQ;gBACjB,WAAW,EAAE,oBAAoB;gBACjC,UAAU,EAAE,UAAU;gBACtB,KAAK,EAAE,KAAK;aACb,CAAC;YACF,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAA+B,EAC/B,OAAgB,EAChB,MAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACjF,OAAO,QAAQ,CAAC,GAAG,CAAC;AACtB,CAAC"}
|
package/dist/session/dirty.js
CHANGED
|
@@ -15,7 +15,7 @@ export function formatDirtyOpenError(session) {
|
|
|
15
15
|
'cms-edit diff',
|
|
16
16
|
'cms-edit save',
|
|
17
17
|
'cms-edit discard',
|
|
18
|
-
'cms-edit open --overwrite --id <entryId>',
|
|
18
|
+
'cms-edit open --overwrite --confirm-discard --id <entryId>',
|
|
19
19
|
];
|
|
20
20
|
const message = [
|
|
21
21
|
`Cannot open: session has ${unsavedChanges} unsaved entry change(s) and ${pendingDeletions} pending deletion(s).`,
|
|
@@ -25,9 +25,9 @@ export function formatDirtyOpenError(session) {
|
|
|
25
25
|
' Review changes: cms-edit diff',
|
|
26
26
|
' Save drafts: cms-edit save',
|
|
27
27
|
' Abandon all staged: cms-edit discard',
|
|
28
|
-
' Abandon and open new: cms-edit open --overwrite --id <entryId>',
|
|
28
|
+
' Abandon and open new: cms-edit open --overwrite --confirm-discard --id <entryId>',
|
|
29
29
|
'',
|
|
30
|
-
'Do not re-run open without --overwrite while changes are staged — that previously wiped session field edits.',
|
|
30
|
+
'Do not re-run open without --overwrite --confirm-discard while changes are staged — that previously wiped session field edits.',
|
|
31
31
|
].join('\n');
|
|
32
32
|
return {
|
|
33
33
|
message,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dirty.js","sourceRoot":"","sources":["../../src/session/dirty.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,OAAO,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;AACpF,CAAC;AAgBD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAE5C,MAAM,OAAO,GAAG;QACd,wBAAwB;QACxB,eAAe;QACf,eAAe;QACf,kBAAkB;QAClB,
|
|
1
|
+
{"version":3,"file":"dirty.js","sourceRoot":"","sources":["../../src/session/dirty.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,OAAO,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;AACpF,CAAC;AAgBD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAE5C,MAAM,OAAO,GAAG;QACd,wBAAwB;QACxB,eAAe;QACf,eAAe;QACf,kBAAkB;QAClB,4DAA4D;KAC7D,CAAC;IAEF,MAAM,OAAO,GAAG;QACd,4BAA4B,cAAc,gCAAgC,gBAAgB,uBAAuB;QACjH,SAAS,WAAW,KAAK,aAAa,mDAAmD;QACzF,EAAE;QACF,kDAAkD;QAClD,yCAAyC;QACzC,yCAAyC;QACzC,4CAA4C;QAC5C,sFAAsF;QACtF,EAAE;QACF,gIAAgI;KACjI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACL,OAAO;QACP,OAAO,EAAE;YACP,IAAI,EAAE,eAAe;YACrB,cAAc;YACd,gBAAgB;YAChB,WAAW;YACX,aAAa;YACb,OAAO;SACR;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/snapshot/fields.ts"],"names":[],"mappings":"AAAA,uFAAuF;
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/snapshot/fields.ts"],"names":[],"mappings":"AAAA,uFAAuF;AASvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI3D,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAoBnC;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACA,IAAI,CAoFN"}
|
package/dist/snapshot/fields.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
|
|
2
2
|
import pc from 'picocolors';
|
|
3
|
+
import { hashFieldValue } from '../diff/long-text.js';
|
|
3
4
|
import { entryFieldsToJson, entryToJson } from '../output/json.js';
|
|
4
5
|
import { isJsonMode } from '../output/mode.js';
|
|
5
6
|
import { errorMsg, statusBadge } from '../output/print.js';
|
|
@@ -27,6 +28,28 @@ export function buildEntryFieldsJson(entry, locale, field) {
|
|
|
27
28
|
}
|
|
28
29
|
export function renderEntryFields(entry, locale, options) {
|
|
29
30
|
const status = getEntryStatus(entry, options.isModified ?? false);
|
|
31
|
+
if (options.hash) {
|
|
32
|
+
const hashes = {};
|
|
33
|
+
const fieldIds = options.field ? [options.field] : Object.keys(entry.fields);
|
|
34
|
+
for (const fieldId of fieldIds) {
|
|
35
|
+
const fieldData = entry.fields[fieldId];
|
|
36
|
+
if (!fieldData) {
|
|
37
|
+
if (options.field) {
|
|
38
|
+
errorMsg(`Field "${fieldId}" not found on this entry.`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const value = fieldData[locale] ?? fieldData['en-US'];
|
|
44
|
+
hashes[fieldId] = hashFieldValue(value);
|
|
45
|
+
}
|
|
46
|
+
console.log(JSON.stringify({
|
|
47
|
+
ref: options.refLabel,
|
|
48
|
+
entryId: entry.sys.id,
|
|
49
|
+
fields: hashes,
|
|
50
|
+
}, null, 2));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
30
53
|
if (options.json || isJsonMode()) {
|
|
31
54
|
const json = buildEntryFieldsJson(entry, locale, options.field);
|
|
32
55
|
console.log(JSON.stringify(json, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/snapshot/fields.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAClC,KAAsB,EACtB,MAAc,EACd,KAAc;IAEd,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;QACrE,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,OAAO,WAAW,CAChB;QACE,GAAG,EAAE;YACH,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;YAChB,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;YAC1D,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB;YAC5C,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS;SAC/B;QACD,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,EACD,MAAM,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAsB,EACtB,MAAc,EACd,
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/snapshot/fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type StagedUploadKind } from './mime.js';
|
|
2
|
+
export declare function peekStagedUtf8(uploadId: string, allowedKinds: readonly StagedUploadKind[]): Promise<{
|
|
3
|
+
text: string;
|
|
4
|
+
mimeType: string;
|
|
5
|
+
fileName: string;
|
|
6
|
+
byteLength: number;
|
|
7
|
+
kind: StagedUploadKind;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function consumeStagedUpload(uploadId: string): Promise<void>;
|
|
10
|
+
export declare function tryConsumeStagedUpload(consume: (() => Promise<void>) | null, afterSuccess: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=consume-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consume-text.d.ts","sourceRoot":"","sources":["../../src/staged-upload/consume-text.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AA+BpE,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,SAAS,gBAAgB,EAAE,GACxC,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAAC,CAYD;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EACrC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAaf"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { warnMsg } from '../output/print.js';
|
|
2
|
+
import { getRuntimeContext } from '../runtime/context.js';
|
|
3
|
+
import { assertStagedKind } from './mime.js';
|
|
4
|
+
function requireHostedStagedStore() {
|
|
5
|
+
const ctx = getRuntimeContext();
|
|
6
|
+
const userId = ctx?.user?.userId;
|
|
7
|
+
const store = ctx?.stagedUploadStore;
|
|
8
|
+
if (!userId || !store) {
|
|
9
|
+
throw new Error('--staged requires hosted MCP context (authenticated user and Redis staged upload store).');
|
|
10
|
+
}
|
|
11
|
+
return { userId, store };
|
|
12
|
+
}
|
|
13
|
+
function decodeUtf8Strict(buffer) {
|
|
14
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
15
|
+
let text;
|
|
16
|
+
try {
|
|
17
|
+
text = decoder.decode(buffer);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error('Staged upload is not valid UTF-8. Use kind=asset for binaries.');
|
|
21
|
+
}
|
|
22
|
+
if (text.includes('\0')) {
|
|
23
|
+
throw new Error('Staged upload is not valid UTF-8 text (contains NUL). Use kind=asset for binaries.');
|
|
24
|
+
}
|
|
25
|
+
return text;
|
|
26
|
+
}
|
|
27
|
+
export async function peekStagedUtf8(uploadId, allowedKinds) {
|
|
28
|
+
const { userId, store } = requireHostedStagedStore();
|
|
29
|
+
const peeked = await store.peekFile(userId, uploadId);
|
|
30
|
+
const kind = assertStagedKind(peeked.kind, allowedKinds);
|
|
31
|
+
const text = decodeUtf8Strict(peeked.buffer);
|
|
32
|
+
return {
|
|
33
|
+
text,
|
|
34
|
+
mimeType: peeked.mimeType,
|
|
35
|
+
fileName: peeked.fileName,
|
|
36
|
+
byteLength: peeked.byteLength,
|
|
37
|
+
kind,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export async function consumeStagedUpload(uploadId) {
|
|
41
|
+
const { userId, store } = requireHostedStagedStore();
|
|
42
|
+
await store.consume(userId, uploadId);
|
|
43
|
+
}
|
|
44
|
+
export async function tryConsumeStagedUpload(consume, afterSuccess) {
|
|
45
|
+
if (!consume) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
await consume();
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
warnMsg(`${afterSuccess} but staged upload could not be consumed: ${e instanceof Error ? e.message : String(e)}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=consume-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consume-text.js","sourceRoot":"","sources":["../../src/staged-upload/consume-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAyB,MAAM,WAAW,CAAC;AAGpE,SAAS,wBAAwB;IAC/B,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;IACjC,MAAM,KAAK,GAAG,GAAG,EAAE,iBAAiB,CAAC;IACrC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,YAAyC;IAQzC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,wBAAwB,EAAE,CAAC;IACrD,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAqC,EACrC,YAAoB;IAEpB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CACL,GAAG,YAAY,6CACb,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAC3C,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type StagedUploadKind = 'asset' | 'text' | 'json';
|
|
2
|
+
/** Strip parameters such as `; charset=utf-8`. */
|
|
3
|
+
export declare function normalizeMimeType(mimeType: string): string;
|
|
4
|
+
export declare function parseStagedUploadKind(raw: string | undefined): StagedUploadKind;
|
|
5
|
+
export declare function stagedKindOrAsset(kind: StagedUploadKind | undefined): StagedUploadKind;
|
|
6
|
+
export declare function assertStagedKind(actual: StagedUploadKind | undefined, allowed: readonly StagedUploadKind[]): StagedUploadKind;
|
|
7
|
+
export declare function isAllowedStagedMimeType(mimeType: string, kind?: StagedUploadKind): boolean;
|
|
8
|
+
/** Curl often sends empty File.type → octet-stream; keep the reserved MIME when kind is text/json. */
|
|
9
|
+
export declare function effectiveStagedMimeType(uploadedMime: string, reservedMime: string, kind: StagedUploadKind): string;
|
|
2
10
|
//# sourceMappingURL=mime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/staged-upload/mime.ts"],"names":[],"mappings":"AAAA,wBAAgB,
|
|
1
|
+
{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/staged-upload/mime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAYzD,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAS/E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,CAEtF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GACnC,gBAAgB,CASlB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,gBAA0B,GAC/B,OAAO,CAqBT;AAED,sGAAsG;AACtG,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,gBAAgB,GACrB,MAAM,CASR"}
|
|
@@ -1,15 +1,64 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
const ASSET_JSON = 'application/json';
|
|
2
|
+
const TEXT_MIME_TYPES = new Set([
|
|
3
|
+
'text/html',
|
|
4
|
+
'text/css',
|
|
5
|
+
'text/javascript',
|
|
6
|
+
'application/javascript',
|
|
7
|
+
'text/plain',
|
|
8
|
+
]);
|
|
9
|
+
/** Strip parameters such as `; charset=utf-8`. */
|
|
10
|
+
export function normalizeMimeType(mimeType) {
|
|
11
|
+
const base = mimeType.trim().toLowerCase().split(';')[0];
|
|
12
|
+
return base?.trim() ?? '';
|
|
13
|
+
}
|
|
14
|
+
export function parseStagedUploadKind(raw) {
|
|
15
|
+
if (raw === undefined || raw.trim() === '') {
|
|
16
|
+
return 'asset';
|
|
17
|
+
}
|
|
18
|
+
const normalized = raw.trim().toLowerCase();
|
|
19
|
+
if (normalized === 'asset' || normalized === 'text' || normalized === 'json') {
|
|
20
|
+
return normalized;
|
|
21
|
+
}
|
|
22
|
+
throw new Error(`Invalid staged upload kind "${raw}". Use asset, text, or json.`);
|
|
23
|
+
}
|
|
24
|
+
export function stagedKindOrAsset(kind) {
|
|
25
|
+
return kind ?? 'asset';
|
|
26
|
+
}
|
|
27
|
+
export function assertStagedKind(actual, allowed) {
|
|
28
|
+
const kind = stagedKindOrAsset(actual);
|
|
29
|
+
if (!allowed.includes(kind)) {
|
|
30
|
+
throw new Error(`Staged upload kind is ${kind}; expected ${allowed.join(' or ')}. ` +
|
|
31
|
+
'Request a new upload with the matching kind.');
|
|
32
|
+
}
|
|
33
|
+
return kind;
|
|
34
|
+
}
|
|
35
|
+
export function isAllowedStagedMimeType(mimeType, kind = 'asset') {
|
|
36
|
+
const normalized = normalizeMimeType(mimeType);
|
|
3
37
|
if (!normalized) {
|
|
4
38
|
return false;
|
|
5
39
|
}
|
|
40
|
+
if (kind === 'text') {
|
|
41
|
+
return TEXT_MIME_TYPES.has(normalized);
|
|
42
|
+
}
|
|
43
|
+
if (kind === 'json') {
|
|
44
|
+
return normalized === ASSET_JSON;
|
|
45
|
+
}
|
|
6
46
|
return (normalized.startsWith('image/') ||
|
|
7
47
|
normalized.startsWith('video/') ||
|
|
8
48
|
normalized === 'application/pdf' ||
|
|
9
49
|
// Lottie JSON and DotLottie packages (zip / generic binary with .lottie filename)
|
|
10
|
-
normalized ===
|
|
50
|
+
normalized === ASSET_JSON ||
|
|
11
51
|
normalized === 'application/zip' ||
|
|
12
52
|
normalized === 'application/x-zip-compressed' ||
|
|
13
53
|
normalized === 'application/octet-stream');
|
|
14
54
|
}
|
|
55
|
+
/** Curl often sends empty File.type → octet-stream; keep the reserved MIME when kind is text/json. */
|
|
56
|
+
export function effectiveStagedMimeType(uploadedMime, reservedMime, kind) {
|
|
57
|
+
const uploaded = normalizeMimeType(uploadedMime);
|
|
58
|
+
if ((kind === 'text' || kind === 'json') &&
|
|
59
|
+
(uploaded === '' || uploaded === 'application/octet-stream')) {
|
|
60
|
+
return reservedMime;
|
|
61
|
+
}
|
|
62
|
+
return uploadedMime;
|
|
63
|
+
}
|
|
15
64
|
//# sourceMappingURL=mime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../../src/staged-upload/mime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../../src/staged-upload/mime.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAEtC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,WAAW;IACX,UAAU;IACV,iBAAiB;IACjB,wBAAwB;IACxB,YAAY;CACb,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAuB;IAC3D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC7E,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,8BAA8B,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAkC;IAClE,OAAO,IAAI,IAAI,OAAO,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAoC,EACpC,OAAoC;IAEpC,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,cAAc,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;YACjE,8CAA8C,CACjD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,IAAI,GAAqB,OAAO;IAEhC,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,UAAU,KAAK,UAAU,CAAC;IACnC,CAAC;IACD,OAAO,CACL,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/B,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/B,UAAU,KAAK,iBAAiB;QAChC,kFAAkF;QAClF,UAAU,KAAK,UAAU;QACzB,UAAU,KAAK,iBAAiB;QAChC,UAAU,KAAK,8BAA8B;QAC7C,UAAU,KAAK,0BAA0B,CAC1C,CAAC;AACJ,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,YAAoB,EACpB,IAAsB;IAEtB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACjD,IACE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC;QACpC,CAAC,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,0BAA0B,CAAC,EAC5D,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type StagedUploadKind } from './mime.js';
|
|
1
2
|
import type { StagedUploadStore } from './store.js';
|
|
2
3
|
import type { StagedUploadRequestResult } from './types.js';
|
|
3
4
|
export interface CreateStagedUploadRequestParams {
|
|
@@ -6,6 +7,7 @@ export interface CreateStagedUploadRequestParams {
|
|
|
6
7
|
mimeType: string;
|
|
7
8
|
byteLength?: number;
|
|
8
9
|
title?: string;
|
|
10
|
+
kind?: StagedUploadKind | string;
|
|
9
11
|
}
|
|
10
12
|
export declare function createStagedUploadRequest(store: StagedUploadStore, params: CreateStagedUploadRequestParams): Promise<StagedUploadRequestResult>;
|
|
11
13
|
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/staged-upload/request.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/staged-upload/request.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;CAClC;AAgCD,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,+BAA+B,GACtC,OAAO,CAAC,yBAAyB,CAAC,CA6BpC"}
|
|
@@ -2,21 +2,18 @@ import { requiresPipelineEncode } from '../contentful/pipeline-encode-gate.js';
|
|
|
2
2
|
import { getPublicOrigin } from '../hosted/oauth/config.js';
|
|
3
3
|
import { buildStagedUploadUrl, getUploadHmacSecret } from './hmac.js';
|
|
4
4
|
import { hostedStagedMaxBytes, STAGED_UPLOAD_TTL_SECONDS } from './limits.js';
|
|
5
|
+
import { parseStagedUploadKind } from './mime.js';
|
|
5
6
|
function shellQuote(value) {
|
|
6
7
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const origin = getPublicOrigin();
|
|
17
|
-
const exp = Math.floor(Date.now() / 1000) + STAGED_UPLOAD_TTL_SECONDS;
|
|
18
|
-
const uploadUrl = buildStagedUploadUrl(origin, uploadId, params.userId, exp, secret);
|
|
19
|
-
const consumeArgs = requiresPipelineEncode(params.mimeType, params.fileName)
|
|
9
|
+
function buildConsumeArgs(kind, uploadId, params) {
|
|
10
|
+
if (kind === 'text') {
|
|
11
|
+
return ['set', '--staged', uploadId];
|
|
12
|
+
}
|
|
13
|
+
if (kind === 'json') {
|
|
14
|
+
return ['create', 'from-json', '--staged', uploadId];
|
|
15
|
+
}
|
|
16
|
+
return requiresPipelineEncode(params.mimeType, params.fileName)
|
|
20
17
|
? ['media', 'prepare', '--staged-ids', uploadId]
|
|
21
18
|
: [
|
|
22
19
|
'asset',
|
|
@@ -29,6 +26,21 @@ export async function createStagedUploadRequest(store, params) {
|
|
|
29
26
|
params.fileName,
|
|
30
27
|
...(params.title ? ['--title', params.title] : []),
|
|
31
28
|
];
|
|
29
|
+
}
|
|
30
|
+
export async function createStagedUploadRequest(store, params) {
|
|
31
|
+
const kind = parseStagedUploadKind(typeof params.kind === 'string' ? params.kind : undefined);
|
|
32
|
+
const uploadId = await store.createPending({
|
|
33
|
+
userId: params.userId,
|
|
34
|
+
fileName: params.fileName,
|
|
35
|
+
mimeType: params.mimeType,
|
|
36
|
+
kind,
|
|
37
|
+
byteLength: params.byteLength,
|
|
38
|
+
});
|
|
39
|
+
const secret = getUploadHmacSecret();
|
|
40
|
+
const origin = getPublicOrigin();
|
|
41
|
+
const exp = Math.floor(Date.now() / 1000) + STAGED_UPLOAD_TTL_SECONDS;
|
|
42
|
+
const uploadUrl = buildStagedUploadUrl(origin, uploadId, params.userId, exp, secret);
|
|
43
|
+
const consumeArgs = buildConsumeArgs(kind, uploadId, params);
|
|
32
44
|
const curlCommand = `curl -f -X POST -F ${shellQuote(`file=@/path/to/${params.fileName}`)} ${shellQuote(uploadUrl)}`;
|
|
33
45
|
return {
|
|
34
46
|
uploadId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/staged-upload/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/staged-upload/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAyB,MAAM,WAAW,CAAC;AAazE,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAsB,EACtB,QAAgB,EAChB,MAAuC;IAEvC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,sBAAsB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC7D,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC;QAChD,CAAC,CAAC;YACE,OAAO;YACP,QAAQ;YACR,UAAU;YACV,QAAQ;YACR,QAAQ;YACR,MAAM,CAAC,QAAQ;YACf,aAAa;YACb,MAAM,CAAC,QAAQ;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC;AACR,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAwB,EACxB,MAAuC;IAEvC,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE9F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI;QACJ,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,yBAAyB,CAAC;IACtE,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAErF,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,sBAAsB,UAAU,CAAC,kBAAkB,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;IAErH,OAAO;QACL,QAAQ;QACR,SAAS;QACT,SAAS,EAAE,yBAAyB;QACpC,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,oBAAoB,EAAE;QAChC,WAAW;QACX,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { RedisClient } from '../session/session-store.js';
|
|
2
|
+
import { type StagedUploadKind } from './mime.js';
|
|
2
3
|
import type { StagedUploadConsumeResult, StagedUploadRecord } from './types.js';
|
|
3
4
|
export declare class StagedUploadStore {
|
|
4
5
|
private readonly redis;
|
|
@@ -10,6 +11,7 @@ export declare class StagedUploadStore {
|
|
|
10
11
|
userId: string;
|
|
11
12
|
fileName: string;
|
|
12
13
|
mimeType: string;
|
|
14
|
+
kind?: StagedUploadKind;
|
|
13
15
|
byteLength?: number;
|
|
14
16
|
}): Promise<string>;
|
|
15
17
|
storeFile(userId: string, uploadId: string, buffer: Buffer, mimeType: string): Promise<StagedUploadRecord>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/staged-upload/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/staged-upload/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAM/D,OAAO,EAGL,KAAK,gBAAgB,EAEtB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA0BhF,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAF5B,YACmB,KAAK,EAAE,WAAW,EAClB,SAAS,SAAa,EACrC;IAEJ,OAAO,CAAC,OAAO;IAIT,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnD;IAEK,aAAa,CAAC,MAAM,EAAE;QAC1B,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,gBAAgB,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqClB;IAEK,SAAS,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAgC7B;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAsBlF;IAED,2DAA2D;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAiBnF;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAEpF;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as crypto from 'node:crypto';
|
|
2
2
|
import { assertUploadBufferSize } from '../contentful/upload-limits.js';
|
|
3
3
|
import { hostedStagedMaxBytes, STAGED_UPLOAD_RATE_LIMIT_PER_HOUR, STAGED_UPLOAD_TTL_SECONDS, } from './limits.js';
|
|
4
|
-
import { isAllowedStagedMimeType } from './mime.js';
|
|
4
|
+
import { effectiveStagedMimeType, isAllowedStagedMimeType, stagedKindOrAsset, } from './mime.js';
|
|
5
5
|
const KEY_PREFIX = 'cms-edit:staged:';
|
|
6
6
|
const RATE_PREFIX = 'cms-edit:staged-rate:';
|
|
7
7
|
function rateKey(userId, hourBucket) {
|
|
@@ -46,8 +46,9 @@ export class StagedUploadStore {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
async createPending(params) {
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
const kind = params.kind ?? 'asset';
|
|
50
|
+
if (!isAllowedStagedMimeType(params.mimeType, kind)) {
|
|
51
|
+
throw new Error(`MIME type not allowed for staged upload (${kind}): ${params.mimeType}`);
|
|
51
52
|
}
|
|
52
53
|
if (params.byteLength !== undefined && params.byteLength > hostedStagedMaxBytes()) {
|
|
53
54
|
throw new Error(`Declared byteLength exceeds hosted staged upload limit (${String(hostedStagedMaxBytes())} bytes).`);
|
|
@@ -59,6 +60,7 @@ export class StagedUploadStore {
|
|
|
59
60
|
userId: params.userId,
|
|
60
61
|
fileName: params.fileName,
|
|
61
62
|
mimeType: params.mimeType,
|
|
63
|
+
kind,
|
|
62
64
|
byteLength: params.byteLength,
|
|
63
65
|
status: 'pending',
|
|
64
66
|
createdAt: Date.now(),
|
|
@@ -77,9 +79,6 @@ export class StagedUploadStore {
|
|
|
77
79
|
if (buffer.length > hostedStagedMaxBytes()) {
|
|
78
80
|
throw new Error(`File exceeds hosted staged upload limit (${String(hostedStagedMaxBytes())} bytes).`);
|
|
79
81
|
}
|
|
80
|
-
if (!isAllowedStagedMimeType(mimeType)) {
|
|
81
|
-
throw new Error(`MIME type not allowed for staged upload: ${mimeType}`);
|
|
82
|
-
}
|
|
83
82
|
const key = this.fullKey(userId, uploadId);
|
|
84
83
|
const existing = parseRecord(await this.redis.get(key));
|
|
85
84
|
if (!existing || existing.userId !== userId || existing.uploadId !== uploadId) {
|
|
@@ -88,10 +87,15 @@ export class StagedUploadStore {
|
|
|
88
87
|
if (existing.status === 'ready') {
|
|
89
88
|
throw new Error('Staged upload already received.');
|
|
90
89
|
}
|
|
90
|
+
const kind = existing.kind ?? 'asset';
|
|
91
|
+
const resolvedMime = effectiveStagedMimeType(mimeType, existing.mimeType, kind);
|
|
92
|
+
if (!isAllowedStagedMimeType(resolvedMime, kind)) {
|
|
93
|
+
throw new Error(`MIME type not allowed for staged upload (${kind}): ${resolvedMime}`);
|
|
94
|
+
}
|
|
91
95
|
const record = {
|
|
92
96
|
...existing,
|
|
93
97
|
status: 'ready',
|
|
94
|
-
mimeType,
|
|
98
|
+
mimeType: resolvedMime,
|
|
95
99
|
byteLength: buffer.length,
|
|
96
100
|
dataBase64: buffer.toString('base64'),
|
|
97
101
|
};
|
|
@@ -115,6 +119,7 @@ export class StagedUploadStore {
|
|
|
115
119
|
fileName: existing.fileName,
|
|
116
120
|
mimeType: existing.mimeType,
|
|
117
121
|
byteLength: buffer.length,
|
|
122
|
+
kind: stagedKindOrAsset(existing.kind),
|
|
118
123
|
};
|
|
119
124
|
}
|
|
120
125
|
/** Read staged bytes without deleting (pipeline fetch). */
|
|
@@ -133,6 +138,7 @@ export class StagedUploadStore {
|
|
|
133
138
|
fileName: existing.fileName,
|
|
134
139
|
mimeType: existing.mimeType,
|
|
135
140
|
byteLength: buffer.length,
|
|
141
|
+
kind: stagedKindOrAsset(existing.kind),
|
|
136
142
|
};
|
|
137
143
|
}
|
|
138
144
|
async getRecord(userId, uploadId) {
|