diff --git a/dist/datamodel/parser/ProjectParser.d.ts b/dist/datamodel/parser/ProjectParser.d.ts index 1ce648a..c4c9bc2 100644 --- a/dist/datamodel/parser/ProjectParser.d.ts +++ b/dist/datamodel/parser/ProjectParser.d.ts @@ -81,9 +81,9 @@ export interface ParsedProject { /** * The store's declared `MetadataType` — how the project's metadata is laid out on * disk. '' when the store declares none and the layout could not be inferred. - * Two are read: `fixedPathV2` and `distributed`. Anything else is reported through - * `warnings` rather than read, because guessing at a layout produces a project - * that looks complete and is not. + * Three are read: `fixedPathV2`, `distributed` and `monolithic`. Anything else is + * reported through `warnings` rather than read, because guessing at a layout + * produces a project that looks complete and is not. */ format: string; files: ProjectFile[]; diff --git a/dist/datamodel/parser/ProjectParser.d.ts.map b/dist/datamodel/parser/ProjectParser.d.ts.map index ca6b49a..c501e88 100644 --- a/dist/datamodel/parser/ProjectParser.d.ts.map +++ b/dist/datamodel/parser/ProjectParser.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ProjectParser.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/ProjectParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhE,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB;;;;;;;;OAQG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,OAAO,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB;;;;OAIG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oDAAoD;IACpD,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAC3C,cAAc,EAAE,oBAAoB,EAAE,CAAC;IACvC;;;;OAIG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AA8GD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAqJ9F"} \ No newline at end of file +{"version":3,"file":"ProjectParser.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/ProjectParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhE,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB;;;;;;;;OAQG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,OAAO,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB;;;;OAIG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oDAAoD;IACpD,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAC3C,cAAc,EAAE,oBAAoB,EAAE,CAAC;IACvC;;;;OAIG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAkJD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CA8K9F"} \ No newline at end of file diff --git a/dist/datamodel/parser/ProjectParser.js b/dist/datamodel/parser/ProjectParser.js index 81a6755..2973c01 100644 --- a/dist/datamodel/parser/ProjectParser.js +++ b/dist/datamodel/parser/ProjectParser.js @@ -1,5 +1,5 @@ // Copyright 2026 The MathWorks, Inc. -import { readProjectXml } from './XmlReader.js'; +import { readProjectXml, ATTRIBUTE_PREFIX, TEXT_KEY } from './XmlReader.js'; import { reasonOf } from './ParseWarning.js'; const PROJECT_PREFIX = 'resources/project/'; /** The store manifest, which declares the layout the rest of the store is in. */ @@ -7,6 +7,14 @@ const MANIFEST = 'Project.xml'; /** The layouts this reader walks. See `ParsedProject.format`. */ const FIXED_PATH_V2 = 'fixedPathV2'; const DISTRIBUTED = 'distributed'; +const MONOLITHIC = 'monolithic'; +/** + * The root element of a `monolithic` store's single document. + * + * Lowercase, and the only root element in any layout that is not `` — which is + * what makes it the structural signal for "this one document is the whole store". + */ +const MONOLITHIC_ROOT = 'project'; /** * Collection types whose `type="Reference"` children are NOT project references. * @@ -63,6 +71,10 @@ export function parseProject(files, projectName) { try { // Index every parseable Info doc by its relpath (project-relative). const index = new Map(); + // The one document of a `monolithic` store, when this store is one. A store holds + // either this or the index and never both: the monolithic document IS the store, + // so there are no sidecars left to index. + let monolith = null; for (const [relPath, content] of Object.entries(files)) { if (!relPath.startsWith(PROJECT_PREFIX)) { continue; @@ -70,13 +82,27 @@ export function parseProject(files, projectName) { if (!relPath.endsWith('.xml')) { continue; } - const info = parseInfo(content, relPath, warnings); + const doc = readStoreDoc(content, relPath, warnings); + if (!doc) { + continue; + } + const info = infoRootOf(doc); if (info) { // Store keyed relative to resources/project/ for simpler dir math. index.set(relPath.slice(PROJECT_PREFIX.length), info); + continue; + } + // A `` root rather than an `` one: a whole store in one nested + // document. First one wins — a store has exactly one, and preferring the first + // keeps the choice from depending on `files`' iteration order. + if (!monolith) { + const root = doc[MONOLITHIC_ROOT]; + if (root !== null && typeof root === 'object') { + monolith = root; + } } } - if (index.size === 0) { + if (!monolith && index.size === 0) { // Every collection below reads out of this index, so an empty one means the // whole result is empty — and a `.prj` always has a store, so reaching here // is either the wrong kind of file or a store that did not survive its trip. @@ -104,15 +130,23 @@ export function parseProject(files, projectName) { }); return result; } - // The manifest declares which layout the rest of the store is in. A store that - // declares one we cannot walk is reported and NOT guessed at: the collection - // readers below would find nothing in it and return a project that looks - // complete and empty, which is the one outcome a user cannot tell from a fact. - const declared = index.get(MANIFEST)?.['@_MetadataType'] ?? ''; - const layoutName = declared || inferLayout(index); - if (layoutName !== FIXED_PATH_V2 && layoutName !== DISTRIBUTED) { + // Which layout the store is in. The KIND of store is settled structurally, by + // the root element, before the declared `MetadataType` is consulted at all: a + // monolithic store's manifest IS the store, so there is no separate document to + // ask, and a `` root is the only root that is not ``. + // + // A store that declares a layout we cannot walk is reported and NOT guessed at: + // the collection readers below would find nothing in it and return a project + // that looks complete and empty, which is the one outcome a user cannot tell + // from a fact about their own project. + const declared = (monolith ?? index.get(MANIFEST))?.['@_MetadataType'] ?? ''; + const layoutName = declared || (monolith ? MONOLITHIC : inferLayout(index)); + const layout = layoutFor(layoutName, monolith, index); + if (!layout) { // The name is still worth salvaging — it is what a host titles the view with, - // and it reads out of the index without knowing the layout. + // and it reads out of the index without knowing the layout. A monolithic store + // has no index to salvage from, and needs none: its document is named after + // the project, so `projectName` is already the name a user would expect. result.name = salvageName(index) ?? projectName; warnings.push({ code: 'source-empty', @@ -125,7 +159,6 @@ export function parseProject(files, projectName) { return result; } result.format = layoutName; - const layout = layoutName === FIXED_PATH_V2 ? fixedPathV2Layout(index) : distributedLayout(index); const rootEntities = layout.roots(); result.name = resolveNameFrom(rootEntities) ?? projectName; // Collections are matched on type AND location. Two collections of one type can @@ -197,12 +230,35 @@ export function parseProject(files, projectName) { return emptyResult(projectName, warnings); } } +/** + * The walker for a layout, or null for one this reader does not walk. + * + * `monolithic` is answered from the document and not from the name: a store that + * DECLARES monolithic and holds no `` document has nothing to walk, and + * falling back to the sidecar index would read it under a layout it has just said it + * is not in. That is the same refusal the other two names get for an unknown value, + * reached by a different route. + */ +function layoutFor(name, monolith, index) { + if (name === MONOLITHIC) { + return monolith ? monolithicLayout(monolith) : null; + } + if (name === FIXED_PATH_V2) { + return fixedPathV2Layout(index); + } + if (name === DISTRIBUTED) { + return distributedLayout(index); + } + return null; +} /** * Which layout a store with no manifest is in. * * Every store this reader has seen carries `Project.xml`, so this is the fallback * for one that lost it: `root/` is the entry directory `fixedPathV2` and nothing * else uses, and a `.type.` in a top-level name is `distributed`'s own spelling. + * `monolithic` is not inferred here — it is settled before this is called, since its + * document is the manifest and cannot be missing without the store being gone. */ function inferLayout(index) { for (const key of index.keys()) { @@ -259,16 +315,16 @@ function resolveNameFrom(rootEntities) { return null; } /** - * One `` document, or null when there is nothing here to index. + * One store document parsed, or null when it is CORRUPT — truncated, wrongly + * encoded, half-written — in which case the entities it described are lost and it + * warns. * - * Null covers two cases that must NOT be reported alike. A document that fails to - * parse, or that yields no elements at all, is CORRUPT — truncated, wrongly - * encoded, half-written — and the entity it described is lost, so it warns. A - * document that parses into elements but has no `` root is a sidecar this - * version does not model; newer releases add them, and warning on one would put a - * count on every project written by a release newer than this reader. + * Kept apart from `infoRootOf` because the two answer different questions and only + * this one is a loss. A document that parses and is simply not an `` sidecar + * is either the monolithic store or a sidecar this version does not model, and + * neither is damage. */ -function parseInfo(content, relPath, warnings) { +function readStoreDoc(content, relPath, warnings) { let doc; try { doc = readProjectXml(content); @@ -293,6 +349,17 @@ function parseInfo(content, relPath, warnings) { }); return null; } + return doc; +} +/** + * The `` root of a store document, or null for a document that has none. + * + * Null is NOT a loss and does not warn: it is every monolithic store (whose root is + * ``) and every sidecar this version does not model. Newer releases add the + * latter, and warning on one would put a count on every project written by a release + * newer than this reader. + */ +function infoRootOf(doc) { const info = doc.Info; if (info === undefined || info === null) { return null; @@ -412,6 +479,92 @@ function distributedLayout(index) { }; return { roots: () => readDir(''), children: (e) => readDir(e.dir) }; } +/** + * `monolithic`: the whole content store is ONE document and the entity tree IS the + * element tree. There are no pointer documents and no filename convention, because + * there are no filenames — an element's TAG is its type, its `Location` attribute is + * its location, and its `` child is its def. MATLAB writes this layout for + * `matlab.project.convertDefinitionFiles(root, "SingleFile")`. + * + * `dir` keeps its role as an entity's identity (see `Entity.dir`), but there is no + * directory to name: it is the element's PATH within the document, `Files[1]/File[0]`, + * built as the walk descends. Unique by construction, and the `nodes` map is what + * turns one back into the element it names — the two file-tree layouts re-scan their + * index for that, which this layout has no index to do. + */ +function monolithicLayout(root) { + const nodes = new Map([['', root]]); + const readChildren = (dir) => { + const node = nodes.get(dir); + if (!node) { + return []; + } + const def = defOf(node); + const out = []; + for (const [tag, value] of Object.entries(node)) { + // Element children only. The engine's shape puts attributes under a prefix and + // text under one reserved key, so these two are every key that is not a child. + if (tag.startsWith(ATTRIBUTE_PREFIX) || tag === TEXT_KEY) { + continue; + } + const children = toArray(value); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + // An entity's def is not also one of its children. Compared by IDENTITY and + // not by tag, because `` is BOTH things in this layout: the def of + // every entity that has one, and the type of the entity holding the + // project's name. See `defOf`. + if (child === def) { + continue; + } + const childDir = dir ? `${dir}/${tag}[${i}]` : `${tag}[${i}]`; + const element = asElement(child); + nodes.set(childDir, element); + out.push({ + dir: childDir, + location: element['@_Location'] ?? '', + type: tag, + def: defOf(element), + }); + } + } + return out; + }; + return { roots: () => readChildren(''), children: (e) => readChildren(e.dir) }; +} +/** + * A child node of the monolithic tree as an element. + * + * An element carrying neither attributes nor children parses as the empty STRING and + * not as an object (see XmlReader's contract). It is still an ENTITY, and one that + * matters: a bare `` is of that shape, and `DIR_SIGNIFIER` is the + * only thing that marks a project member as a folder — so reading it as nothing + * would turn a folder into a file. Answering with an empty element instead keeps it + * in the walk with no location and no def, which is a state the two file-tree + * layouts already produce for an entity whose def is missing. + */ +function asElement(node) { + return node !== null && typeof node === 'object' ? node : {}; +} +/** + * The def of a monolithic entity: its `` child, or null when it has none. + * + * `` means two things here and only `Location` separates them. Every entity's + * def is an `` child with attributes and no `Location`; the entity holding the + * project's NAME is itself an ``, whose def is the + * `` nested one level inside it. Taking the first `` child + * blindly would make that entity the def of `` itself, which both loses the + * name and drops the entity `resolveNameFrom` looks for. + */ +function defOf(node) { + for (const child of toArray(node.Info)) { + const info = asElement(child); + if (info['@_Location'] === undefined) { + return info; + } + } + return null; +} /** * Split a `distributed` stem into its location and type. * diff --git a/dist/datamodel/parser/ProjectParser.js.map b/dist/datamodel/parser/ProjectParser.js.map index a282b47..b123269 100644 --- a/dist/datamodel/parser/ProjectParser.js.map +++ b/dist/datamodel/parser/ProjectParser.js.map @@ -1 +1 @@ -{"version":3,"file":"ProjectParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/ProjectParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ProjectParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/ProjectParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/parser/XmlReader.d.ts b/dist/datamodel/parser/XmlReader.d.ts index 4a7799c..cb6621a 100644 --- a/dist/datamodel/parser/XmlReader.d.ts +++ b/dist/datamodel/parser/XmlReader.d.ts @@ -1,3 +1,16 @@ +/** + * The two keys that are not an element name, exported because one walker has to tell + * them apart from one. + * + * Every other reader here knows the key it wants (`@_Name`, `#text`) and spells it, + * which needs no constant. `ProjectParser`'s monolithic layout is the exception: an + * element's CHILDREN are named by their entity type, so it enumerates the keys it + * does not know and has to recognize these two by shape. That is the engine's shape + * and so it belongs here, next to the options that produce it, rather than as a + * second `'@_'` in a file that would not otherwise care. + */ +export declare const ATTRIBUTE_PREFIX = "@_"; +export declare const TEXT_KEY = "#text"; /** * A `.sldd`'s XML part. `Object`, `P` and `Element` are always arrays; whitespace inside a * value is preserved exactly as written, and whitespace between two tags is not stored at diff --git a/dist/datamodel/parser/XmlReader.d.ts.map b/dist/datamodel/parser/XmlReader.d.ts.map index f15664c..ddb102d 100644 --- a/dist/datamodel/parser/XmlReader.d.ts.map +++ b/dist/datamodel/parser/XmlReader.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"XmlReader.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/XmlReader.ts"],"names":[],"mappings":"AA6JA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD"} \ No newline at end of file +{"version":3,"file":"XmlReader.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/XmlReader.ts"],"names":[],"mappings":"AA2FA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,QAAQ,UAAU,CAAC;AAiEhC;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD"} \ No newline at end of file diff --git a/dist/datamodel/parser/XmlReader.js b/dist/datamodel/parser/XmlReader.js index 4e42fd1..ba01d18 100644 --- a/dist/datamodel/parser/XmlReader.js +++ b/dist/datamodel/parser/XmlReader.js @@ -86,8 +86,19 @@ // whitespace is untouched either way — trimming is not normalization. import { XMLParser } from 'fast-xml-parser'; import { readDictionaryXmlFast } from './DictionaryXmlFast.js'; -const ATTRIBUTE_PREFIX = '@_'; -const TEXT_KEY = '#text'; +/** + * The two keys that are not an element name, exported because one walker has to tell + * them apart from one. + * + * Every other reader here knows the key it wants (`@_Name`, `#text`) and spells it, + * which needs no constant. `ProjectParser`'s monolithic layout is the exception: an + * element's CHILDREN are named by their entity type, so it enumerates the keys it + * does not know and has to recognize these two by shape. That is the engine's shape + * and so it belongs here, next to the options that produce it, rather than as a + * second `'@_'` in a file that would not otherwise care. + */ +export const ATTRIBUTE_PREFIX = '@_'; +export const TEXT_KEY = '#text'; /** The shape every reader produces: attributes under `@_`, text under `#text`. */ const SHAPE = { ignoreAttributes: false, diff --git a/dist/datamodel/parser/XmlReader.js.map b/dist/datamodel/parser/XmlReader.js.map index ceb9dcd..bb76139 100644 --- a/dist/datamodel/parser/XmlReader.js.map +++ b/dist/datamodel/parser/XmlReader.js.map @@ -1 +1 @@ -{"version":3,"file":"XmlReader.js","sourceRoot":"","sources":["../../../src/datamodel/parser/XmlReader.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"XmlReader.js","sourceRoot":"","sources":["../../../src/datamodel/parser/XmlReader.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/datamodel/parser/ProjectParser.ts b/src/datamodel/parser/ProjectParser.ts index 755af78..685842e 100644 --- a/src/datamodel/parser/ProjectParser.ts +++ b/src/datamodel/parser/ProjectParser.ts @@ -1,6 +1,6 @@ // Copyright 2026 The MathWorks, Inc. -import { readProjectXml } from './XmlReader.js'; +import { readProjectXml, ATTRIBUTE_PREFIX, TEXT_KEY } from './XmlReader.js'; import { reasonOf, type ParseWarning } from './ParseWarning.js'; /** A member file (or folder) of the project. */ @@ -91,9 +91,9 @@ export interface ParsedProject { /** * The store's declared `MetadataType` — how the project's metadata is laid out on * disk. '' when the store declares none and the layout could not be inferred. - * Two are read: `fixedPathV2` and `distributed`. Anything else is reported through - * `warnings` rather than read, because guessing at a layout produces a project - * that looks complete and is not. + * Three are read: `fixedPathV2`, `distributed` and `monolithic`. Anything else is + * reported through `warnings` rather than read, because guessing at a layout + * produces a project that looks complete and is not. */ format: string; files: ProjectFile[]; @@ -131,6 +131,15 @@ const MANIFEST = 'Project.xml'; /** The layouts this reader walks. See `ParsedProject.format`. */ const FIXED_PATH_V2 = 'fixedPathV2'; const DISTRIBUTED = 'distributed'; +const MONOLITHIC = 'monolithic'; + +/** + * The root element of a `monolithic` store's single document. + * + * Lowercase, and the only root element in any layout that is not `` — which is + * what makes it the structural signal for "this one document is the whole store". + */ +const MONOLITHIC_ROOT = 'project'; /** * Collection types whose `type="Reference"` children are NOT project references. @@ -176,6 +185,25 @@ interface XmlInfo { Extension?: XmlExtension | XmlExtension[]; } +/** + * One element of a `monolithic` store's document tree. + * + * `XmlInfo` cannot stand in for this. A def is a closed set of attributes this reader + * reads, which is what `XmlInfo` spells; an element of the monolithic tree carries + * element CHILDREN named by their entity type, so its key set is open — `Files`, + * `Categories`, `File`, `DIR_SIGNIFIER`, whatever a newer release adds. It extends + * `XmlInfo` because the same element is both: an entity's node, and (one level down) + * the `` def every collection reader below already knows how to read. + */ +interface XmlElement extends XmlInfo { + /** + * The entity's location. Capital `L` — `fixedPathV2` spells the same thing + * `location` in a pointer document, and both spellings are live in one store. + */ + '@_Location'?: string; + [child: string]: unknown; +} + interface XmlCategory { '@_UUID'?: string; Label?: XmlLabel | XmlLabel[]; @@ -188,14 +216,22 @@ interface XmlLabel { /** * One entity in the store, normalized across layouts. * - * The two layouts differ ONLY in how these three fields are found. `fixedPathV2` + * The three layouts differ ONLY in how these three fields are found. `fixedPathV2` * puts `location`/`type` in a pointer document beside the def and names the child * directory by an opaque hash; `distributed` encodes all three in the filename - * (`.type.`) and nests the child directory under its parent. Once - * both are read into this shape, every collection reader below is layout-blind. + * (`.type.`) and nests the child directory under its parent; + * `monolithic` has no files to name at all and encodes them in the element itself. + * Once all three are read into this shape, every collection reader below is + * layout-blind. */ interface Entity { - /** Store-relative path of this entity's OWN child directory. Also its identity. */ + /** + * Where this entity's children are, and also its identity. + * + * A store-relative directory path in the two file-tree layouts. `monolithic` has + * no directories, so it is the element's path within the document — same role, + * same uniqueness, and it is the uniqueness that `collectFile`'s guard needs. + */ dir: string; location: string; type: string; @@ -247,6 +283,11 @@ export function parseProject(files: Record, projectName: string) try { // Index every parseable Info doc by its relpath (project-relative). const index = new Map(); + // The one document of a `monolithic` store, when this store is one. A store holds + // either this or the index and never both: the monolithic document IS the store, + // so there are no sidecars left to index. + let monolith: XmlElement | null = null; + for (const [relPath, content] of Object.entries(files)) { if (!relPath.startsWith(PROJECT_PREFIX)) { continue; @@ -254,14 +295,28 @@ export function parseProject(files: Record, projectName: string) if (!relPath.endsWith('.xml')) { continue; } - const info = parseInfo(content, relPath, warnings); + const doc = readStoreDoc(content, relPath, warnings); + if (!doc) { + continue; + } + const info = infoRootOf(doc); if (info) { // Store keyed relative to resources/project/ for simpler dir math. index.set(relPath.slice(PROJECT_PREFIX.length), info); + continue; + } + // A `` root rather than an `` one: a whole store in one nested + // document. First one wins — a store has exactly one, and preferring the first + // keeps the choice from depending on `files`' iteration order. + if (!monolith) { + const root = doc[MONOLITHIC_ROOT]; + if (root !== null && typeof root === 'object') { + monolith = root as XmlElement; + } } } - if (index.size === 0) { + if (!monolith && index.size === 0) { // Every collection below reads out of this index, so an empty one means the // whole result is empty — and a `.prj` always has a store, so reaching here // is either the wrong kind of file or a store that did not survive its trip. @@ -296,15 +351,23 @@ export function parseProject(files: Record, projectName: string) return result; } - // The manifest declares which layout the rest of the store is in. A store that - // declares one we cannot walk is reported and NOT guessed at: the collection - // readers below would find nothing in it and return a project that looks - // complete and empty, which is the one outcome a user cannot tell from a fact. - const declared = index.get(MANIFEST)?.['@_MetadataType'] ?? ''; - const layoutName = declared || inferLayout(index); - if (layoutName !== FIXED_PATH_V2 && layoutName !== DISTRIBUTED) { + // Which layout the store is in. The KIND of store is settled structurally, by + // the root element, before the declared `MetadataType` is consulted at all: a + // monolithic store's manifest IS the store, so there is no separate document to + // ask, and a `` root is the only root that is not ``. + // + // A store that declares a layout we cannot walk is reported and NOT guessed at: + // the collection readers below would find nothing in it and return a project + // that looks complete and empty, which is the one outcome a user cannot tell + // from a fact about their own project. + const declared = (monolith ?? index.get(MANIFEST))?.['@_MetadataType'] ?? ''; + const layoutName = declared || (monolith ? MONOLITHIC : inferLayout(index)); + const layout = layoutFor(layoutName, monolith, index); + if (!layout) { // The name is still worth salvaging — it is what a host titles the view with, - // and it reads out of the index without knowing the layout. + // and it reads out of the index without knowing the layout. A monolithic store + // has no index to salvage from, and needs none: its document is named after + // the project, so `projectName` is already the name a user would expect. result.name = salvageName(index) ?? projectName; warnings.push({ code: 'source-empty', @@ -318,8 +381,6 @@ export function parseProject(files: Record, projectName: string) } result.format = layoutName; - const layout = - layoutName === FIXED_PATH_V2 ? fixedPathV2Layout(index) : distributedLayout(index); const rootEntities = layout.roots(); result.name = resolveNameFrom(rootEntities) ?? projectName; @@ -391,12 +452,40 @@ export function parseProject(files: Record, projectName: string) } } +/** + * The walker for a layout, or null for one this reader does not walk. + * + * `monolithic` is answered from the document and not from the name: a store that + * DECLARES monolithic and holds no `` document has nothing to walk, and + * falling back to the sidecar index would read it under a layout it has just said it + * is not in. That is the same refusal the other two names get for an unknown value, + * reached by a different route. + */ +function layoutFor( + name: string, + monolith: XmlElement | null, + index: Map, +): Layout | null { + if (name === MONOLITHIC) { + return monolith ? monolithicLayout(monolith) : null; + } + if (name === FIXED_PATH_V2) { + return fixedPathV2Layout(index); + } + if (name === DISTRIBUTED) { + return distributedLayout(index); + } + return null; +} + /** * Which layout a store with no manifest is in. * * Every store this reader has seen carries `Project.xml`, so this is the fallback * for one that lost it: `root/` is the entry directory `fixedPathV2` and nothing * else uses, and a `.type.` in a top-level name is `distributed`'s own spelling. + * `monolithic` is not inferred here — it is settled before this is called, since its + * document is the manifest and cannot be missing without the store being gone. */ function inferLayout(index: Map): string { for (const key of index.keys()) { @@ -456,16 +545,20 @@ function resolveNameFrom(rootEntities: Entity[]): string | null { } /** - * One `` document, or null when there is nothing here to index. + * One store document parsed, or null when it is CORRUPT — truncated, wrongly + * encoded, half-written — in which case the entities it described are lost and it + * warns. * - * Null covers two cases that must NOT be reported alike. A document that fails to - * parse, or that yields no elements at all, is CORRUPT — truncated, wrongly - * encoded, half-written — and the entity it described is lost, so it warns. A - * document that parses into elements but has no `` root is a sidecar this - * version does not model; newer releases add them, and warning on one would put a - * count on every project written by a release newer than this reader. + * Kept apart from `infoRootOf` because the two answer different questions and only + * this one is a loss. A document that parses and is simply not an `` sidecar + * is either the monolithic store or a sidecar this version does not model, and + * neither is damage. */ -function parseInfo(content: string, relPath: string, warnings: ParseWarning[]): XmlInfo | null { +function readStoreDoc( + content: string, + relPath: string, + warnings: ParseWarning[], +): Record | null { let doc: Record; try { doc = readProjectXml(content) as Record; @@ -491,6 +584,18 @@ function parseInfo(content: string, relPath: string, warnings: ParseWarning[]): return null; } + return doc; +} + +/** + * The `` root of a store document, or null for a document that has none. + * + * Null is NOT a loss and does not warn: it is every monolithic store (whose root is + * ``) and every sidecar this version does not model. Newer releases add the + * latter, and warning on one would put a count on every project written by a release + * newer than this reader. + */ +function infoRootOf(doc: Record): XmlInfo | null { const info = doc.Info; if (info === undefined || info === null) { return null; @@ -617,6 +722,98 @@ function distributedLayout(index: Map): Layout { return { roots: () => readDir(''), children: (e) => readDir(e.dir) }; } +/** + * `monolithic`: the whole content store is ONE document and the entity tree IS the + * element tree. There are no pointer documents and no filename convention, because + * there are no filenames — an element's TAG is its type, its `Location` attribute is + * its location, and its `` child is its def. MATLAB writes this layout for + * `matlab.project.convertDefinitionFiles(root, "SingleFile")`. + * + * `dir` keeps its role as an entity's identity (see `Entity.dir`), but there is no + * directory to name: it is the element's PATH within the document, `Files[1]/File[0]`, + * built as the walk descends. Unique by construction, and the `nodes` map is what + * turns one back into the element it names — the two file-tree layouts re-scan their + * index for that, which this layout has no index to do. + */ +function monolithicLayout(root: XmlElement): Layout { + const nodes = new Map([['', root]]); + + const readChildren = (dir: string): Entity[] => { + const node = nodes.get(dir); + if (!node) { + return []; + } + const def = defOf(node); + const out: Entity[] = []; + + for (const [tag, value] of Object.entries(node)) { + // Element children only. The engine's shape puts attributes under a prefix and + // text under one reserved key, so these two are every key that is not a child. + if (tag.startsWith(ATTRIBUTE_PREFIX) || tag === TEXT_KEY) { + continue; + } + const children = toArray(value); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + // An entity's def is not also one of its children. Compared by IDENTITY and + // not by tag, because `` is BOTH things in this layout: the def of + // every entity that has one, and the type of the entity holding the + // project's name. See `defOf`. + if (child === def) { + continue; + } + const childDir = dir ? `${dir}/${tag}[${i}]` : `${tag}[${i}]`; + const element = asElement(child); + nodes.set(childDir, element); + out.push({ + dir: childDir, + location: element['@_Location'] ?? '', + type: tag, + def: defOf(element), + }); + } + } + return out; + }; + + return { roots: () => readChildren(''), children: (e) => readChildren(e.dir) }; +} + +/** + * A child node of the monolithic tree as an element. + * + * An element carrying neither attributes nor children parses as the empty STRING and + * not as an object (see XmlReader's contract). It is still an ENTITY, and one that + * matters: a bare `` is of that shape, and `DIR_SIGNIFIER` is the + * only thing that marks a project member as a folder — so reading it as nothing + * would turn a folder into a file. Answering with an empty element instead keeps it + * in the walk with no location and no def, which is a state the two file-tree + * layouts already produce for an entity whose def is missing. + */ +function asElement(node: unknown): XmlElement { + return node !== null && typeof node === 'object' ? (node as XmlElement) : {}; +} + +/** + * The def of a monolithic entity: its `` child, or null when it has none. + * + * `` means two things here and only `Location` separates them. Every entity's + * def is an `` child with attributes and no `Location`; the entity holding the + * project's NAME is itself an ``, whose def is the + * `` nested one level inside it. Taking the first `` child + * blindly would make that entity the def of `` itself, which both loses the + * name and drops the entity `resolveNameFrom` looks for. + */ +function defOf(node: XmlElement): XmlInfo | null { + for (const child of toArray(node.Info)) { + const info = asElement(child); + if (info['@_Location'] === undefined) { + return info; + } + } + return null; +} + /** * Split a `distributed` stem into its location and type. * diff --git a/src/datamodel/parser/XmlReader.ts b/src/datamodel/parser/XmlReader.ts index 3a8e20f..dd96e1d 100644 --- a/src/datamodel/parser/XmlReader.ts +++ b/src/datamodel/parser/XmlReader.ts @@ -89,8 +89,19 @@ import { XMLParser } from 'fast-xml-parser'; import { readDictionaryXmlFast } from './DictionaryXmlFast.js'; -const ATTRIBUTE_PREFIX = '@_'; -const TEXT_KEY = '#text'; +/** + * The two keys that are not an element name, exported because one walker has to tell + * them apart from one. + * + * Every other reader here knows the key it wants (`@_Name`, `#text`) and spells it, + * which needs no constant. `ProjectParser`'s monolithic layout is the exception: an + * element's CHILDREN are named by their entity type, so it enumerates the keys it + * does not know and has to recognize these two by shape. That is the engine's shape + * and so it belongs here, next to the options that produce it, rather than as a + * second `'@_'` in a file that would not otherwise care. + */ +export const ATTRIBUTE_PREFIX = '@_'; +export const TEXT_KEY = '#text'; /** The shape every reader produces: attributes under `@_`, text under `#text`. */ const SHAPE = { diff --git a/test/projectParser.test.ts b/test/projectParser.test.ts index 8e1080f..99226ea 100644 --- a/test/projectParser.test.ts +++ b/test/projectParser.test.ts @@ -1011,6 +1011,309 @@ describe('parseProject — the distributed layout', () => { }); }); +// The third layout, and the only one that is not a tree of files at all: +// `matlab.project.convertDefinitionFiles(root, "SingleFile")` collapses the whole +// content store into ONE `resources/project/Project.xml` whose root element is +// ``. There are no pointer documents and no +// filename convention — the entity tree IS the element tree, where an element's tag +// is its type, its `Location` attribute is its location, and its `` child is +// its def. Before this layout was read, such a store indexed to nothing (every +// document in it is the one document, and its root is not ``), so a converted +// project reported "no readable project entries" and showed as empty. +describe('parseProject — the monolithic layout', () => { + /** A monolithic store: one document, with `body` as the children of ``. */ + function monoStore(body: string, declared = ' MetadataType="monolithic"'): Record { + return { [at('Project.xml')]: info(`${body}`) }; + } + + /** The example project's shape, trimmed to one of each thing it holds. */ + const MONO_BODY = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `; + + it('reads a whole project out of one document', () => { + const parsed = parseProject(monoStore(MONO_BODY), 'fallback'); + + expect(parsed.format).toBe('monolithic'); + expect(parsed.warnings).toEqual([]); + expect(parsed.name).toBe('MonoProj'); + expect(parsed.files.map((f) => f.path)).toEqual(['top.m', 'utils', 'utils/helper.m']); + expect(parsed.pathFolders).toEqual(['', 'utils']); + expect(parsed.workingFolders).toEqual([{ key: 'SimulinkCacheFolder', ref: 'Cache' }]); + expect(parsed.entryPointGroups).toEqual([{ id: 'g-1', name: 'Synth' }]); + }); + + it('keeps the name entity apart from the project element it sits in', () => { + // `` is TWO things in this layout: the def of every entity that has one, + // AND the type of the entity holding the project's name. Only the `Location` + // attribute separates them, so treating the first `` child as the def + // would make `` the def of `` itself and + // leave the project titled by its filename. + expect(parseProject(monoStore(MONO_BODY), 'fallback').name).toBe('MonoProj'); + // …and the def one level down is still read, which is where the name actually is. + expect(parseProject(monoStore(''), 'fallback').name).toBe( + 'fallback', + ); + }); + + it('marks a folder from its DIR_SIGNIFIER and qualifies the paths beneath it', () => { + const parsed = parseProject(monoStore(MONO_BODY), 'fallback'); + const byPath = new Map(parsed.files.map((f) => [f.path, f])); + expect(byPath.get('utils')?.isFolder).toBe(true); + expect(byPath.get('top.m')?.isFolder).toBe(false); + // A File's `Location` is its basename relative to its PARENT, as in the other + // two layouts, so a nested member's path has to be built from the walk. + expect(byPath.get('utils/helper.m')?.labels).toEqual(['test']); + expect(byPath.get('top.m')?.labels).toEqual(['design']); + }); + + it('reads the Root Files collection and ignores the ALM one beside it', () => { + // The two-collections-of-one-type case is not hypothetical here: the example + // project writes both, the ALM one FIRST, and it holds no members at all. + const parsed = parseProject(monoStore(MONO_BODY), 'fallback'); + expect(parsed.files.map((f) => f.path)).toEqual(['top.m', 'utils', 'utils/helper.m']); + }); + + it('reads the label catalog and its category name', () => { + const parsed = parseProject(monoStore(MONO_BODY), 'fallback'); + expect(parsed.labels).toEqual([ + { id: 'design', category: 'Classification', name: 'Design', readOnly: true }, + { id: 'test', category: 'Classification', name: 'Test', readOnly: true }, + ]); + }); + + it('puts the startup files in run order', () => { + // The order lives only in the `` chain nested inside each + // entry point's def — so this also pins that a def's own child elements survive + // the walk rather than being mistaken for child entities. + const parsed = parseProject(monoStore(MONO_BODY), 'fallback'); + expect(parsed.entryPoints.map((e) => e.name)).toEqual(['first', 'second', 'helper']); + expect(parsed.entryPoints.find((e) => e.name === 'helper')?.groupId).toBe('g-1'); + // 'default' is the store's spelling for "no group", not a group called default. + expect(parsed.entryPoints.find((e) => e.name === 'first')?.groupId).toBe(''); + }); + + it('walks a document that declares no format at all', () => { + // A `` root is itself the statement that this store is one document, + // which is the same reason `inferLayout` exists for the other two. + const parsed = parseProject(monoStore(MONO_BODY, ''), 'fallback'); + expect(parsed.format).toBe('monolithic'); + expect(parsed.name).toBe('MonoProj'); + expect(parsed.files.map((f) => f.path)).toEqual(['top.m', 'utils', 'utils/helper.m']); + }); + + it('reports a single-document store whose declared format it cannot walk', () => { + // Same rule as for the other layouts: a nesting convention we do not know would + // read as a complete, empty project, so the declared name is reported instead. + const parsed = parseProject(monoStore(MONO_BODY, ' MetadataType="monolithicV2"'), 'fallback'); + expect(parsed.format).toBe(''); + expect(parsed.files).toEqual([]); + expect(parsed.warnings).toHaveLength(1); + expect(parsed.warnings[0].message).toContain('monolithicV2'); + }); + + it('reads a real project reference out of its collection', () => { + const parsed = parseProject( + monoStore( + '' + + '' + + '' + + '' + + '' + + '', + ), + 'fallback', + ); + expect(parsed.references).toEqual([ + { id: 'uuid-1', name: 'LibProj.prj', path: '../LibProj/LibProj.prj' }, + ]); + }); +}); + +// The three layouts are three ENCODINGS of one thing, and MATLAB converts a project +// between them in place (`matlab.project.convertDefinitionFiles`). So the invariant +// worth holding is not "each walker reads its own layout" — the tests above pin that, +// and all three can pass while the walkers disagree about the same project. It is +// that converting a project cannot change what the project IS. +// +// Checked once against MATLAB before it was written down: the example project +// (372 members, 89 folders, 197 labelled, 88 path folders, 7 labels, 14 entry points) +// converted to all three formats by R2027a parses to byte-identical results, `format` +// aside. This is that measurement reduced to a fixture small enough to read. +describe('parseProject — one project, three layouts', () => { + /** One project: a folder with a labelled file in it, a path folder, a startup file. */ + const FIXED_PATH: Record = { + [at('Project.xml')]: info(''), + [at('root/namep.xml')]: info(''), + [at('root/named.xml')]: info(''), + [at('root/filesp.xml')]: info(''), + [at('root/pathp.xml')]: info(''), + [at('root/catsp.xml')]: info(''), + [at('root/epsp.xml')]: info(''), + [at('root/wfp.xml')]: info(''), + [at('files/utilsp.xml')]: info(''), + [at('utils/dirp.xml')]: info(''), + [at('utils/helperp.xml')]: info(''), + [at('utils/helperd.xml')]: info( + '', + ), + [at('path/p1p.xml')]: info(''), + [at('path/p1d.xml')]: info(''), + [at('cats/fccp.xml')]: info(''), + [at('cats/fccd.xml')]: info(''), + [at('fcc/designp.xml')]: info(''), + [at('fcc/designd.xml')]: info(''), + [at('eps/s1p.xml')]: info(''), + [at('eps/s1d.xml')]: info(''), + [at('wf/c1p.xml')]: info(''), + [at('wf/c1d.xml')]: info(''), + }; + + const DISTRIBUTED: Record = { + [at('Project.xml')]: info(''), + [at('ProjectData.type.Info.xml')]: info(''), + [at('Root.type.Files/utils.type.File/1.type.DIR_SIGNIFIER.xml')]: info(''), + [at('Root.type.Files/utils.type.File/helper.m.type.File.xml')]: info( + '', + ), + [at('Root.type.ProjectPath/u-1.type.Reference.xml')]: info(''), + [at('Root.type.Categories/FileClassCategory.type.Category.xml')]: info( + '', + ), + [at('Root.type.Categories/FileClassCategory.type.Category/design.type.Label.xml')]: info( + '', + ), + [at('Root.type.EntryPoints/e-1.type.EntryPoint.xml')]: info( + '', + ), + [at('Root.type.WorkingFolders/SimulinkCacheFolder.type.Reference.xml')]: info( + '', + ), + }; + + const MONOLITHIC: Record = { + [at('Project.xml')]: info( + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + ), + }; + + /** Everything the layout is not supposed to decide — i.e. all of it but `format`. */ + function project(store: Record): Omit { + const { format: _format, ...rest } = parseProject(store, 'fallback'); + return rest; + } + + it('reads one project the same way out of all three', () => { + const fixed = project(FIXED_PATH); + // Stated positively first: a parity assertion between two empty results passes, + // so the thing being compared has to be known to hold the project. + expect(fixed).toEqual({ + name: 'Parity', + files: [ + { path: 'utils', isFolder: true, labels: [] }, + { path: 'utils/helper.m', isFolder: false, labels: ['design'] }, + ], + pathFolders: ['utils'], + labels: [{ id: 'design', category: 'Classification', name: 'Design', readOnly: true }], + references: [], + entryPoints: [ + { + id: 'e-1', + name: 'startup', + file: 'startup.m', + kind: 'StartUp', + visible: false, + groupId: '', + }, + ], + entryPointGroups: [], + workingFolders: [{ key: 'SimulinkCacheFolder', ref: 'Cache' }], + warnings: [], + }); + expect(project(DISTRIBUTED)).toEqual(fixed); + expect(project(MONOLITHIC)).toEqual(fixed); + }); + + it('reports which of the three it read', () => { + expect(parseProject(FIXED_PATH, 'fallback').format).toBe('fixedPathV2'); + expect(parseProject(DISTRIBUTED, 'fallback').format).toBe('distributed'); + expect(parseProject(MONOLITHIC, 'fallback').format).toBe('monolithic'); + }); +}); + describe('parseProject — the declared metadata format', () => { it('reports the format it read', () => { expect(parseProject(myProjStore(), 'fallback').format).toBe('fixedPathV2'); @@ -1021,6 +1324,25 @@ describe('parseProject — the declared metadata format', () => { // nothing in an unknown layout and return a project that looks complete and // empty — the single outcome a user cannot tell apart from a fact about their // project. The name is still salvaged, since it titles the view. + const parsed = parseProject( + { + [at('Project.xml')]: info(''), + [at('ProjectData.type.Info.xml')]: info(''), + }, + 'fallback', + ); + expect(parsed.name).toBe('Mono'); + expect(parsed.format).toBe(''); + expect(parsed.files).toEqual([]); + expect(parsed.warnings).toHaveLength(1); + expect(parsed.warnings[0].code).toBe('source-empty'); + expect(parsed.warnings[0].message).toContain('fixedPathV3'); + }); + + it('will not read a store that declares monolithic and holds no such document', () => { + // `monolithic` is a layout this reader walks, but only the document it names: + // the declaration alone is not one, and reading the sidecar index instead would + // walk the store under a layout it has just said it is not in. const parsed = parseProject( { [at('Project.xml')]: info(''), @@ -1033,7 +1355,6 @@ describe('parseProject — the declared metadata format', () => { expect(parsed.files).toEqual([]); expect(parsed.warnings).toHaveLength(1); expect(parsed.warnings[0].code).toBe('source-empty'); - expect(parsed.warnings[0].message).toContain('monolithic'); }); it('names matlab.toml rather than reporting an empty store', () => {