@valbuild/server 0.101.0 → 0.102.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.
|
@@ -20,7 +20,7 @@ export { extractImageMetadata, extractFileMetadata } from "./extractMetadata.js"
|
|
|
20
20
|
export { validateMetadata } from "./validateMetadata.js";
|
|
21
21
|
export { getValidationErrorFileRef } from "./getValidationErrorFileRef.js";
|
|
22
22
|
export { checkRemoteRef, downloadFileFromRemote, getCachedRemoteFileDir, getCachedRemoteFilePath, } from "./checkRemoteRef.js";
|
|
23
|
-
export { hasRemoteFileSchema } from "
|
|
23
|
+
export { hasRemoteFileSchema } from "@valbuild/core";
|
|
24
24
|
export { getFileExt } from "./getFileExt.js";
|
|
25
25
|
export { evalValConfigFile, findAndEvalValConfigFile, } from "./evalValConfigFile.js";
|
|
26
26
|
export { startValLogin, awaitValLoginConfirmation, persistPersonalAccessToken, ValLoginError, DEFAULT_LOGIN_HOST, DEFAULT_LOGIN_MAX_DURATION, DEFAULT_LOGIN_POLL_INTERVAL, } from "./login.js";
|
|
@@ -1562,6 +1562,35 @@ function resolveExistingJsonPath(moduleFilePath, importPath) {
|
|
|
1562
1562
|
* module errors (see `findNestedJsonValuesRecords`), so they can never reach
|
|
1563
1563
|
* here — if that guard is ever relaxed, this must become a recursive visitor or
|
|
1564
1564
|
* nested entries silently get no content validation at all.
|
|
1565
|
+
*
|
|
1566
|
+
* ## NOT validated, and it should be: the entry's FILE PATH
|
|
1567
|
+
*
|
|
1568
|
+
* The key↔file mapping is canonical. `getNewJsonEntryPaths` derives it, and both
|
|
1569
|
+
* write paths use it — the `jsonValues:extract-entry` fix and the patch commit:
|
|
1570
|
+
*
|
|
1571
|
+
* /content/kb.val.ts + key "kb-000" -> /content/kb/kb-000.val.json
|
|
1572
|
+
*
|
|
1573
|
+
* This function does not check it. It calls the thunk and validates whatever
|
|
1574
|
+
* comes back, so an entry may point at ANY file in the project and pass. The
|
|
1575
|
+
* repo's own fixture does exactly that — `examples/next/content/kb.val.ts` has
|
|
1576
|
+
* `"kb-000": c.json(() => import("./kb/entry-000.val.json"))`, where the
|
|
1577
|
+
* canonical path is `./kb/kb-000.val.json`, and `val validate` calls it valid.
|
|
1578
|
+
*
|
|
1579
|
+
* Two consequences, the first a live bug:
|
|
1580
|
+
*
|
|
1581
|
+
* - **A key rename writes to the DERIVED path**, which for a non-canonical entry
|
|
1582
|
+
* is not the file the old key was reading. The old file is orphaned and the new
|
|
1583
|
+
* key reads a file that was never written.
|
|
1584
|
+
* - It blocks localising entry staleness. `jsonEntriesSha` cannot say which entry
|
|
1585
|
+
* changed, so the client drops a whole module's loaded content; with the mapping
|
|
1586
|
+
* guaranteed, a changed file resolves to one key by derivation alone.
|
|
1587
|
+
*
|
|
1588
|
+
* The fix belongs here and needs no new machinery: the module's `.val.ts` is
|
|
1589
|
+
* already parsed (`ValSourceFileHandler`), so the import specifier is readable
|
|
1590
|
+
* from the AST — no `thunk.toString()`, which a bundler would defeat. A
|
|
1591
|
+
* `jsonValues:rename-entry-file` fix could move the file and rewrite the import,
|
|
1592
|
+
* exactly as `extract-entry` writes both. See `packages/ui/spa/stores/openquestions.md`
|
|
1593
|
+
* item 9b.
|
|
1565
1594
|
*/
|
|
1566
1595
|
async function validateJsonValuesEntries(schema, source, modulePath) {
|
|
1567
1596
|
const out = {};
|
|
@@ -5823,51 +5852,6 @@ function parsePersonalAccessTokenFile(content) {
|
|
|
5823
5852
|
}
|
|
5824
5853
|
}
|
|
5825
5854
|
|
|
5826
|
-
/**
|
|
5827
|
-
* Iterates through all schemas and find if there is 1 or more remote files in them
|
|
5828
|
-
*/
|
|
5829
|
-
function hasRemoteFileSchema(schema) {
|
|
5830
|
-
if (schema.type === "file" || schema.type === "image") {
|
|
5831
|
-
return !!schema.remote;
|
|
5832
|
-
} else if (schema.type === "richtext") {
|
|
5833
|
-
var _schema$options;
|
|
5834
|
-
if (typeof ((_schema$options = schema.options) === null || _schema$options === void 0 || (_schema$options = _schema$options.inline) === null || _schema$options === void 0 ? void 0 : _schema$options.img) === "object") {
|
|
5835
|
-
return hasRemoteFileSchema(schema.options.inline.img);
|
|
5836
|
-
}
|
|
5837
|
-
return false;
|
|
5838
|
-
} else if (schema.type === "array" || schema.type === "record") {
|
|
5839
|
-
return hasRemoteFileSchema(schema.item);
|
|
5840
|
-
} else if (schema.type === "object") {
|
|
5841
|
-
for (const key in schema.items) {
|
|
5842
|
-
const hasRemoteFile = hasRemoteFileSchema(schema.items[key]);
|
|
5843
|
-
if (hasRemoteFile) {
|
|
5844
|
-
return true;
|
|
5845
|
-
}
|
|
5846
|
-
}
|
|
5847
|
-
return false;
|
|
5848
|
-
} else if (schema.type === "union") {
|
|
5849
|
-
const unionStringSchema = typeof schema.key === "object" && schema.key.type === "literal" ? schema : undefined;
|
|
5850
|
-
const unionObjectSchema = typeof schema.key === "string" ? schema : undefined;
|
|
5851
|
-
if (unionStringSchema) {
|
|
5852
|
-
return false;
|
|
5853
|
-
}
|
|
5854
|
-
if (unionObjectSchema) {
|
|
5855
|
-
for (const key in unionObjectSchema.items) {
|
|
5856
|
-
const hasRemoteFile = hasRemoteFileSchema(unionObjectSchema.items[key]);
|
|
5857
|
-
if (hasRemoteFile) {
|
|
5858
|
-
return true;
|
|
5859
|
-
}
|
|
5860
|
-
}
|
|
5861
|
-
}
|
|
5862
|
-
return false;
|
|
5863
|
-
} else if (schema.type === "boolean" || schema.type === "number" || schema.type === "string" || schema.type === "literal" || schema.type === "date" || schema.type === "dateTime" || schema.type === "color" || schema.type === "keyOf" || schema.type === "route") {
|
|
5864
|
-
return false;
|
|
5865
|
-
} else {
|
|
5866
|
-
const exhaustiveCheck = schema;
|
|
5867
|
-
throw new Error(`Unexpected schema: ${JSON.stringify(exhaustiveCheck)}`);
|
|
5868
|
-
}
|
|
5869
|
-
}
|
|
5870
|
-
|
|
5871
5855
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
5872
5856
|
const ValServer = (valModules, options, callbacks) => {
|
|
5873
5857
|
const AIContentBlock = z.z.union([z.z.object({
|
|
@@ -7466,7 +7450,11 @@ const ValServer = (valModules, options, callbacks) => {
|
|
|
7466
7450
|
sourceFilePatchErrors: Object.fromEntries(Object.entries(preparedCommit.sourceFilePatchErrors).map(([key, errors]) => [key, errors.map(e => ({
|
|
7467
7451
|
message: formatPatchSourceError(e)
|
|
7468
7452
|
}))])),
|
|
7469
|
-
binaryFilePatchErrors: preparedCommit.binaryFilePatchErrors
|
|
7453
|
+
binaryFilePatchErrors: preparedCommit.binaryFilePatchErrors,
|
|
7454
|
+
// Attributed to the patch that caused it, so the studio can
|
|
7455
|
+
// name the offending change and offer to remove it instead of
|
|
7456
|
+
// leaving the editor with "Failed to publish changes".
|
|
7457
|
+
unappliablePatches: preparedCommit.unappliablePatches
|
|
7470
7458
|
}
|
|
7471
7459
|
}
|
|
7472
7460
|
};
|
|
@@ -8580,7 +8568,7 @@ function getIsRemoteRequired(schemas) {
|
|
|
8580
8568
|
for (const moduleFilePathS in schemas) {
|
|
8581
8569
|
const moduleFilePath = moduleFilePathS;
|
|
8582
8570
|
const schema = schemas[moduleFilePath]["executeSerialize"]();
|
|
8583
|
-
const isRemoteRequired = hasRemoteFileSchema(schema);
|
|
8571
|
+
const isRemoteRequired = core.hasRemoteFileSchema(schema);
|
|
8584
8572
|
if (isRemoteRequired) {
|
|
8585
8573
|
return true;
|
|
8586
8574
|
}
|
|
@@ -10589,6 +10577,10 @@ function readCapturedReport(snapshotDir) {
|
|
|
10589
10577
|
return JSON.parse(fs__default["default"].readFileSync(reportPath, "utf-8"));
|
|
10590
10578
|
}
|
|
10591
10579
|
|
|
10580
|
+
Object.defineProperty(exports, 'hasRemoteFileSchema', {
|
|
10581
|
+
enumerable: true,
|
|
10582
|
+
get: function () { return core.hasRemoteFileSchema; }
|
|
10583
|
+
});
|
|
10592
10584
|
exports.DEFAULT_LOGIN_HOST = DEFAULT_LOGIN_HOST;
|
|
10593
10585
|
exports.DEFAULT_LOGIN_MAX_DURATION = DEFAULT_LOGIN_MAX_DURATION;
|
|
10594
10586
|
exports.DEFAULT_LOGIN_POLL_INTERVAL = DEFAULT_LOGIN_POLL_INTERVAL;
|
|
@@ -10629,7 +10621,6 @@ exports.getModulePathRange = getModulePathRange;
|
|
|
10629
10621
|
exports.getPersonalAccessTokenPath = getPersonalAccessTokenPath;
|
|
10630
10622
|
exports.getSettings = getSettings;
|
|
10631
10623
|
exports.getValidationErrorFileRef = getValidationErrorFileRef;
|
|
10632
|
-
exports.hasRemoteFileSchema = hasRemoteFileSchema;
|
|
10633
10624
|
exports.loadValModules = loadValModules;
|
|
10634
10625
|
exports.parsePersonalAccessTokenFile = parsePersonalAccessTokenFile;
|
|
10635
10626
|
exports.patchSourceFile = patchSourceFile;
|
|
@@ -1562,6 +1562,35 @@ function resolveExistingJsonPath(moduleFilePath, importPath) {
|
|
|
1562
1562
|
* module errors (see `findNestedJsonValuesRecords`), so they can never reach
|
|
1563
1563
|
* here — if that guard is ever relaxed, this must become a recursive visitor or
|
|
1564
1564
|
* nested entries silently get no content validation at all.
|
|
1565
|
+
*
|
|
1566
|
+
* ## NOT validated, and it should be: the entry's FILE PATH
|
|
1567
|
+
*
|
|
1568
|
+
* The key↔file mapping is canonical. `getNewJsonEntryPaths` derives it, and both
|
|
1569
|
+
* write paths use it — the `jsonValues:extract-entry` fix and the patch commit:
|
|
1570
|
+
*
|
|
1571
|
+
* /content/kb.val.ts + key "kb-000" -> /content/kb/kb-000.val.json
|
|
1572
|
+
*
|
|
1573
|
+
* This function does not check it. It calls the thunk and validates whatever
|
|
1574
|
+
* comes back, so an entry may point at ANY file in the project and pass. The
|
|
1575
|
+
* repo's own fixture does exactly that — `examples/next/content/kb.val.ts` has
|
|
1576
|
+
* `"kb-000": c.json(() => import("./kb/entry-000.val.json"))`, where the
|
|
1577
|
+
* canonical path is `./kb/kb-000.val.json`, and `val validate` calls it valid.
|
|
1578
|
+
*
|
|
1579
|
+
* Two consequences, the first a live bug:
|
|
1580
|
+
*
|
|
1581
|
+
* - **A key rename writes to the DERIVED path**, which for a non-canonical entry
|
|
1582
|
+
* is not the file the old key was reading. The old file is orphaned and the new
|
|
1583
|
+
* key reads a file that was never written.
|
|
1584
|
+
* - It blocks localising entry staleness. `jsonEntriesSha` cannot say which entry
|
|
1585
|
+
* changed, so the client drops a whole module's loaded content; with the mapping
|
|
1586
|
+
* guaranteed, a changed file resolves to one key by derivation alone.
|
|
1587
|
+
*
|
|
1588
|
+
* The fix belongs here and needs no new machinery: the module's `.val.ts` is
|
|
1589
|
+
* already parsed (`ValSourceFileHandler`), so the import specifier is readable
|
|
1590
|
+
* from the AST — no `thunk.toString()`, which a bundler would defeat. A
|
|
1591
|
+
* `jsonValues:rename-entry-file` fix could move the file and rewrite the import,
|
|
1592
|
+
* exactly as `extract-entry` writes both. See `packages/ui/spa/stores/openquestions.md`
|
|
1593
|
+
* item 9b.
|
|
1565
1594
|
*/
|
|
1566
1595
|
async function validateJsonValuesEntries(schema, source, modulePath) {
|
|
1567
1596
|
const out = {};
|
|
@@ -5823,51 +5852,6 @@ function parsePersonalAccessTokenFile(content) {
|
|
|
5823
5852
|
}
|
|
5824
5853
|
}
|
|
5825
5854
|
|
|
5826
|
-
/**
|
|
5827
|
-
* Iterates through all schemas and find if there is 1 or more remote files in them
|
|
5828
|
-
*/
|
|
5829
|
-
function hasRemoteFileSchema(schema) {
|
|
5830
|
-
if (schema.type === "file" || schema.type === "image") {
|
|
5831
|
-
return !!schema.remote;
|
|
5832
|
-
} else if (schema.type === "richtext") {
|
|
5833
|
-
var _schema$options;
|
|
5834
|
-
if (typeof ((_schema$options = schema.options) === null || _schema$options === void 0 || (_schema$options = _schema$options.inline) === null || _schema$options === void 0 ? void 0 : _schema$options.img) === "object") {
|
|
5835
|
-
return hasRemoteFileSchema(schema.options.inline.img);
|
|
5836
|
-
}
|
|
5837
|
-
return false;
|
|
5838
|
-
} else if (schema.type === "array" || schema.type === "record") {
|
|
5839
|
-
return hasRemoteFileSchema(schema.item);
|
|
5840
|
-
} else if (schema.type === "object") {
|
|
5841
|
-
for (const key in schema.items) {
|
|
5842
|
-
const hasRemoteFile = hasRemoteFileSchema(schema.items[key]);
|
|
5843
|
-
if (hasRemoteFile) {
|
|
5844
|
-
return true;
|
|
5845
|
-
}
|
|
5846
|
-
}
|
|
5847
|
-
return false;
|
|
5848
|
-
} else if (schema.type === "union") {
|
|
5849
|
-
const unionStringSchema = typeof schema.key === "object" && schema.key.type === "literal" ? schema : undefined;
|
|
5850
|
-
const unionObjectSchema = typeof schema.key === "string" ? schema : undefined;
|
|
5851
|
-
if (unionStringSchema) {
|
|
5852
|
-
return false;
|
|
5853
|
-
}
|
|
5854
|
-
if (unionObjectSchema) {
|
|
5855
|
-
for (const key in unionObjectSchema.items) {
|
|
5856
|
-
const hasRemoteFile = hasRemoteFileSchema(unionObjectSchema.items[key]);
|
|
5857
|
-
if (hasRemoteFile) {
|
|
5858
|
-
return true;
|
|
5859
|
-
}
|
|
5860
|
-
}
|
|
5861
|
-
}
|
|
5862
|
-
return false;
|
|
5863
|
-
} else if (schema.type === "boolean" || schema.type === "number" || schema.type === "string" || schema.type === "literal" || schema.type === "date" || schema.type === "dateTime" || schema.type === "color" || schema.type === "keyOf" || schema.type === "route") {
|
|
5864
|
-
return false;
|
|
5865
|
-
} else {
|
|
5866
|
-
const exhaustiveCheck = schema;
|
|
5867
|
-
throw new Error(`Unexpected schema: ${JSON.stringify(exhaustiveCheck)}`);
|
|
5868
|
-
}
|
|
5869
|
-
}
|
|
5870
|
-
|
|
5871
5855
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
5872
5856
|
const ValServer = (valModules, options, callbacks) => {
|
|
5873
5857
|
const AIContentBlock = z.z.union([z.z.object({
|
|
@@ -7466,7 +7450,11 @@ const ValServer = (valModules, options, callbacks) => {
|
|
|
7466
7450
|
sourceFilePatchErrors: Object.fromEntries(Object.entries(preparedCommit.sourceFilePatchErrors).map(([key, errors]) => [key, errors.map(e => ({
|
|
7467
7451
|
message: formatPatchSourceError(e)
|
|
7468
7452
|
}))])),
|
|
7469
|
-
binaryFilePatchErrors: preparedCommit.binaryFilePatchErrors
|
|
7453
|
+
binaryFilePatchErrors: preparedCommit.binaryFilePatchErrors,
|
|
7454
|
+
// Attributed to the patch that caused it, so the studio can
|
|
7455
|
+
// name the offending change and offer to remove it instead of
|
|
7456
|
+
// leaving the editor with "Failed to publish changes".
|
|
7457
|
+
unappliablePatches: preparedCommit.unappliablePatches
|
|
7470
7458
|
}
|
|
7471
7459
|
}
|
|
7472
7460
|
};
|
|
@@ -8580,7 +8568,7 @@ function getIsRemoteRequired(schemas) {
|
|
|
8580
8568
|
for (const moduleFilePathS in schemas) {
|
|
8581
8569
|
const moduleFilePath = moduleFilePathS;
|
|
8582
8570
|
const schema = schemas[moduleFilePath]["executeSerialize"]();
|
|
8583
|
-
const isRemoteRequired = hasRemoteFileSchema(schema);
|
|
8571
|
+
const isRemoteRequired = core.hasRemoteFileSchema(schema);
|
|
8584
8572
|
if (isRemoteRequired) {
|
|
8585
8573
|
return true;
|
|
8586
8574
|
}
|
|
@@ -10589,6 +10577,10 @@ function readCapturedReport(snapshotDir) {
|
|
|
10589
10577
|
return JSON.parse(fs__default["default"].readFileSync(reportPath, "utf-8"));
|
|
10590
10578
|
}
|
|
10591
10579
|
|
|
10580
|
+
Object.defineProperty(exports, 'hasRemoteFileSchema', {
|
|
10581
|
+
enumerable: true,
|
|
10582
|
+
get: function () { return core.hasRemoteFileSchema; }
|
|
10583
|
+
});
|
|
10592
10584
|
exports.DEFAULT_LOGIN_HOST = DEFAULT_LOGIN_HOST;
|
|
10593
10585
|
exports.DEFAULT_LOGIN_MAX_DURATION = DEFAULT_LOGIN_MAX_DURATION;
|
|
10594
10586
|
exports.DEFAULT_LOGIN_POLL_INTERVAL = DEFAULT_LOGIN_POLL_INTERVAL;
|
|
@@ -10629,7 +10621,6 @@ exports.getModulePathRange = getModulePathRange;
|
|
|
10629
10621
|
exports.getPersonalAccessTokenPath = getPersonalAccessTokenPath;
|
|
10630
10622
|
exports.getSettings = getSettings;
|
|
10631
10623
|
exports.getValidationErrorFileRef = getValidationErrorFileRef;
|
|
10632
|
-
exports.hasRemoteFileSchema = hasRemoteFileSchema;
|
|
10633
10624
|
exports.loadValModules = loadValModules;
|
|
10634
10625
|
exports.parsePersonalAccessTokenFile = parsePersonalAccessTokenFile;
|
|
10635
10626
|
exports.patchSourceFile = patchSourceFile;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import ts from 'typescript';
|
|
2
2
|
import { pipe, result, array } from '@valbuild/core/fp';
|
|
3
|
-
import { FILE_REF_PROP, FILE_REF_SUBTYPE_TAG, VAL_EXTENSION, derefPatch, RecordSchema, Internal, extractValModules, ImageSchema, DEFAULT_CONTENT_HOST } from '@valbuild/core';
|
|
3
|
+
import { FILE_REF_PROP, FILE_REF_SUBTYPE_TAG, VAL_EXTENSION, derefPatch, RecordSchema, Internal, extractValModules, ImageSchema, DEFAULT_CONTENT_HOST, hasRemoteFileSchema } from '@valbuild/core';
|
|
4
|
+
export { hasRemoteFileSchema } from '@valbuild/core';
|
|
4
5
|
import { PatchError, deepEqual, parseAndValidateArrayIndex, isNotRoot, applyPatch, JSONOps, deepClone, sourceToPatchPath } from '@valbuild/core/patch';
|
|
5
6
|
import * as path from 'path';
|
|
6
7
|
import path__default from 'path';
|
|
@@ -1528,6 +1529,35 @@ function resolveExistingJsonPath(moduleFilePath, importPath) {
|
|
|
1528
1529
|
* module errors (see `findNestedJsonValuesRecords`), so they can never reach
|
|
1529
1530
|
* here — if that guard is ever relaxed, this must become a recursive visitor or
|
|
1530
1531
|
* nested entries silently get no content validation at all.
|
|
1532
|
+
*
|
|
1533
|
+
* ## NOT validated, and it should be: the entry's FILE PATH
|
|
1534
|
+
*
|
|
1535
|
+
* The key↔file mapping is canonical. `getNewJsonEntryPaths` derives it, and both
|
|
1536
|
+
* write paths use it — the `jsonValues:extract-entry` fix and the patch commit:
|
|
1537
|
+
*
|
|
1538
|
+
* /content/kb.val.ts + key "kb-000" -> /content/kb/kb-000.val.json
|
|
1539
|
+
*
|
|
1540
|
+
* This function does not check it. It calls the thunk and validates whatever
|
|
1541
|
+
* comes back, so an entry may point at ANY file in the project and pass. The
|
|
1542
|
+
* repo's own fixture does exactly that — `examples/next/content/kb.val.ts` has
|
|
1543
|
+
* `"kb-000": c.json(() => import("./kb/entry-000.val.json"))`, where the
|
|
1544
|
+
* canonical path is `./kb/kb-000.val.json`, and `val validate` calls it valid.
|
|
1545
|
+
*
|
|
1546
|
+
* Two consequences, the first a live bug:
|
|
1547
|
+
*
|
|
1548
|
+
* - **A key rename writes to the DERIVED path**, which for a non-canonical entry
|
|
1549
|
+
* is not the file the old key was reading. The old file is orphaned and the new
|
|
1550
|
+
* key reads a file that was never written.
|
|
1551
|
+
* - It blocks localising entry staleness. `jsonEntriesSha` cannot say which entry
|
|
1552
|
+
* changed, so the client drops a whole module's loaded content; with the mapping
|
|
1553
|
+
* guaranteed, a changed file resolves to one key by derivation alone.
|
|
1554
|
+
*
|
|
1555
|
+
* The fix belongs here and needs no new machinery: the module's `.val.ts` is
|
|
1556
|
+
* already parsed (`ValSourceFileHandler`), so the import specifier is readable
|
|
1557
|
+
* from the AST — no `thunk.toString()`, which a bundler would defeat. A
|
|
1558
|
+
* `jsonValues:rename-entry-file` fix could move the file and rewrite the import,
|
|
1559
|
+
* exactly as `extract-entry` writes both. See `packages/ui/spa/stores/openquestions.md`
|
|
1560
|
+
* item 9b.
|
|
1531
1561
|
*/
|
|
1532
1562
|
async function validateJsonValuesEntries(schema, source, modulePath) {
|
|
1533
1563
|
const out = {};
|
|
@@ -5789,51 +5819,6 @@ function parsePersonalAccessTokenFile(content) {
|
|
|
5789
5819
|
}
|
|
5790
5820
|
}
|
|
5791
5821
|
|
|
5792
|
-
/**
|
|
5793
|
-
* Iterates through all schemas and find if there is 1 or more remote files in them
|
|
5794
|
-
*/
|
|
5795
|
-
function hasRemoteFileSchema(schema) {
|
|
5796
|
-
if (schema.type === "file" || schema.type === "image") {
|
|
5797
|
-
return !!schema.remote;
|
|
5798
|
-
} else if (schema.type === "richtext") {
|
|
5799
|
-
var _schema$options;
|
|
5800
|
-
if (typeof ((_schema$options = schema.options) === null || _schema$options === void 0 || (_schema$options = _schema$options.inline) === null || _schema$options === void 0 ? void 0 : _schema$options.img) === "object") {
|
|
5801
|
-
return hasRemoteFileSchema(schema.options.inline.img);
|
|
5802
|
-
}
|
|
5803
|
-
return false;
|
|
5804
|
-
} else if (schema.type === "array" || schema.type === "record") {
|
|
5805
|
-
return hasRemoteFileSchema(schema.item);
|
|
5806
|
-
} else if (schema.type === "object") {
|
|
5807
|
-
for (const key in schema.items) {
|
|
5808
|
-
const hasRemoteFile = hasRemoteFileSchema(schema.items[key]);
|
|
5809
|
-
if (hasRemoteFile) {
|
|
5810
|
-
return true;
|
|
5811
|
-
}
|
|
5812
|
-
}
|
|
5813
|
-
return false;
|
|
5814
|
-
} else if (schema.type === "union") {
|
|
5815
|
-
const unionStringSchema = typeof schema.key === "object" && schema.key.type === "literal" ? schema : undefined;
|
|
5816
|
-
const unionObjectSchema = typeof schema.key === "string" ? schema : undefined;
|
|
5817
|
-
if (unionStringSchema) {
|
|
5818
|
-
return false;
|
|
5819
|
-
}
|
|
5820
|
-
if (unionObjectSchema) {
|
|
5821
|
-
for (const key in unionObjectSchema.items) {
|
|
5822
|
-
const hasRemoteFile = hasRemoteFileSchema(unionObjectSchema.items[key]);
|
|
5823
|
-
if (hasRemoteFile) {
|
|
5824
|
-
return true;
|
|
5825
|
-
}
|
|
5826
|
-
}
|
|
5827
|
-
}
|
|
5828
|
-
return false;
|
|
5829
|
-
} else if (schema.type === "boolean" || schema.type === "number" || schema.type === "string" || schema.type === "literal" || schema.type === "date" || schema.type === "dateTime" || schema.type === "color" || schema.type === "keyOf" || schema.type === "route") {
|
|
5830
|
-
return false;
|
|
5831
|
-
} else {
|
|
5832
|
-
const exhaustiveCheck = schema;
|
|
5833
|
-
throw new Error(`Unexpected schema: ${JSON.stringify(exhaustiveCheck)}`);
|
|
5834
|
-
}
|
|
5835
|
-
}
|
|
5836
|
-
|
|
5837
5822
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
5838
5823
|
const ValServer = (valModules, options, callbacks) => {
|
|
5839
5824
|
const AIContentBlock = z.union([z.object({
|
|
@@ -7432,7 +7417,11 @@ const ValServer = (valModules, options, callbacks) => {
|
|
|
7432
7417
|
sourceFilePatchErrors: Object.fromEntries(Object.entries(preparedCommit.sourceFilePatchErrors).map(([key, errors]) => [key, errors.map(e => ({
|
|
7433
7418
|
message: formatPatchSourceError(e)
|
|
7434
7419
|
}))])),
|
|
7435
|
-
binaryFilePatchErrors: preparedCommit.binaryFilePatchErrors
|
|
7420
|
+
binaryFilePatchErrors: preparedCommit.binaryFilePatchErrors,
|
|
7421
|
+
// Attributed to the patch that caused it, so the studio can
|
|
7422
|
+
// name the offending change and offer to remove it instead of
|
|
7423
|
+
// leaving the editor with "Failed to publish changes".
|
|
7424
|
+
unappliablePatches: preparedCommit.unappliablePatches
|
|
7436
7425
|
}
|
|
7437
7426
|
}
|
|
7438
7427
|
};
|
|
@@ -10555,4 +10544,4 @@ function readCapturedReport(snapshotDir) {
|
|
|
10555
10544
|
return JSON.parse(fs.readFileSync(reportPath, "utf-8"));
|
|
10556
10545
|
}
|
|
10557
10546
|
|
|
10558
|
-
export { DEFAULT_LOGIN_HOST, DEFAULT_LOGIN_MAX_DURATION, DEFAULT_LOGIN_POLL_INTERVAL, Service, ValFSHost, ValLoginError, ValModuleLoader, ValOpsFS, ValOpsHttp, ValSourceFileHandler, analyzeValModule, awaitValLoginConfirmation, checkRemoteRef, compareWithCapturedReport, createFixPatch, createJsonEntryPathMap, createModulePathMap, createService, createValApiRouter, createValServer, decodeJwt, downloadFileFromRemote, encodeJwt, evalValConfigFile, extractFileMetadata, extractImageMetadata, extractJsonValuesEntry, findAndEvalValConfigFile, findJsonEntryFilePath, formatPatchSourceError, formatSyntaxErrorTree, getCachedRemoteFileDir, getCachedRemoteFilePath, getCompilerOptions, getExpire, getFileExt, getModulePathRange, getPersonalAccessTokenPath, getSettings, getValidationErrorFileRef,
|
|
10547
|
+
export { DEFAULT_LOGIN_HOST, DEFAULT_LOGIN_MAX_DURATION, DEFAULT_LOGIN_POLL_INTERVAL, Service, ValFSHost, ValLoginError, ValModuleLoader, ValOpsFS, ValOpsHttp, ValSourceFileHandler, analyzeValModule, awaitValLoginConfirmation, checkRemoteRef, compareWithCapturedReport, createFixPatch, createJsonEntryPathMap, createModulePathMap, createService, createValApiRouter, createValServer, decodeJwt, downloadFileFromRemote, encodeJwt, evalValConfigFile, extractFileMetadata, extractImageMetadata, extractJsonValuesEntry, findAndEvalValConfigFile, findJsonEntryFilePath, formatPatchSourceError, formatSyntaxErrorTree, getCachedRemoteFileDir, getCachedRemoteFilePath, getCompilerOptions, getExpire, getFileExt, getModulePathRange, getPersonalAccessTokenPath, getSettings, getValidationErrorFileRef, loadValModules, parsePersonalAccessTokenFile, patchSourceFile, persistPersonalAccessToken, readCapturedReport, replaySnapshot, safeReadGit, startValLogin, uploadRemoteFile, validateMetadata };
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"./package.json": "./package.json"
|
|
17
17
|
},
|
|
18
18
|
"types": "dist/valbuild-server.cjs.d.ts",
|
|
19
|
-
"version": "0.
|
|
19
|
+
"version": "0.102.0",
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@prettier/sync": "^0.6.1",
|
|
22
22
|
"@types/jest": "^30.0.0"
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"typescript": "^5.9.3",
|
|
30
30
|
"zod": "^4.3.5",
|
|
31
31
|
"zod-validation-error": "^5.0.0",
|
|
32
|
-
"@valbuild/core": "0.
|
|
33
|
-
"@valbuild/shared": "0.
|
|
34
|
-
"@valbuild/ui": "0.
|
|
32
|
+
"@valbuild/core": "0.102.0",
|
|
33
|
+
"@valbuild/shared": "0.102.0",
|
|
34
|
+
"@valbuild/ui": "0.102.0"
|
|
35
35
|
},
|
|
36
36
|
"engines": {
|
|
37
37
|
"node": ">=18.17.0"
|