@openforis/arena-core 2.18.7 → 2.18.9

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.
@@ -3,6 +3,7 @@ export declare class UniqueFileNamesGenerator {
3
3
  private _fileNamesByKey;
4
4
  private _keysByFileName;
5
5
  private readonly _fileNamesLowerCase;
6
+ private readonly _lastGeneratedFileNameByFirstCandidate;
6
7
  constructor();
7
8
  private isFileNameUsed;
8
9
  private assignFileName;
@@ -8,6 +8,7 @@ class UniqueFileNamesGenerator {
8
8
  this._fileNamesByKey = {};
9
9
  this._keysByFileName = {};
10
10
  this._fileNamesLowerCase = new Set();
11
+ this._lastGeneratedFileNameByFirstCandidate = new Map();
11
12
  }
12
13
  isFileNameUsed(fileName) {
13
14
  return this._fileNamesLowerCase.has(fileName.toLowerCase());
@@ -35,6 +36,7 @@ class UniqueFileNamesGenerator {
35
36
  * @returns The unique file name associated with the given key.
36
37
  */
37
38
  generateUniqueFileName(inputFileName, key) {
39
+ var _a;
38
40
  const existingFileName = this._fileNamesByKey[key];
39
41
  if (existingFileName) {
40
42
  return existingFileName;
@@ -43,11 +45,13 @@ class UniqueFileNamesGenerator {
43
45
  // file name not used yet
44
46
  return this.assignFileName(inputFileName, key);
45
47
  }
46
- let generatedFileName = this.generateNextFileName(inputFileName);
48
+ const firstCandidate = this.generateNextFileName(inputFileName);
49
+ let generatedFileName = (_a = this._lastGeneratedFileNameByFirstCandidate.get(firstCandidate)) !== null && _a !== void 0 ? _a : firstCandidate;
47
50
  while (this.isFileNameUsed(generatedFileName)) {
48
51
  // file name already exists, generate the next one
49
52
  generatedFileName = this.generateNextFileName(generatedFileName);
50
53
  }
54
+ this._lastGeneratedFileNameByFirstCandidate.set(firstCandidate, generatedFileName);
51
55
  return this.assignFileName(generatedFileName, key);
52
56
  }
53
57
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"UniqueFileNamesGenerator.js","sourceRoot":"","sources":["../../src/dataExport/UniqueFileNamesGenerator.ts"],"names":[],"mappings":";;;AACA,oCAAoC;AAEpC,MAAM,kBAAkB,GAAG,kBAAkB,CAAA,CAAC,mCAAmC;AAEjF;IAME;QACE,IAAI,CAAC,eAAe,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAA;IACtC,CAAC;IAEO,cAAc,CAAC,QAAgB;QACrC,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IAC7D,CAAC;IAEO,cAAc,CAAC,QAAgB,EAAE,GAAW;QAClD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAA;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAA;QACpC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QACpD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,sBAAsB,CAAC,aAAqB,EAAE,GAAW;QACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAClD,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,gBAAgB,CAAA;QACzB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,yBAAyB;YACzB,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;QAChD,CAAC;QACD,IAAI,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAA;QAChE,OAAO,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9C,kDAAkD;YAClD,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;IACpD,CAAC;IAED;;;;;;OAMG;IACO,oBAAoB,CAAC,aAAqB;QAClD,MAAM,IAAI,GAAG,iBAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAC7C,MAAM,SAAS,GAAG,iBAAS,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;QACvD,IAAI,WAAW,CAAA;QACf,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAA;YAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACnC,WAAW,GAAG,GAAG,gBAAgB,KAAK,SAAS,GAAG,CAAA;QACpD,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,GAAG,IAAI,MAAM,CAAA;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,WAAW,CAAA;IAChE,CAAC;IAED,IAAI,cAAc;QAChB,yBAAY,IAAI,CAAC,eAAe,EAAE;IACpC,CAAC;IAED,IAAI,cAAc;QAChB,yBAAY,IAAI,CAAC,eAAe,EAAE;IACpC,CAAC;CACF","sourcesContent":["import { Dictionary } from '../common'\nimport { FileNames } from '../utils'\n\nconst nameWithIndexRegEx = /^(.*) \\((\\d+)\\)$/ // file name like \"example (1).txt\"\n\nexport class UniqueFileNamesGenerator {\n private _fileNamesByKey: Dictionary<string>\n private _keysByFileName: Dictionary<string>\n // file names are compared ignoring case: names differing only in case overwrite each other on Windows/macOS\n private readonly _fileNamesLowerCase: Set<string>\n\n constructor() {\n this._fileNamesByKey = {}\n this._keysByFileName = {}\n this._fileNamesLowerCase = new Set()\n }\n\n private isFileNameUsed(fileName: string): boolean {\n return this._fileNamesLowerCase.has(fileName.toLowerCase())\n }\n\n private assignFileName(fileName: string, key: string): string {\n this._keysByFileName[fileName] = key\n this._fileNamesByKey[key] = fileName\n this._fileNamesLowerCase.add(fileName.toLowerCase())\n return fileName\n }\n\n /**\n * Generates a unique file name for the given key.\n *\n * If the key has been used before, the previously generated file name\n * associated with that key is returned, regardless of the current\n * {@link inputFileName} value.\n *\n * If the key has not been used before, the method either:\n * - returns {@link inputFileName} if it has not been used for another key, or\n * - generates the next available non-conflicting name by appending or\n * incrementing a numeric index in parentheses.\n *\n * @param inputFileName The desired base file name, including extension.\n * @param key A logical identifier whose associated file name should remain stable across calls.\n * @returns The unique file name associated with the given key.\n */\n generateUniqueFileName(inputFileName: string, key: string): string {\n const existingFileName = this._fileNamesByKey[key]\n if (existingFileName) {\n return existingFileName\n }\n if (!this.isFileNameUsed(inputFileName)) {\n // file name not used yet\n return this.assignFileName(inputFileName, key)\n }\n let generatedFileName = this.generateNextFileName(inputFileName)\n while (this.isFileNameUsed(generatedFileName)) {\n // file name already exists, generate the next one\n generatedFileName = this.generateNextFileName(generatedFileName)\n }\n return this.assignFileName(generatedFileName, key)\n }\n\n /**\n * Generates a new file name by incrementing an existing numeric suffix\n * of the form \"name (n)\" or appending \" (1)\" if no such suffix exists.\n *\n * @param inputFileName The original file name, including its extension.\n * @returns The updated file name with an incremented or newly added numeric suffix.\n */\n protected generateNextFileName(inputFileName: string): string {\n const name = FileNames.getName(inputFileName)\n const extension = FileNames.getExtension(inputFileName)\n let nameUpdated\n const matchRes = nameWithIndexRegEx.exec(name)\n if (matchRes) {\n const [, nameWithoutIndex, index] = matchRes\n const nextIndex = Number(index) + 1\n nameUpdated = `${nameWithoutIndex} (${nextIndex})`\n } else {\n nameUpdated = `${name} (1)`\n }\n return extension ? `${nameUpdated}.${extension}` : nameUpdated\n }\n\n get fileNamesByKey(): Readonly<Dictionary<string>> {\n return { ...this._fileNamesByKey }\n }\n\n get keysByFileName(): Readonly<Dictionary<string>> {\n return { ...this._keysByFileName }\n }\n}\n"]}
1
+ {"version":3,"file":"UniqueFileNamesGenerator.js","sourceRoot":"","sources":["../../src/dataExport/UniqueFileNamesGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary } from '../common'\nimport { FileNames } from '../utils'\n\nconst nameWithIndexRegEx = /^(.*) \\((\\d+)\\)$/ // file name like \"example (1).txt\"\n\nexport class UniqueFileNamesGenerator {\n private _fileNamesByKey: Dictionary<string>\n private _keysByFileName: Dictionary<string>\n // file names are compared ignoring case: names differing only in case overwrite each other on Windows/macOS\n private readonly _fileNamesLowerCase: Set<string>\n // last file name generated starting from a given first candidate file name (e.g. \"image (1).jpg\" => \"image (25).jpg\"):\n // the names before it in the sequence are all used already, so the search can start from it\n private readonly _lastGeneratedFileNameByFirstCandidate: Map<string, string>\n\n constructor() {\n this._fileNamesByKey = {}\n this._keysByFileName = {}\n this._fileNamesLowerCase = new Set()\n this._lastGeneratedFileNameByFirstCandidate = new Map()\n }\n\n private isFileNameUsed(fileName: string): boolean {\n return this._fileNamesLowerCase.has(fileName.toLowerCase())\n }\n\n private assignFileName(fileName: string, key: string): string {\n this._keysByFileName[fileName] = key\n this._fileNamesByKey[key] = fileName\n this._fileNamesLowerCase.add(fileName.toLowerCase())\n return fileName\n }\n\n /**\n * Generates a unique file name for the given key.\n *\n * If the key has been used before, the previously generated file name\n * associated with that key is returned, regardless of the current\n * {@link inputFileName} value.\n *\n * If the key has not been used before, the method either:\n * - returns {@link inputFileName} if it has not been used for another key, or\n * - generates the next available non-conflicting name by appending or\n * incrementing a numeric index in parentheses.\n *\n * @param inputFileName The desired base file name, including extension.\n * @param key A logical identifier whose associated file name should remain stable across calls.\n * @returns The unique file name associated with the given key.\n */\n generateUniqueFileName(inputFileName: string, key: string): string {\n const existingFileName = this._fileNamesByKey[key]\n if (existingFileName) {\n return existingFileName\n }\n if (!this.isFileNameUsed(inputFileName)) {\n // file name not used yet\n return this.assignFileName(inputFileName, key)\n }\n const firstCandidate = this.generateNextFileName(inputFileName)\n let generatedFileName = this._lastGeneratedFileNameByFirstCandidate.get(firstCandidate) ?? firstCandidate\n while (this.isFileNameUsed(generatedFileName)) {\n // file name already exists, generate the next one\n generatedFileName = this.generateNextFileName(generatedFileName)\n }\n this._lastGeneratedFileNameByFirstCandidate.set(firstCandidate, generatedFileName)\n return this.assignFileName(generatedFileName, key)\n }\n\n /**\n * Generates a new file name by incrementing an existing numeric suffix\n * of the form \"name (n)\" or appending \" (1)\" if no such suffix exists.\n *\n * @param inputFileName The original file name, including its extension.\n * @returns The updated file name with an incremented or newly added numeric suffix.\n */\n protected generateNextFileName(inputFileName: string): string {\n const name = FileNames.getName(inputFileName)\n const extension = FileNames.getExtension(inputFileName)\n let nameUpdated\n const matchRes = nameWithIndexRegEx.exec(name)\n if (matchRes) {\n const [, nameWithoutIndex, index] = matchRes\n const nextIndex = Number(index) + 1\n nameUpdated = `${nameWithoutIndex} (${nextIndex})`\n } else {\n nameUpdated = `${name} (1)`\n }\n return extension ? `${nameUpdated}.${extension}` : nameUpdated\n }\n\n get fileNamesByKey(): Readonly<Dictionary<string>> {\n return { ...this._fileNamesByKey }\n }\n\n get keysByFileName(): Readonly<Dictionary<string>> {\n return { ...this._keysByFileName }\n }\n}\n"]}
@@ -5,6 +5,7 @@ export class UniqueFileNamesGenerator {
5
5
  this._fileNamesByKey = {};
6
6
  this._keysByFileName = {};
7
7
  this._fileNamesLowerCase = new Set();
8
+ this._lastGeneratedFileNameByFirstCandidate = new Map();
8
9
  }
9
10
  isFileNameUsed(fileName) {
10
11
  return this._fileNamesLowerCase.has(fileName.toLowerCase());
@@ -32,6 +33,7 @@ export class UniqueFileNamesGenerator {
32
33
  * @returns The unique file name associated with the given key.
33
34
  */
34
35
  generateUniqueFileName(inputFileName, key) {
36
+ var _a;
35
37
  const existingFileName = this._fileNamesByKey[key];
36
38
  if (existingFileName) {
37
39
  return existingFileName;
@@ -40,11 +42,13 @@ export class UniqueFileNamesGenerator {
40
42
  // file name not used yet
41
43
  return this.assignFileName(inputFileName, key);
42
44
  }
43
- let generatedFileName = this.generateNextFileName(inputFileName);
45
+ const firstCandidate = this.generateNextFileName(inputFileName);
46
+ let generatedFileName = (_a = this._lastGeneratedFileNameByFirstCandidate.get(firstCandidate)) !== null && _a !== void 0 ? _a : firstCandidate;
44
47
  while (this.isFileNameUsed(generatedFileName)) {
45
48
  // file name already exists, generate the next one
46
49
  generatedFileName = this.generateNextFileName(generatedFileName);
47
50
  }
51
+ this._lastGeneratedFileNameByFirstCandidate.set(firstCandidate, generatedFileName);
48
52
  return this.assignFileName(generatedFileName, key);
49
53
  }
50
54
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"UniqueFileNamesGenerator.js","sourceRoot":"","sources":["../../../src/dataExport/UniqueFileNamesGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,MAAM,kBAAkB,GAAG,kBAAkB,CAAA,CAAC,mCAAmC;AAEjF,MAAM,OAAO,wBAAwB;IAMnC;QACE,IAAI,CAAC,eAAe,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAA;IACtC,CAAC;IAEO,cAAc,CAAC,QAAgB;QACrC,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IAC7D,CAAC;IAEO,cAAc,CAAC,QAAgB,EAAE,GAAW;QAClD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAA;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAA;QACpC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QACpD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,sBAAsB,CAAC,aAAqB,EAAE,GAAW;QACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAClD,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,gBAAgB,CAAA;QACzB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,yBAAyB;YACzB,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;QAChD,CAAC;QACD,IAAI,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAA;QAChE,OAAO,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9C,kDAAkD;YAClD,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;IACpD,CAAC;IAED;;;;;;OAMG;IACO,oBAAoB,CAAC,aAAqB;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;QACvD,IAAI,WAAW,CAAA;QACf,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAA;YAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACnC,WAAW,GAAG,GAAG,gBAAgB,KAAK,SAAS,GAAG,CAAA;QACpD,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,GAAG,IAAI,MAAM,CAAA;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,WAAW,CAAA;IAChE,CAAC;IAED,IAAI,cAAc;QAChB,yBAAY,IAAI,CAAC,eAAe,EAAE;IACpC,CAAC;IAED,IAAI,cAAc;QAChB,yBAAY,IAAI,CAAC,eAAe,EAAE;IACpC,CAAC;CACF","sourcesContent":["import { Dictionary } from '../common'\nimport { FileNames } from '../utils'\n\nconst nameWithIndexRegEx = /^(.*) \\((\\d+)\\)$/ // file name like \"example (1).txt\"\n\nexport class UniqueFileNamesGenerator {\n private _fileNamesByKey: Dictionary<string>\n private _keysByFileName: Dictionary<string>\n // file names are compared ignoring case: names differing only in case overwrite each other on Windows/macOS\n private readonly _fileNamesLowerCase: Set<string>\n\n constructor() {\n this._fileNamesByKey = {}\n this._keysByFileName = {}\n this._fileNamesLowerCase = new Set()\n }\n\n private isFileNameUsed(fileName: string): boolean {\n return this._fileNamesLowerCase.has(fileName.toLowerCase())\n }\n\n private assignFileName(fileName: string, key: string): string {\n this._keysByFileName[fileName] = key\n this._fileNamesByKey[key] = fileName\n this._fileNamesLowerCase.add(fileName.toLowerCase())\n return fileName\n }\n\n /**\n * Generates a unique file name for the given key.\n *\n * If the key has been used before, the previously generated file name\n * associated with that key is returned, regardless of the current\n * {@link inputFileName} value.\n *\n * If the key has not been used before, the method either:\n * - returns {@link inputFileName} if it has not been used for another key, or\n * - generates the next available non-conflicting name by appending or\n * incrementing a numeric index in parentheses.\n *\n * @param inputFileName The desired base file name, including extension.\n * @param key A logical identifier whose associated file name should remain stable across calls.\n * @returns The unique file name associated with the given key.\n */\n generateUniqueFileName(inputFileName: string, key: string): string {\n const existingFileName = this._fileNamesByKey[key]\n if (existingFileName) {\n return existingFileName\n }\n if (!this.isFileNameUsed(inputFileName)) {\n // file name not used yet\n return this.assignFileName(inputFileName, key)\n }\n let generatedFileName = this.generateNextFileName(inputFileName)\n while (this.isFileNameUsed(generatedFileName)) {\n // file name already exists, generate the next one\n generatedFileName = this.generateNextFileName(generatedFileName)\n }\n return this.assignFileName(generatedFileName, key)\n }\n\n /**\n * Generates a new file name by incrementing an existing numeric suffix\n * of the form \"name (n)\" or appending \" (1)\" if no such suffix exists.\n *\n * @param inputFileName The original file name, including its extension.\n * @returns The updated file name with an incremented or newly added numeric suffix.\n */\n protected generateNextFileName(inputFileName: string): string {\n const name = FileNames.getName(inputFileName)\n const extension = FileNames.getExtension(inputFileName)\n let nameUpdated\n const matchRes = nameWithIndexRegEx.exec(name)\n if (matchRes) {\n const [, nameWithoutIndex, index] = matchRes\n const nextIndex = Number(index) + 1\n nameUpdated = `${nameWithoutIndex} (${nextIndex})`\n } else {\n nameUpdated = `${name} (1)`\n }\n return extension ? `${nameUpdated}.${extension}` : nameUpdated\n }\n\n get fileNamesByKey(): Readonly<Dictionary<string>> {\n return { ...this._fileNamesByKey }\n }\n\n get keysByFileName(): Readonly<Dictionary<string>> {\n return { ...this._keysByFileName }\n }\n}\n"]}
1
+ {"version":3,"file":"UniqueFileNamesGenerator.js","sourceRoot":"","sources":["../../../src/dataExport/UniqueFileNamesGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary } from '../common'\nimport { FileNames } from '../utils'\n\nconst nameWithIndexRegEx = /^(.*) \\((\\d+)\\)$/ // file name like \"example (1).txt\"\n\nexport class UniqueFileNamesGenerator {\n private _fileNamesByKey: Dictionary<string>\n private _keysByFileName: Dictionary<string>\n // file names are compared ignoring case: names differing only in case overwrite each other on Windows/macOS\n private readonly _fileNamesLowerCase: Set<string>\n // last file name generated starting from a given first candidate file name (e.g. \"image (1).jpg\" => \"image (25).jpg\"):\n // the names before it in the sequence are all used already, so the search can start from it\n private readonly _lastGeneratedFileNameByFirstCandidate: Map<string, string>\n\n constructor() {\n this._fileNamesByKey = {}\n this._keysByFileName = {}\n this._fileNamesLowerCase = new Set()\n this._lastGeneratedFileNameByFirstCandidate = new Map()\n }\n\n private isFileNameUsed(fileName: string): boolean {\n return this._fileNamesLowerCase.has(fileName.toLowerCase())\n }\n\n private assignFileName(fileName: string, key: string): string {\n this._keysByFileName[fileName] = key\n this._fileNamesByKey[key] = fileName\n this._fileNamesLowerCase.add(fileName.toLowerCase())\n return fileName\n }\n\n /**\n * Generates a unique file name for the given key.\n *\n * If the key has been used before, the previously generated file name\n * associated with that key is returned, regardless of the current\n * {@link inputFileName} value.\n *\n * If the key has not been used before, the method either:\n * - returns {@link inputFileName} if it has not been used for another key, or\n * - generates the next available non-conflicting name by appending or\n * incrementing a numeric index in parentheses.\n *\n * @param inputFileName The desired base file name, including extension.\n * @param key A logical identifier whose associated file name should remain stable across calls.\n * @returns The unique file name associated with the given key.\n */\n generateUniqueFileName(inputFileName: string, key: string): string {\n const existingFileName = this._fileNamesByKey[key]\n if (existingFileName) {\n return existingFileName\n }\n if (!this.isFileNameUsed(inputFileName)) {\n // file name not used yet\n return this.assignFileName(inputFileName, key)\n }\n const firstCandidate = this.generateNextFileName(inputFileName)\n let generatedFileName = this._lastGeneratedFileNameByFirstCandidate.get(firstCandidate) ?? firstCandidate\n while (this.isFileNameUsed(generatedFileName)) {\n // file name already exists, generate the next one\n generatedFileName = this.generateNextFileName(generatedFileName)\n }\n this._lastGeneratedFileNameByFirstCandidate.set(firstCandidate, generatedFileName)\n return this.assignFileName(generatedFileName, key)\n }\n\n /**\n * Generates a new file name by incrementing an existing numeric suffix\n * of the form \"name (n)\" or appending \" (1)\" if no such suffix exists.\n *\n * @param inputFileName The original file name, including its extension.\n * @returns The updated file name with an incremented or newly added numeric suffix.\n */\n protected generateNextFileName(inputFileName: string): string {\n const name = FileNames.getName(inputFileName)\n const extension = FileNames.getExtension(inputFileName)\n let nameUpdated\n const matchRes = nameWithIndexRegEx.exec(name)\n if (matchRes) {\n const [, nameWithoutIndex, index] = matchRes\n const nextIndex = Number(index) + 1\n nameUpdated = `${nameWithoutIndex} (${nextIndex})`\n } else {\n nameUpdated = `${name} (1)`\n }\n return extension ? `${nameUpdated}.${extension}` : nameUpdated\n }\n\n get fileNamesByKey(): Readonly<Dictionary<string>> {\n return { ...this._fileNamesByKey }\n }\n\n get keysByFileName(): Readonly<Dictionary<string>> {\n return { ...this._keysByFileName }\n }\n}\n"]}
@@ -43,7 +43,8 @@ const getChildrenMinOrMaxCount = (params) => {
43
43
  return count;
44
44
  // count can be a constant value, specified in the node def min/max count prop
45
45
  const nodeDefCount = countType === NodeDefCountType.max ? NodeDefs.getMaxCount(nodeDef) : NodeDefs.getMinCount(nodeDef);
46
- return nodeDefCount ? Number(nodeDefCount) : Number.NaN;
46
+ // count expressions (array) are evaluated into the parent node meta (childrenMinCount/childrenMaxCount)
47
+ return nodeDefCount && !Array.isArray(nodeDefCount) ? Number(nodeDefCount) : Number.NaN;
47
48
  };
48
49
  const getChildrenMaxCount = (params) => getChildrenMinOrMaxCount(Object.assign(Object.assign({}, params), { countType: NodeDefCountType.max }));
49
50
  const getChildrenMinCount = (params) => getChildrenMinOrMaxCount(Object.assign(Object.assign({}, params), { countType: NodeDefCountType.min }));
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/node/nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary } from '../common'\nimport { NodeDef, NodeDefCountType, NodeDefs } from '../nodeDef'\nimport { Dates, Objects } from '../utils'\nimport { MutationOptions, toMutationOptions } from '../utils/mutationOptions'\nimport { ArenaRecordNode } from './node'\n\nconst isRoot = (node: ArenaRecordNode): boolean => !node.parentUuid\n\nconst areEqual = (nodeA: ArenaRecordNode, nodeB: ArenaRecordNode): boolean => nodeA.uuid === nodeB.uuid\n\nconst isChildApplicable = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child applicability is not defined for a node definition, consider it applicable\n return node.meta?.childApplicability?.[nodeDefUuid] !== false\n}\n\nconst isChildEditable = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child editability is not defined for a node definition, consider it editable\n return node.meta?.cEdit?.[nodeDefUuid] !== false\n}\n\nconst isChildVisible = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child visibility is not defined for a node definition, consider it visible\n return node.meta?.cVis?.[nodeDefUuid] !== false\n}\n\nconst isChildRequired = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child \"required if\" condition is not defined or not met for a node definition, consider it not required\n return node.meta?.cReq?.[nodeDefUuid] === true\n}\n\nconst getChildrenMinOrMaxCount = (params: {\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<any>\n countType: NodeDefCountType\n}): number => {\n const { parentNode, nodeDef, countType } = params\n const countIndex =\n countType === NodeDefCountType.max ? parentNode.meta?.childrenMaxCount : parentNode.meta?.childrenMinCount\n\n const count = countIndex?.[nodeDef.uuid]\n if (!Objects.isEmpty(count)) return count!\n\n // count can be a constant value, specified in the node def min/max count prop\n const nodeDefCount =\n countType === NodeDefCountType.max ? NodeDefs.getMaxCount(nodeDef) : NodeDefs.getMinCount(nodeDef)\n return nodeDefCount ? Number(nodeDefCount) : Number.NaN\n}\n\nconst getChildrenMaxCount = (params: { parentNode: ArenaRecordNode; nodeDef: NodeDef<any> }): number =>\n getChildrenMinOrMaxCount({ ...params, countType: NodeDefCountType.max })\n\nconst getChildrenMinCount = (params: { parentNode: ArenaRecordNode; nodeDef: NodeDef<any> }): number =>\n getChildrenMinOrMaxCount({ ...params, countType: NodeDefCountType.min })\n\nconst getHierarchy = (node: ArenaRecordNode): string[] => [...(node.meta?.h ?? [])]\n\nconst getHierarchyCode = (node: ArenaRecordNode): string[] => [...(node.meta?.hCode ?? [])]\n\nconst mergeNodes = (target: ArenaRecordNode, ...sources: ArenaRecordNode[] | object[]): ArenaRecordNode =>\n Objects.deepMerge(target, ...sources) as unknown as ArenaRecordNode\n\nconst isDefaultValueApplied = (node: ArenaRecordNode): boolean => node?.meta?.defaultValueApplied ?? false\n\nconst isQualifierValueApplied = (node: ArenaRecordNode): boolean => node?.meta?.qualifierValueApplied ?? false\n\nconst isValueBlank = (node: ArenaRecordNode): boolean => Objects.isEmpty(node.value)\n\nconst isValueNotBlank = (node: ArenaRecordNode): boolean => Objects.isNotEmpty(node.value)\n\nconst hasUserInputValue = (node: ArenaRecordNode): boolean =>\n node && !isValueBlank(node) && !isDefaultValueApplied(node) && !isQualifierValueApplied(node)\n\nconst assocChildApplicability = (node: ArenaRecordNode, nodeDefUuid: string, applicable: boolean): ArenaRecordNode => {\n const childApplicability = { ...node.meta?.childApplicability }\n if (!applicable) {\n childApplicability[nodeDefUuid] = applicable\n } else {\n delete childApplicability[nodeDefUuid]\n }\n return {\n ...node,\n meta: { ...node.meta, childApplicability },\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n}\n\nconst dissocChildApplicability = (node: ArenaRecordNode, nodeDefUuid: string) => {\n const childApplicability = { ...node.meta?.childApplicability }\n delete childApplicability[nodeDefUuid]\n return {\n ...node,\n meta: { ...node.meta, childApplicability },\n }\n}\n\ntype MetaBooleanDictionaryProp = 'childApplicability' | 'cEdit' | 'cVis' | 'cReq'\n\nconst updateMetaDictionary = ({\n node,\n nodeDefUuid,\n propName,\n propValue,\n defaultValue = true,\n sideEffect,\n}: {\n node: ArenaRecordNode\n nodeDefUuid: string\n propName: MetaBooleanDictionaryProp\n propValue: boolean\n defaultValue?: boolean\n sideEffect: boolean\n}): ArenaRecordNode => {\n const nodeUpdated = sideEffect ? node : { ...node }\n const metaOriginal = nodeUpdated.meta ?? {}\n const meta = sideEffect ? metaOriginal : { ...metaOriginal }\n const existingDictionary: Dictionary<boolean> = meta[propName] ?? {}\n const dictionary = sideEffect ? existingDictionary : { ...existingDictionary }\n if (propValue === defaultValue) {\n // default value: not stored\n delete dictionary[nodeDefUuid]\n } else {\n dictionary[nodeDefUuid] = propValue\n }\n meta[propName] = dictionary\n nodeUpdated.meta = meta\n nodeUpdated.updated = true\n nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n return nodeUpdated\n}\n\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n options?: MutationOptions\n): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n sideEffect: boolean\n): ArenaRecordNode\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n options?: MutationOptions | boolean\n): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n return updateMetaDictionary({ node, nodeDefUuid, propName: 'cEdit', propValue: editable, sideEffect })\n}\n\nconst assocChildRequired = (\n node: ArenaRecordNode,\n nodeDefUuid: string,\n required: boolean,\n options?: MutationOptions\n): ArenaRecordNode => {\n const { sideEffect = false } = options ?? {}\n return updateMetaDictionary({\n node,\n nodeDefUuid,\n propName: 'cReq',\n propValue: required,\n defaultValue: false,\n sideEffect,\n })\n}\n\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n options?: MutationOptions\n): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n sideEffect: boolean\n): ArenaRecordNode\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n options?: MutationOptions | boolean\n): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n return updateMetaDictionary({ node, nodeDefUuid, propName: 'cVis', propValue: visible, sideEffect })\n}\n\nconst assocChildrenCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n countType: NodeDefCountType\n}): ArenaRecordNode => {\n const { node, nodeDefUuid, count, countType } = params\n const countIndex = {\n ...(countType === NodeDefCountType.max ? node.meta?.childrenMaxCount : node.meta?.childrenMinCount),\n }\n if (Number.isNaN(count)) {\n delete countIndex[nodeDefUuid]\n } else {\n countIndex[nodeDefUuid] = count\n }\n const metaUpdated = { ...node.meta }\n if (countType === NodeDefCountType.max) {\n metaUpdated.childrenMaxCount = countIndex\n } else {\n metaUpdated.childrenMinCount = countIndex\n }\n return {\n ...node,\n meta: metaUpdated,\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n}\n\nconst assocChildrenMaxCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n}): ArenaRecordNode => assocChildrenCount({ ...params, countType: NodeDefCountType.max })\n\nconst assocChildrenMinCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n}): ArenaRecordNode => assocChildrenCount({ ...params, countType: NodeDefCountType.min })\n\nconst clearStatusFlagsInPlace = (node: ArenaRecordNode): ArenaRecordNode => {\n // do not use \"delete\": it would switch the node object to the (much bigger) V8 dictionary mode\n if (node.created !== undefined) node.created = undefined\n if (node.deleted !== undefined) node.deleted = undefined\n if (node.updated !== undefined) node.updated = undefined\n return node\n}\n\nconst omitStatusFlags = (node: ArenaRecordNode): ArenaRecordNode => {\n const { created: _created, deleted: _deleted, updated: _updated, ...nodeCleaned } = node\n return nodeCleaned\n}\n\nconst removeStatusFlags = ({\n node,\n sideEffect = false,\n}: {\n node: ArenaRecordNode\n sideEffect?: boolean\n}): ArenaRecordNode => (sideEffect ? clearStatusFlagsInPlace(node) : omitStatusFlags(node))\n\nfunction assocValue(node: ArenaRecordNode, value: any, options?: MutationOptions): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocValue(node: ArenaRecordNode, value: any, sideEffect: boolean): ArenaRecordNode\nfunction assocValue(node: ArenaRecordNode, value: any, options?: MutationOptions | boolean): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.value = value\n nodeUpdated.updated = true\n nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n if (isDefaultValueApplied(nodeUpdated) || isQualifierValueApplied(nodeUpdated)) {\n // reset defaultValueApplied and qualifierValueApplied flags\n const metaOriginal = nodeUpdated.meta ?? {}\n const meta = sideEffect ? metaOriginal : { ...metaOriginal }\n nodeUpdated.meta = { ...meta, defaultValueApplied: false, qualifierValueApplied: false }\n }\n return nodeUpdated\n}\n\nexport const Nodes = {\n isRoot,\n areEqual,\n isChildApplicable,\n isChildEditable,\n isChildVisible,\n isChildRequired,\n getChildrenMinOrMaxCount,\n getChildrenMaxCount,\n getChildrenMinCount,\n getHierarchy,\n getHierarchyCode,\n isDefaultValueApplied,\n isQualifierValueApplied,\n isValueBlank,\n isValueNotBlank,\n hasUserInputValue,\n // update\n assocChildApplicability,\n dissocChildApplicability,\n assocChildEditable,\n assocChildVisible,\n assocChildRequired,\n assocChildrenCount,\n assocChildrenMaxCount,\n assocChildrenMinCount,\n mergeNodes,\n removeStatusFlags,\n assocValue,\n}\n"]}
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/node/nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary } from '../common'\nimport { NodeDef, NodeDefCountType, NodeDefs } from '../nodeDef'\nimport { Dates, Objects } from '../utils'\nimport { MutationOptions, toMutationOptions } from '../utils/mutationOptions'\nimport { ArenaRecordNode } from './node'\n\nconst isRoot = (node: ArenaRecordNode): boolean => !node.parentUuid\n\nconst areEqual = (nodeA: ArenaRecordNode, nodeB: ArenaRecordNode): boolean => nodeA.uuid === nodeB.uuid\n\nconst isChildApplicable = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child applicability is not defined for a node definition, consider it applicable\n return node.meta?.childApplicability?.[nodeDefUuid] !== false\n}\n\nconst isChildEditable = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child editability is not defined for a node definition, consider it editable\n return node.meta?.cEdit?.[nodeDefUuid] !== false\n}\n\nconst isChildVisible = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child visibility is not defined for a node definition, consider it visible\n return node.meta?.cVis?.[nodeDefUuid] !== false\n}\n\nconst isChildRequired = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child \"required if\" condition is not defined or not met for a node definition, consider it not required\n return node.meta?.cReq?.[nodeDefUuid] === true\n}\n\nconst getChildrenMinOrMaxCount = (params: {\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<any>\n countType: NodeDefCountType\n}): number => {\n const { parentNode, nodeDef, countType } = params\n const countIndex =\n countType === NodeDefCountType.max ? parentNode.meta?.childrenMaxCount : parentNode.meta?.childrenMinCount\n\n const count = countIndex?.[nodeDef.uuid]\n if (!Objects.isEmpty(count)) return count!\n\n // count can be a constant value, specified in the node def min/max count prop\n const nodeDefCount =\n countType === NodeDefCountType.max ? NodeDefs.getMaxCount(nodeDef) : NodeDefs.getMinCount(nodeDef)\n // count expressions (array) are evaluated into the parent node meta (childrenMinCount/childrenMaxCount)\n return nodeDefCount && !Array.isArray(nodeDefCount) ? Number(nodeDefCount) : Number.NaN\n}\n\nconst getChildrenMaxCount = (params: { parentNode: ArenaRecordNode; nodeDef: NodeDef<any> }): number =>\n getChildrenMinOrMaxCount({ ...params, countType: NodeDefCountType.max })\n\nconst getChildrenMinCount = (params: { parentNode: ArenaRecordNode; nodeDef: NodeDef<any> }): number =>\n getChildrenMinOrMaxCount({ ...params, countType: NodeDefCountType.min })\n\nconst getHierarchy = (node: ArenaRecordNode): string[] => [...(node.meta?.h ?? [])]\n\nconst getHierarchyCode = (node: ArenaRecordNode): string[] => [...(node.meta?.hCode ?? [])]\n\nconst mergeNodes = (target: ArenaRecordNode, ...sources: ArenaRecordNode[] | object[]): ArenaRecordNode =>\n Objects.deepMerge(target, ...sources) as unknown as ArenaRecordNode\n\nconst isDefaultValueApplied = (node: ArenaRecordNode): boolean => node?.meta?.defaultValueApplied ?? false\n\nconst isQualifierValueApplied = (node: ArenaRecordNode): boolean => node?.meta?.qualifierValueApplied ?? false\n\nconst isValueBlank = (node: ArenaRecordNode): boolean => Objects.isEmpty(node.value)\n\nconst isValueNotBlank = (node: ArenaRecordNode): boolean => Objects.isNotEmpty(node.value)\n\nconst hasUserInputValue = (node: ArenaRecordNode): boolean =>\n node && !isValueBlank(node) && !isDefaultValueApplied(node) && !isQualifierValueApplied(node)\n\nconst assocChildApplicability = (node: ArenaRecordNode, nodeDefUuid: string, applicable: boolean): ArenaRecordNode => {\n const childApplicability = { ...node.meta?.childApplicability }\n if (!applicable) {\n childApplicability[nodeDefUuid] = applicable\n } else {\n delete childApplicability[nodeDefUuid]\n }\n return {\n ...node,\n meta: { ...node.meta, childApplicability },\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n}\n\nconst dissocChildApplicability = (node: ArenaRecordNode, nodeDefUuid: string) => {\n const childApplicability = { ...node.meta?.childApplicability }\n delete childApplicability[nodeDefUuid]\n return {\n ...node,\n meta: { ...node.meta, childApplicability },\n }\n}\n\ntype MetaBooleanDictionaryProp = 'childApplicability' | 'cEdit' | 'cVis' | 'cReq'\n\nconst updateMetaDictionary = ({\n node,\n nodeDefUuid,\n propName,\n propValue,\n defaultValue = true,\n sideEffect,\n}: {\n node: ArenaRecordNode\n nodeDefUuid: string\n propName: MetaBooleanDictionaryProp\n propValue: boolean\n defaultValue?: boolean\n sideEffect: boolean\n}): ArenaRecordNode => {\n const nodeUpdated = sideEffect ? node : { ...node }\n const metaOriginal = nodeUpdated.meta ?? {}\n const meta = sideEffect ? metaOriginal : { ...metaOriginal }\n const existingDictionary: Dictionary<boolean> = meta[propName] ?? {}\n const dictionary = sideEffect ? existingDictionary : { ...existingDictionary }\n if (propValue === defaultValue) {\n // default value: not stored\n delete dictionary[nodeDefUuid]\n } else {\n dictionary[nodeDefUuid] = propValue\n }\n meta[propName] = dictionary\n nodeUpdated.meta = meta\n nodeUpdated.updated = true\n nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n return nodeUpdated\n}\n\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n options?: MutationOptions\n): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n sideEffect: boolean\n): ArenaRecordNode\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n options?: MutationOptions | boolean\n): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n return updateMetaDictionary({ node, nodeDefUuid, propName: 'cEdit', propValue: editable, sideEffect })\n}\n\nconst assocChildRequired = (\n node: ArenaRecordNode,\n nodeDefUuid: string,\n required: boolean,\n options?: MutationOptions\n): ArenaRecordNode => {\n const { sideEffect = false } = options ?? {}\n return updateMetaDictionary({\n node,\n nodeDefUuid,\n propName: 'cReq',\n propValue: required,\n defaultValue: false,\n sideEffect,\n })\n}\n\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n options?: MutationOptions\n): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n sideEffect: boolean\n): ArenaRecordNode\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n options?: MutationOptions | boolean\n): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n return updateMetaDictionary({ node, nodeDefUuid, propName: 'cVis', propValue: visible, sideEffect })\n}\n\nconst assocChildrenCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n countType: NodeDefCountType\n}): ArenaRecordNode => {\n const { node, nodeDefUuid, count, countType } = params\n const countIndex = {\n ...(countType === NodeDefCountType.max ? node.meta?.childrenMaxCount : node.meta?.childrenMinCount),\n }\n if (Number.isNaN(count)) {\n delete countIndex[nodeDefUuid]\n } else {\n countIndex[nodeDefUuid] = count\n }\n const metaUpdated = { ...node.meta }\n if (countType === NodeDefCountType.max) {\n metaUpdated.childrenMaxCount = countIndex\n } else {\n metaUpdated.childrenMinCount = countIndex\n }\n return {\n ...node,\n meta: metaUpdated,\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n}\n\nconst assocChildrenMaxCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n}): ArenaRecordNode => assocChildrenCount({ ...params, countType: NodeDefCountType.max })\n\nconst assocChildrenMinCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n}): ArenaRecordNode => assocChildrenCount({ ...params, countType: NodeDefCountType.min })\n\nconst clearStatusFlagsInPlace = (node: ArenaRecordNode): ArenaRecordNode => {\n // do not use \"delete\": it would switch the node object to the (much bigger) V8 dictionary mode\n if (node.created !== undefined) node.created = undefined\n if (node.deleted !== undefined) node.deleted = undefined\n if (node.updated !== undefined) node.updated = undefined\n return node\n}\n\nconst omitStatusFlags = (node: ArenaRecordNode): ArenaRecordNode => {\n const { created: _created, deleted: _deleted, updated: _updated, ...nodeCleaned } = node\n return nodeCleaned\n}\n\nconst removeStatusFlags = ({\n node,\n sideEffect = false,\n}: {\n node: ArenaRecordNode\n sideEffect?: boolean\n}): ArenaRecordNode => (sideEffect ? clearStatusFlagsInPlace(node) : omitStatusFlags(node))\n\nfunction assocValue(node: ArenaRecordNode, value: any, options?: MutationOptions): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocValue(node: ArenaRecordNode, value: any, sideEffect: boolean): ArenaRecordNode\nfunction assocValue(node: ArenaRecordNode, value: any, options?: MutationOptions | boolean): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.value = value\n nodeUpdated.updated = true\n nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n if (isDefaultValueApplied(nodeUpdated) || isQualifierValueApplied(nodeUpdated)) {\n // reset defaultValueApplied and qualifierValueApplied flags\n const metaOriginal = nodeUpdated.meta ?? {}\n const meta = sideEffect ? metaOriginal : { ...metaOriginal }\n nodeUpdated.meta = { ...meta, defaultValueApplied: false, qualifierValueApplied: false }\n }\n return nodeUpdated\n}\n\nexport const Nodes = {\n isRoot,\n areEqual,\n isChildApplicable,\n isChildEditable,\n isChildVisible,\n isChildRequired,\n getChildrenMinOrMaxCount,\n getChildrenMaxCount,\n getChildrenMinCount,\n getHierarchy,\n getHierarchyCode,\n isDefaultValueApplied,\n isQualifierValueApplied,\n isValueBlank,\n isValueNotBlank,\n hasUserInputValue,\n // update\n assocChildApplicability,\n dissocChildApplicability,\n assocChildEditable,\n assocChildVisible,\n assocChildRequired,\n assocChildrenCount,\n assocChildrenMaxCount,\n assocChildrenMinCount,\n mergeNodes,\n removeStatusFlags,\n assocValue,\n}\n"]}
@@ -78,7 +78,7 @@ const fix = (params) => {
78
78
  const fixNodeDefs = (params) => {
79
79
  var _a;
80
80
  const { nodeDefs, cycles } = params;
81
- const nodeDefsResult = {};
81
+ const nodeDefsResult = Object.assign({}, nodeDefs);
82
82
  const updatedNodeDefs = {};
83
83
  for (const cycle of cycles) {
84
84
  for (const nodeDef of Object.values(nodeDefs)) {
@@ -1 +1 @@
1
- {"version":3,"file":"nodeDefsFixer.js","sourceRoot":"","sources":["../../../src/survey/nodeDefsFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { SystemError, SystemErrorKeys } from '../error'\nimport { NodeDef, NodeDefEntity, NodeDefMap, NodeDefs } from '../nodeDef'\nimport { NodeDefEntityLayoutChildItem } from '../nodeDef/types/entity'\nimport { Objects } from '../utils'\nimport { MutationOptions } from '../utils/mutationOptions'\n\ntype NodeDefsFixParams = MutationOptions & {\n nodeDefs: NodeDefMap\n cycles: string[]\n}\n\ntype NodeDefsInCycleFixParams = NodeDefsFixParams & {\n cycle: string\n}\n\ntype NodeDefFixParams = NodeDefsInCycleFixParams & {\n nodeDef: NodeDef<any>\n}\n\ntype LayoutPropFixParams = NodeDefFixParams & {\n propName: string\n}\n\ntype LayoutPropFixerFnParams = LayoutPropFixParams & { propOld: any }\n\nconst calculateNodeDefHierarchy = (params: { nodeDef: NodeDef<any>; nodeDefs: NodeDefMap }): string[] => {\n const { nodeDef, nodeDefs } = params\n const hierarchy = []\n const visitedNodeDefUuids = new Set<string>()\n let currentParentUuid = nodeDef.parentUuid\n while (currentParentUuid) {\n if (visitedNodeDefUuids.has(currentParentUuid)) {\n throw new SystemError(SystemErrorKeys.nodeDef.hierarchyCircularDependency, {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n visitedNodeDefUuids.add(currentParentUuid)\n hierarchy.unshift(currentParentUuid)\n const currentParentNode = nodeDefs[currentParentUuid]\n if (!currentParentNode) {\n throw new SystemError(SystemErrorKeys.nodeDef.parentNotFound, {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n currentParentUuid = currentParentNode.parentUuid\n }\n return hierarchy\n}\n\nconst fixHierarchy = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDefs, nodeDef, sideEffect } = params\n const calculatedHierarchy = calculateNodeDefHierarchy({ nodeDefs, nodeDef })\n // compare the whole hierarchy: a node def moved to another parent at the same depth has a hierarchy with the same length\n return Objects.isEqual(calculatedHierarchy, NodeDefs.getMetaHierarchy(nodeDef))\n ? null\n : Objects.assocPath({ obj: nodeDef, path: ['meta', 'h'], value: calculatedHierarchy, sideEffect })\n}\n\nconst fixLayoutProp = (\n params: LayoutPropFixParams & { fixerFn: (params: LayoutPropFixerFnParams) => any }\n): NodeDef<any> | null => {\n const { cycle, nodeDef, propName, sideEffect, fixerFn } = params\n\n const propPath = ['props', 'layout', cycle, propName]\n\n const propOld = Objects.path(propPath)(nodeDef)\n\n if (Objects.isEmpty(propOld)) return null\n\n const propFixed = fixerFn({ ...params, propOld })\n\n if (Objects.isEqual(propOld, propFixed)) return null\n\n return Objects.assocPath({\n obj: nodeDef,\n path: propPath,\n value: propFixed,\n sideEffect,\n })\n}\n\nconst fixIndexChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'indexChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: indexChildren }) =>\n (indexChildren as string[]).filter((childDefUuid) => {\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n NodeDefs.isEntity(childDef) &&\n NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity)\n )\n }),\n })\n\nconst fixLayoutChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'layoutChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: layoutChildren }) =>\n (layoutChildren as NodeDefEntityLayoutChildItem[]).filter((item) => {\n const childDefUuid = typeof item === 'string' ? item : item.i\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n (!NodeDefs.isEntity(childDef) || !NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity))\n )\n }),\n })\n\nconst fix = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDef } = params\n let nodeDefFixed: NodeDef<any> | null = fixHierarchy(params)\n if (NodeDefs.isEntity(nodeDef)) {\n nodeDefFixed = fixIndexChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n nodeDefFixed = fixLayoutChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n }\n return nodeDefFixed\n}\n\nconst fixNodeDefs = (params: NodeDefsFixParams): { nodeDefs: NodeDefMap; updatedNodeDefs: NodeDefMap } => {\n const { nodeDefs, cycles } = params\n const nodeDefsResult: NodeDefMap = {}\n const updatedNodeDefs: NodeDefMap = {}\n\n for (const cycle of cycles) {\n for (const nodeDef of Object.values(nodeDefs)) {\n const nodeDefToFix = nodeDefsResult[nodeDef.uuid] ?? nodeDef\n const fixedNodeDef = fix({ ...params, cycle, nodeDef: nodeDefToFix })\n if (fixedNodeDef) {\n updatedNodeDefs[nodeDef.uuid] = fixedNodeDef\n }\n nodeDefsResult[nodeDef.uuid] = fixedNodeDef ?? nodeDefToFix\n }\n }\n return {\n nodeDefs: nodeDefsResult,\n updatedNodeDefs,\n }\n}\n\nexport const NodeDefsFixer = {\n fixNodeDefs,\n}\n"]}
1
+ {"version":3,"file":"nodeDefsFixer.js","sourceRoot":"","sources":["../../../src/survey/nodeDefsFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { SystemError, SystemErrorKeys } from '../error'\nimport { NodeDef, NodeDefEntity, NodeDefMap, NodeDefs } from '../nodeDef'\nimport { NodeDefEntityLayoutChildItem } from '../nodeDef/types/entity'\nimport { Objects } from '../utils'\nimport { MutationOptions } from '../utils/mutationOptions'\n\ntype NodeDefsFixParams = MutationOptions & {\n nodeDefs: NodeDefMap\n cycles: string[]\n}\n\ntype NodeDefsInCycleFixParams = NodeDefsFixParams & {\n cycle: string\n}\n\ntype NodeDefFixParams = NodeDefsInCycleFixParams & {\n nodeDef: NodeDef<any>\n}\n\ntype LayoutPropFixParams = NodeDefFixParams & {\n propName: string\n}\n\ntype LayoutPropFixerFnParams = LayoutPropFixParams & { propOld: any }\n\nconst calculateNodeDefHierarchy = (params: { nodeDef: NodeDef<any>; nodeDefs: NodeDefMap }): string[] => {\n const { nodeDef, nodeDefs } = params\n const hierarchy = []\n const visitedNodeDefUuids = new Set<string>()\n let currentParentUuid = nodeDef.parentUuid\n while (currentParentUuid) {\n if (visitedNodeDefUuids.has(currentParentUuid)) {\n throw new SystemError(SystemErrorKeys.nodeDef.hierarchyCircularDependency, {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n visitedNodeDefUuids.add(currentParentUuid)\n hierarchy.unshift(currentParentUuid)\n const currentParentNode = nodeDefs[currentParentUuid]\n if (!currentParentNode) {\n throw new SystemError(SystemErrorKeys.nodeDef.parentNotFound, {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n currentParentUuid = currentParentNode.parentUuid\n }\n return hierarchy\n}\n\nconst fixHierarchy = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDefs, nodeDef, sideEffect } = params\n const calculatedHierarchy = calculateNodeDefHierarchy({ nodeDefs, nodeDef })\n // compare the whole hierarchy: a node def moved to another parent at the same depth has a hierarchy with the same length\n return Objects.isEqual(calculatedHierarchy, NodeDefs.getMetaHierarchy(nodeDef))\n ? null\n : Objects.assocPath({ obj: nodeDef, path: ['meta', 'h'], value: calculatedHierarchy, sideEffect })\n}\n\nconst fixLayoutProp = (\n params: LayoutPropFixParams & { fixerFn: (params: LayoutPropFixerFnParams) => any }\n): NodeDef<any> | null => {\n const { cycle, nodeDef, propName, sideEffect, fixerFn } = params\n\n const propPath = ['props', 'layout', cycle, propName]\n\n const propOld = Objects.path(propPath)(nodeDef)\n\n if (Objects.isEmpty(propOld)) return null\n\n const propFixed = fixerFn({ ...params, propOld })\n\n if (Objects.isEqual(propOld, propFixed)) return null\n\n return Objects.assocPath({\n obj: nodeDef,\n path: propPath,\n value: propFixed,\n sideEffect,\n })\n}\n\nconst fixIndexChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'indexChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: indexChildren }) =>\n (indexChildren as string[]).filter((childDefUuid) => {\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n NodeDefs.isEntity(childDef) &&\n NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity)\n )\n }),\n })\n\nconst fixLayoutChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'layoutChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: layoutChildren }) =>\n (layoutChildren as NodeDefEntityLayoutChildItem[]).filter((item) => {\n const childDefUuid = typeof item === 'string' ? item : item.i\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n (!NodeDefs.isEntity(childDef) || !NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity))\n )\n }),\n })\n\nconst fix = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDef } = params\n let nodeDefFixed: NodeDef<any> | null = fixHierarchy(params)\n if (NodeDefs.isEntity(nodeDef)) {\n nodeDefFixed = fixIndexChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n nodeDefFixed = fixLayoutChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n }\n return nodeDefFixed\n}\n\nconst fixNodeDefs = (params: NodeDefsFixParams): { nodeDefs: NodeDefMap; updatedNodeDefs: NodeDefMap } => {\n const { nodeDefs, cycles } = params\n const nodeDefsResult: NodeDefMap = { ...nodeDefs }\n const updatedNodeDefs: NodeDefMap = {}\n\n for (const cycle of cycles) {\n for (const nodeDef of Object.values(nodeDefs)) {\n const nodeDefToFix = nodeDefsResult[nodeDef.uuid] ?? nodeDef\n const fixedNodeDef = fix({ ...params, cycle, nodeDef: nodeDefToFix })\n if (fixedNodeDef) {\n updatedNodeDefs[nodeDef.uuid] = fixedNodeDef\n }\n nodeDefsResult[nodeDef.uuid] = fixedNodeDef ?? nodeDefToFix\n }\n }\n return {\n nodeDefs: nodeDefsResult,\n updatedNodeDefs,\n }\n}\n\nexport const NodeDefsFixer = {\n fixNodeDefs,\n}\n"]}
@@ -46,7 +46,8 @@ const getChildrenMinOrMaxCount = (params) => {
46
46
  return count;
47
47
  // count can be a constant value, specified in the node def min/max count prop
48
48
  const nodeDefCount = countType === nodeDef_1.NodeDefCountType.max ? nodeDef_1.NodeDefs.getMaxCount(nodeDef) : nodeDef_1.NodeDefs.getMinCount(nodeDef);
49
- return nodeDefCount ? Number(nodeDefCount) : Number.NaN;
49
+ // count expressions (array) are evaluated into the parent node meta (childrenMinCount/childrenMaxCount)
50
+ return nodeDefCount && !Array.isArray(nodeDefCount) ? Number(nodeDefCount) : Number.NaN;
50
51
  };
51
52
  const getChildrenMaxCount = (params) => getChildrenMinOrMaxCount(Object.assign(Object.assign({}, params), { countType: nodeDef_1.NodeDefCountType.max }));
52
53
  const getChildrenMinCount = (params) => getChildrenMinOrMaxCount(Object.assign(Object.assign({}, params), { countType: nodeDef_1.NodeDefCountType.min }));
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/node/nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary } from '../common'\nimport { NodeDef, NodeDefCountType, NodeDefs } from '../nodeDef'\nimport { Dates, Objects } from '../utils'\nimport { MutationOptions, toMutationOptions } from '../utils/mutationOptions'\nimport { ArenaRecordNode } from './node'\n\nconst isRoot = (node: ArenaRecordNode): boolean => !node.parentUuid\n\nconst areEqual = (nodeA: ArenaRecordNode, nodeB: ArenaRecordNode): boolean => nodeA.uuid === nodeB.uuid\n\nconst isChildApplicable = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child applicability is not defined for a node definition, consider it applicable\n return node.meta?.childApplicability?.[nodeDefUuid] !== false\n}\n\nconst isChildEditable = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child editability is not defined for a node definition, consider it editable\n return node.meta?.cEdit?.[nodeDefUuid] !== false\n}\n\nconst isChildVisible = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child visibility is not defined for a node definition, consider it visible\n return node.meta?.cVis?.[nodeDefUuid] !== false\n}\n\nconst isChildRequired = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child \"required if\" condition is not defined or not met for a node definition, consider it not required\n return node.meta?.cReq?.[nodeDefUuid] === true\n}\n\nconst getChildrenMinOrMaxCount = (params: {\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<any>\n countType: NodeDefCountType\n}): number => {\n const { parentNode, nodeDef, countType } = params\n const countIndex =\n countType === NodeDefCountType.max ? parentNode.meta?.childrenMaxCount : parentNode.meta?.childrenMinCount\n\n const count = countIndex?.[nodeDef.uuid]\n if (!Objects.isEmpty(count)) return count!\n\n // count can be a constant value, specified in the node def min/max count prop\n const nodeDefCount =\n countType === NodeDefCountType.max ? NodeDefs.getMaxCount(nodeDef) : NodeDefs.getMinCount(nodeDef)\n return nodeDefCount ? Number(nodeDefCount) : Number.NaN\n}\n\nconst getChildrenMaxCount = (params: { parentNode: ArenaRecordNode; nodeDef: NodeDef<any> }): number =>\n getChildrenMinOrMaxCount({ ...params, countType: NodeDefCountType.max })\n\nconst getChildrenMinCount = (params: { parentNode: ArenaRecordNode; nodeDef: NodeDef<any> }): number =>\n getChildrenMinOrMaxCount({ ...params, countType: NodeDefCountType.min })\n\nconst getHierarchy = (node: ArenaRecordNode): string[] => [...(node.meta?.h ?? [])]\n\nconst getHierarchyCode = (node: ArenaRecordNode): string[] => [...(node.meta?.hCode ?? [])]\n\nconst mergeNodes = (target: ArenaRecordNode, ...sources: ArenaRecordNode[] | object[]): ArenaRecordNode =>\n Objects.deepMerge(target, ...sources) as unknown as ArenaRecordNode\n\nconst isDefaultValueApplied = (node: ArenaRecordNode): boolean => node?.meta?.defaultValueApplied ?? false\n\nconst isQualifierValueApplied = (node: ArenaRecordNode): boolean => node?.meta?.qualifierValueApplied ?? false\n\nconst isValueBlank = (node: ArenaRecordNode): boolean => Objects.isEmpty(node.value)\n\nconst isValueNotBlank = (node: ArenaRecordNode): boolean => Objects.isNotEmpty(node.value)\n\nconst hasUserInputValue = (node: ArenaRecordNode): boolean =>\n node && !isValueBlank(node) && !isDefaultValueApplied(node) && !isQualifierValueApplied(node)\n\nconst assocChildApplicability = (node: ArenaRecordNode, nodeDefUuid: string, applicable: boolean): ArenaRecordNode => {\n const childApplicability = { ...node.meta?.childApplicability }\n if (!applicable) {\n childApplicability[nodeDefUuid] = applicable\n } else {\n delete childApplicability[nodeDefUuid]\n }\n return {\n ...node,\n meta: { ...node.meta, childApplicability },\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n}\n\nconst dissocChildApplicability = (node: ArenaRecordNode, nodeDefUuid: string) => {\n const childApplicability = { ...node.meta?.childApplicability }\n delete childApplicability[nodeDefUuid]\n return {\n ...node,\n meta: { ...node.meta, childApplicability },\n }\n}\n\ntype MetaBooleanDictionaryProp = 'childApplicability' | 'cEdit' | 'cVis' | 'cReq'\n\nconst updateMetaDictionary = ({\n node,\n nodeDefUuid,\n propName,\n propValue,\n defaultValue = true,\n sideEffect,\n}: {\n node: ArenaRecordNode\n nodeDefUuid: string\n propName: MetaBooleanDictionaryProp\n propValue: boolean\n defaultValue?: boolean\n sideEffect: boolean\n}): ArenaRecordNode => {\n const nodeUpdated = sideEffect ? node : { ...node }\n const metaOriginal = nodeUpdated.meta ?? {}\n const meta = sideEffect ? metaOriginal : { ...metaOriginal }\n const existingDictionary: Dictionary<boolean> = meta[propName] ?? {}\n const dictionary = sideEffect ? existingDictionary : { ...existingDictionary }\n if (propValue === defaultValue) {\n // default value: not stored\n delete dictionary[nodeDefUuid]\n } else {\n dictionary[nodeDefUuid] = propValue\n }\n meta[propName] = dictionary\n nodeUpdated.meta = meta\n nodeUpdated.updated = true\n nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n return nodeUpdated\n}\n\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n options?: MutationOptions\n): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n sideEffect: boolean\n): ArenaRecordNode\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n options?: MutationOptions | boolean\n): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n return updateMetaDictionary({ node, nodeDefUuid, propName: 'cEdit', propValue: editable, sideEffect })\n}\n\nconst assocChildRequired = (\n node: ArenaRecordNode,\n nodeDefUuid: string,\n required: boolean,\n options?: MutationOptions\n): ArenaRecordNode => {\n const { sideEffect = false } = options ?? {}\n return updateMetaDictionary({\n node,\n nodeDefUuid,\n propName: 'cReq',\n propValue: required,\n defaultValue: false,\n sideEffect,\n })\n}\n\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n options?: MutationOptions\n): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n sideEffect: boolean\n): ArenaRecordNode\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n options?: MutationOptions | boolean\n): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n return updateMetaDictionary({ node, nodeDefUuid, propName: 'cVis', propValue: visible, sideEffect })\n}\n\nconst assocChildrenCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n countType: NodeDefCountType\n}): ArenaRecordNode => {\n const { node, nodeDefUuid, count, countType } = params\n const countIndex = {\n ...(countType === NodeDefCountType.max ? node.meta?.childrenMaxCount : node.meta?.childrenMinCount),\n }\n if (Number.isNaN(count)) {\n delete countIndex[nodeDefUuid]\n } else {\n countIndex[nodeDefUuid] = count\n }\n const metaUpdated = { ...node.meta }\n if (countType === NodeDefCountType.max) {\n metaUpdated.childrenMaxCount = countIndex\n } else {\n metaUpdated.childrenMinCount = countIndex\n }\n return {\n ...node,\n meta: metaUpdated,\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n}\n\nconst assocChildrenMaxCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n}): ArenaRecordNode => assocChildrenCount({ ...params, countType: NodeDefCountType.max })\n\nconst assocChildrenMinCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n}): ArenaRecordNode => assocChildrenCount({ ...params, countType: NodeDefCountType.min })\n\nconst clearStatusFlagsInPlace = (node: ArenaRecordNode): ArenaRecordNode => {\n // do not use \"delete\": it would switch the node object to the (much bigger) V8 dictionary mode\n if (node.created !== undefined) node.created = undefined\n if (node.deleted !== undefined) node.deleted = undefined\n if (node.updated !== undefined) node.updated = undefined\n return node\n}\n\nconst omitStatusFlags = (node: ArenaRecordNode): ArenaRecordNode => {\n const { created: _created, deleted: _deleted, updated: _updated, ...nodeCleaned } = node\n return nodeCleaned\n}\n\nconst removeStatusFlags = ({\n node,\n sideEffect = false,\n}: {\n node: ArenaRecordNode\n sideEffect?: boolean\n}): ArenaRecordNode => (sideEffect ? clearStatusFlagsInPlace(node) : omitStatusFlags(node))\n\nfunction assocValue(node: ArenaRecordNode, value: any, options?: MutationOptions): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocValue(node: ArenaRecordNode, value: any, sideEffect: boolean): ArenaRecordNode\nfunction assocValue(node: ArenaRecordNode, value: any, options?: MutationOptions | boolean): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.value = value\n nodeUpdated.updated = true\n nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n if (isDefaultValueApplied(nodeUpdated) || isQualifierValueApplied(nodeUpdated)) {\n // reset defaultValueApplied and qualifierValueApplied flags\n const metaOriginal = nodeUpdated.meta ?? {}\n const meta = sideEffect ? metaOriginal : { ...metaOriginal }\n nodeUpdated.meta = { ...meta, defaultValueApplied: false, qualifierValueApplied: false }\n }\n return nodeUpdated\n}\n\nexport const Nodes = {\n isRoot,\n areEqual,\n isChildApplicable,\n isChildEditable,\n isChildVisible,\n isChildRequired,\n getChildrenMinOrMaxCount,\n getChildrenMaxCount,\n getChildrenMinCount,\n getHierarchy,\n getHierarchyCode,\n isDefaultValueApplied,\n isQualifierValueApplied,\n isValueBlank,\n isValueNotBlank,\n hasUserInputValue,\n // update\n assocChildApplicability,\n dissocChildApplicability,\n assocChildEditable,\n assocChildVisible,\n assocChildRequired,\n assocChildrenCount,\n assocChildrenMaxCount,\n assocChildrenMinCount,\n mergeNodes,\n removeStatusFlags,\n assocValue,\n}\n"]}
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/node/nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary } from '../common'\nimport { NodeDef, NodeDefCountType, NodeDefs } from '../nodeDef'\nimport { Dates, Objects } from '../utils'\nimport { MutationOptions, toMutationOptions } from '../utils/mutationOptions'\nimport { ArenaRecordNode } from './node'\n\nconst isRoot = (node: ArenaRecordNode): boolean => !node.parentUuid\n\nconst areEqual = (nodeA: ArenaRecordNode, nodeB: ArenaRecordNode): boolean => nodeA.uuid === nodeB.uuid\n\nconst isChildApplicable = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child applicability is not defined for a node definition, consider it applicable\n return node.meta?.childApplicability?.[nodeDefUuid] !== false\n}\n\nconst isChildEditable = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child editability is not defined for a node definition, consider it editable\n return node.meta?.cEdit?.[nodeDefUuid] !== false\n}\n\nconst isChildVisible = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child visibility is not defined for a node definition, consider it visible\n return node.meta?.cVis?.[nodeDefUuid] !== false\n}\n\nconst isChildRequired = (node: ArenaRecordNode, nodeDefUuid: string): boolean => {\n // if child \"required if\" condition is not defined or not met for a node definition, consider it not required\n return node.meta?.cReq?.[nodeDefUuid] === true\n}\n\nconst getChildrenMinOrMaxCount = (params: {\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<any>\n countType: NodeDefCountType\n}): number => {\n const { parentNode, nodeDef, countType } = params\n const countIndex =\n countType === NodeDefCountType.max ? parentNode.meta?.childrenMaxCount : parentNode.meta?.childrenMinCount\n\n const count = countIndex?.[nodeDef.uuid]\n if (!Objects.isEmpty(count)) return count!\n\n // count can be a constant value, specified in the node def min/max count prop\n const nodeDefCount =\n countType === NodeDefCountType.max ? NodeDefs.getMaxCount(nodeDef) : NodeDefs.getMinCount(nodeDef)\n // count expressions (array) are evaluated into the parent node meta (childrenMinCount/childrenMaxCount)\n return nodeDefCount && !Array.isArray(nodeDefCount) ? Number(nodeDefCount) : Number.NaN\n}\n\nconst getChildrenMaxCount = (params: { parentNode: ArenaRecordNode; nodeDef: NodeDef<any> }): number =>\n getChildrenMinOrMaxCount({ ...params, countType: NodeDefCountType.max })\n\nconst getChildrenMinCount = (params: { parentNode: ArenaRecordNode; nodeDef: NodeDef<any> }): number =>\n getChildrenMinOrMaxCount({ ...params, countType: NodeDefCountType.min })\n\nconst getHierarchy = (node: ArenaRecordNode): string[] => [...(node.meta?.h ?? [])]\n\nconst getHierarchyCode = (node: ArenaRecordNode): string[] => [...(node.meta?.hCode ?? [])]\n\nconst mergeNodes = (target: ArenaRecordNode, ...sources: ArenaRecordNode[] | object[]): ArenaRecordNode =>\n Objects.deepMerge(target, ...sources) as unknown as ArenaRecordNode\n\nconst isDefaultValueApplied = (node: ArenaRecordNode): boolean => node?.meta?.defaultValueApplied ?? false\n\nconst isQualifierValueApplied = (node: ArenaRecordNode): boolean => node?.meta?.qualifierValueApplied ?? false\n\nconst isValueBlank = (node: ArenaRecordNode): boolean => Objects.isEmpty(node.value)\n\nconst isValueNotBlank = (node: ArenaRecordNode): boolean => Objects.isNotEmpty(node.value)\n\nconst hasUserInputValue = (node: ArenaRecordNode): boolean =>\n node && !isValueBlank(node) && !isDefaultValueApplied(node) && !isQualifierValueApplied(node)\n\nconst assocChildApplicability = (node: ArenaRecordNode, nodeDefUuid: string, applicable: boolean): ArenaRecordNode => {\n const childApplicability = { ...node.meta?.childApplicability }\n if (!applicable) {\n childApplicability[nodeDefUuid] = applicable\n } else {\n delete childApplicability[nodeDefUuid]\n }\n return {\n ...node,\n meta: { ...node.meta, childApplicability },\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n}\n\nconst dissocChildApplicability = (node: ArenaRecordNode, nodeDefUuid: string) => {\n const childApplicability = { ...node.meta?.childApplicability }\n delete childApplicability[nodeDefUuid]\n return {\n ...node,\n meta: { ...node.meta, childApplicability },\n }\n}\n\ntype MetaBooleanDictionaryProp = 'childApplicability' | 'cEdit' | 'cVis' | 'cReq'\n\nconst updateMetaDictionary = ({\n node,\n nodeDefUuid,\n propName,\n propValue,\n defaultValue = true,\n sideEffect,\n}: {\n node: ArenaRecordNode\n nodeDefUuid: string\n propName: MetaBooleanDictionaryProp\n propValue: boolean\n defaultValue?: boolean\n sideEffect: boolean\n}): ArenaRecordNode => {\n const nodeUpdated = sideEffect ? node : { ...node }\n const metaOriginal = nodeUpdated.meta ?? {}\n const meta = sideEffect ? metaOriginal : { ...metaOriginal }\n const existingDictionary: Dictionary<boolean> = meta[propName] ?? {}\n const dictionary = sideEffect ? existingDictionary : { ...existingDictionary }\n if (propValue === defaultValue) {\n // default value: not stored\n delete dictionary[nodeDefUuid]\n } else {\n dictionary[nodeDefUuid] = propValue\n }\n meta[propName] = dictionary\n nodeUpdated.meta = meta\n nodeUpdated.updated = true\n nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n return nodeUpdated\n}\n\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n options?: MutationOptions\n): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n sideEffect: boolean\n): ArenaRecordNode\nfunction assocChildEditable(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n editable: boolean,\n options?: MutationOptions | boolean\n): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n return updateMetaDictionary({ node, nodeDefUuid, propName: 'cEdit', propValue: editable, sideEffect })\n}\n\nconst assocChildRequired = (\n node: ArenaRecordNode,\n nodeDefUuid: string,\n required: boolean,\n options?: MutationOptions\n): ArenaRecordNode => {\n const { sideEffect = false } = options ?? {}\n return updateMetaDictionary({\n node,\n nodeDefUuid,\n propName: 'cReq',\n propValue: required,\n defaultValue: false,\n sideEffect,\n })\n}\n\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n options?: MutationOptions\n): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n sideEffect: boolean\n): ArenaRecordNode\nfunction assocChildVisible(\n node: ArenaRecordNode,\n nodeDefUuid: string,\n visible: boolean,\n options?: MutationOptions | boolean\n): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n return updateMetaDictionary({ node, nodeDefUuid, propName: 'cVis', propValue: visible, sideEffect })\n}\n\nconst assocChildrenCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n countType: NodeDefCountType\n}): ArenaRecordNode => {\n const { node, nodeDefUuid, count, countType } = params\n const countIndex = {\n ...(countType === NodeDefCountType.max ? node.meta?.childrenMaxCount : node.meta?.childrenMinCount),\n }\n if (Number.isNaN(count)) {\n delete countIndex[nodeDefUuid]\n } else {\n countIndex[nodeDefUuid] = count\n }\n const metaUpdated = { ...node.meta }\n if (countType === NodeDefCountType.max) {\n metaUpdated.childrenMaxCount = countIndex\n } else {\n metaUpdated.childrenMinCount = countIndex\n }\n return {\n ...node,\n meta: metaUpdated,\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n}\n\nconst assocChildrenMaxCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n}): ArenaRecordNode => assocChildrenCount({ ...params, countType: NodeDefCountType.max })\n\nconst assocChildrenMinCount = (params: {\n node: ArenaRecordNode\n nodeDefUuid: string\n count: number\n}): ArenaRecordNode => assocChildrenCount({ ...params, countType: NodeDefCountType.min })\n\nconst clearStatusFlagsInPlace = (node: ArenaRecordNode): ArenaRecordNode => {\n // do not use \"delete\": it would switch the node object to the (much bigger) V8 dictionary mode\n if (node.created !== undefined) node.created = undefined\n if (node.deleted !== undefined) node.deleted = undefined\n if (node.updated !== undefined) node.updated = undefined\n return node\n}\n\nconst omitStatusFlags = (node: ArenaRecordNode): ArenaRecordNode => {\n const { created: _created, deleted: _deleted, updated: _updated, ...nodeCleaned } = node\n return nodeCleaned\n}\n\nconst removeStatusFlags = ({\n node,\n sideEffect = false,\n}: {\n node: ArenaRecordNode\n sideEffect?: boolean\n}): ArenaRecordNode => (sideEffect ? clearStatusFlagsInPlace(node) : omitStatusFlags(node))\n\nfunction assocValue(node: ArenaRecordNode, value: any, options?: MutationOptions): ArenaRecordNode\n/** @deprecated Pass the options object instead of the positional boolean: `{ sideEffect }` */\nfunction assocValue(node: ArenaRecordNode, value: any, sideEffect: boolean): ArenaRecordNode\nfunction assocValue(node: ArenaRecordNode, value: any, options?: MutationOptions | boolean): ArenaRecordNode {\n const { sideEffect = false } = toMutationOptions(options)\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.value = value\n nodeUpdated.updated = true\n nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n if (isDefaultValueApplied(nodeUpdated) || isQualifierValueApplied(nodeUpdated)) {\n // reset defaultValueApplied and qualifierValueApplied flags\n const metaOriginal = nodeUpdated.meta ?? {}\n const meta = sideEffect ? metaOriginal : { ...metaOriginal }\n nodeUpdated.meta = { ...meta, defaultValueApplied: false, qualifierValueApplied: false }\n }\n return nodeUpdated\n}\n\nexport const Nodes = {\n isRoot,\n areEqual,\n isChildApplicable,\n isChildEditable,\n isChildVisible,\n isChildRequired,\n getChildrenMinOrMaxCount,\n getChildrenMaxCount,\n getChildrenMinCount,\n getHierarchy,\n getHierarchyCode,\n isDefaultValueApplied,\n isQualifierValueApplied,\n isValueBlank,\n isValueNotBlank,\n hasUserInputValue,\n // update\n assocChildApplicability,\n dissocChildApplicability,\n assocChildEditable,\n assocChildVisible,\n assocChildRequired,\n assocChildrenCount,\n assocChildrenMaxCount,\n assocChildrenMinCount,\n mergeNodes,\n removeStatusFlags,\n assocValue,\n}\n"]}
@@ -81,7 +81,7 @@ const fix = (params) => {
81
81
  const fixNodeDefs = (params) => {
82
82
  var _a;
83
83
  const { nodeDefs, cycles } = params;
84
- const nodeDefsResult = {};
84
+ const nodeDefsResult = Object.assign({}, nodeDefs);
85
85
  const updatedNodeDefs = {};
86
86
  for (const cycle of cycles) {
87
87
  for (const nodeDef of Object.values(nodeDefs)) {
@@ -1 +1 @@
1
- {"version":3,"file":"nodeDefsFixer.js","sourceRoot":"","sources":["../../src/survey/nodeDefsFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { SystemError, SystemErrorKeys } from '../error'\nimport { NodeDef, NodeDefEntity, NodeDefMap, NodeDefs } from '../nodeDef'\nimport { NodeDefEntityLayoutChildItem } from '../nodeDef/types/entity'\nimport { Objects } from '../utils'\nimport { MutationOptions } from '../utils/mutationOptions'\n\ntype NodeDefsFixParams = MutationOptions & {\n nodeDefs: NodeDefMap\n cycles: string[]\n}\n\ntype NodeDefsInCycleFixParams = NodeDefsFixParams & {\n cycle: string\n}\n\ntype NodeDefFixParams = NodeDefsInCycleFixParams & {\n nodeDef: NodeDef<any>\n}\n\ntype LayoutPropFixParams = NodeDefFixParams & {\n propName: string\n}\n\ntype LayoutPropFixerFnParams = LayoutPropFixParams & { propOld: any }\n\nconst calculateNodeDefHierarchy = (params: { nodeDef: NodeDef<any>; nodeDefs: NodeDefMap }): string[] => {\n const { nodeDef, nodeDefs } = params\n const hierarchy = []\n const visitedNodeDefUuids = new Set<string>()\n let currentParentUuid = nodeDef.parentUuid\n while (currentParentUuid) {\n if (visitedNodeDefUuids.has(currentParentUuid)) {\n throw new SystemError(SystemErrorKeys.nodeDef.hierarchyCircularDependency, {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n visitedNodeDefUuids.add(currentParentUuid)\n hierarchy.unshift(currentParentUuid)\n const currentParentNode = nodeDefs[currentParentUuid]\n if (!currentParentNode) {\n throw new SystemError(SystemErrorKeys.nodeDef.parentNotFound, {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n currentParentUuid = currentParentNode.parentUuid\n }\n return hierarchy\n}\n\nconst fixHierarchy = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDefs, nodeDef, sideEffect } = params\n const calculatedHierarchy = calculateNodeDefHierarchy({ nodeDefs, nodeDef })\n // compare the whole hierarchy: a node def moved to another parent at the same depth has a hierarchy with the same length\n return Objects.isEqual(calculatedHierarchy, NodeDefs.getMetaHierarchy(nodeDef))\n ? null\n : Objects.assocPath({ obj: nodeDef, path: ['meta', 'h'], value: calculatedHierarchy, sideEffect })\n}\n\nconst fixLayoutProp = (\n params: LayoutPropFixParams & { fixerFn: (params: LayoutPropFixerFnParams) => any }\n): NodeDef<any> | null => {\n const { cycle, nodeDef, propName, sideEffect, fixerFn } = params\n\n const propPath = ['props', 'layout', cycle, propName]\n\n const propOld = Objects.path(propPath)(nodeDef)\n\n if (Objects.isEmpty(propOld)) return null\n\n const propFixed = fixerFn({ ...params, propOld })\n\n if (Objects.isEqual(propOld, propFixed)) return null\n\n return Objects.assocPath({\n obj: nodeDef,\n path: propPath,\n value: propFixed,\n sideEffect,\n })\n}\n\nconst fixIndexChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'indexChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: indexChildren }) =>\n (indexChildren as string[]).filter((childDefUuid) => {\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n NodeDefs.isEntity(childDef) &&\n NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity)\n )\n }),\n })\n\nconst fixLayoutChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'layoutChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: layoutChildren }) =>\n (layoutChildren as NodeDefEntityLayoutChildItem[]).filter((item) => {\n const childDefUuid = typeof item === 'string' ? item : item.i\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n (!NodeDefs.isEntity(childDef) || !NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity))\n )\n }),\n })\n\nconst fix = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDef } = params\n let nodeDefFixed: NodeDef<any> | null = fixHierarchy(params)\n if (NodeDefs.isEntity(nodeDef)) {\n nodeDefFixed = fixIndexChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n nodeDefFixed = fixLayoutChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n }\n return nodeDefFixed\n}\n\nconst fixNodeDefs = (params: NodeDefsFixParams): { nodeDefs: NodeDefMap; updatedNodeDefs: NodeDefMap } => {\n const { nodeDefs, cycles } = params\n const nodeDefsResult: NodeDefMap = {}\n const updatedNodeDefs: NodeDefMap = {}\n\n for (const cycle of cycles) {\n for (const nodeDef of Object.values(nodeDefs)) {\n const nodeDefToFix = nodeDefsResult[nodeDef.uuid] ?? nodeDef\n const fixedNodeDef = fix({ ...params, cycle, nodeDef: nodeDefToFix })\n if (fixedNodeDef) {\n updatedNodeDefs[nodeDef.uuid] = fixedNodeDef\n }\n nodeDefsResult[nodeDef.uuid] = fixedNodeDef ?? nodeDefToFix\n }\n }\n return {\n nodeDefs: nodeDefsResult,\n updatedNodeDefs,\n }\n}\n\nexport const NodeDefsFixer = {\n fixNodeDefs,\n}\n"]}
1
+ {"version":3,"file":"nodeDefsFixer.js","sourceRoot":"","sources":["../../src/survey/nodeDefsFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { SystemError, SystemErrorKeys } from '../error'\nimport { NodeDef, NodeDefEntity, NodeDefMap, NodeDefs } from '../nodeDef'\nimport { NodeDefEntityLayoutChildItem } from '../nodeDef/types/entity'\nimport { Objects } from '../utils'\nimport { MutationOptions } from '../utils/mutationOptions'\n\ntype NodeDefsFixParams = MutationOptions & {\n nodeDefs: NodeDefMap\n cycles: string[]\n}\n\ntype NodeDefsInCycleFixParams = NodeDefsFixParams & {\n cycle: string\n}\n\ntype NodeDefFixParams = NodeDefsInCycleFixParams & {\n nodeDef: NodeDef<any>\n}\n\ntype LayoutPropFixParams = NodeDefFixParams & {\n propName: string\n}\n\ntype LayoutPropFixerFnParams = LayoutPropFixParams & { propOld: any }\n\nconst calculateNodeDefHierarchy = (params: { nodeDef: NodeDef<any>; nodeDefs: NodeDefMap }): string[] => {\n const { nodeDef, nodeDefs } = params\n const hierarchy = []\n const visitedNodeDefUuids = new Set<string>()\n let currentParentUuid = nodeDef.parentUuid\n while (currentParentUuid) {\n if (visitedNodeDefUuids.has(currentParentUuid)) {\n throw new SystemError(SystemErrorKeys.nodeDef.hierarchyCircularDependency, {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n visitedNodeDefUuids.add(currentParentUuid)\n hierarchy.unshift(currentParentUuid)\n const currentParentNode = nodeDefs[currentParentUuid]\n if (!currentParentNode) {\n throw new SystemError(SystemErrorKeys.nodeDef.parentNotFound, {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n currentParentUuid = currentParentNode.parentUuid\n }\n return hierarchy\n}\n\nconst fixHierarchy = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDefs, nodeDef, sideEffect } = params\n const calculatedHierarchy = calculateNodeDefHierarchy({ nodeDefs, nodeDef })\n // compare the whole hierarchy: a node def moved to another parent at the same depth has a hierarchy with the same length\n return Objects.isEqual(calculatedHierarchy, NodeDefs.getMetaHierarchy(nodeDef))\n ? null\n : Objects.assocPath({ obj: nodeDef, path: ['meta', 'h'], value: calculatedHierarchy, sideEffect })\n}\n\nconst fixLayoutProp = (\n params: LayoutPropFixParams & { fixerFn: (params: LayoutPropFixerFnParams) => any }\n): NodeDef<any> | null => {\n const { cycle, nodeDef, propName, sideEffect, fixerFn } = params\n\n const propPath = ['props', 'layout', cycle, propName]\n\n const propOld = Objects.path(propPath)(nodeDef)\n\n if (Objects.isEmpty(propOld)) return null\n\n const propFixed = fixerFn({ ...params, propOld })\n\n if (Objects.isEqual(propOld, propFixed)) return null\n\n return Objects.assocPath({\n obj: nodeDef,\n path: propPath,\n value: propFixed,\n sideEffect,\n })\n}\n\nconst fixIndexChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'indexChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: indexChildren }) =>\n (indexChildren as string[]).filter((childDefUuid) => {\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n NodeDefs.isEntity(childDef) &&\n NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity)\n )\n }),\n })\n\nconst fixLayoutChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'layoutChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: layoutChildren }) =>\n (layoutChildren as NodeDefEntityLayoutChildItem[]).filter((item) => {\n const childDefUuid = typeof item === 'string' ? item : item.i\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n (!NodeDefs.isEntity(childDef) || !NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity))\n )\n }),\n })\n\nconst fix = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDef } = params\n let nodeDefFixed: NodeDef<any> | null = fixHierarchy(params)\n if (NodeDefs.isEntity(nodeDef)) {\n nodeDefFixed = fixIndexChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n nodeDefFixed = fixLayoutChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n }\n return nodeDefFixed\n}\n\nconst fixNodeDefs = (params: NodeDefsFixParams): { nodeDefs: NodeDefMap; updatedNodeDefs: NodeDefMap } => {\n const { nodeDefs, cycles } = params\n const nodeDefsResult: NodeDefMap = { ...nodeDefs }\n const updatedNodeDefs: NodeDefMap = {}\n\n for (const cycle of cycles) {\n for (const nodeDef of Object.values(nodeDefs)) {\n const nodeDefToFix = nodeDefsResult[nodeDef.uuid] ?? nodeDef\n const fixedNodeDef = fix({ ...params, cycle, nodeDef: nodeDefToFix })\n if (fixedNodeDef) {\n updatedNodeDefs[nodeDef.uuid] = fixedNodeDef\n }\n nodeDefsResult[nodeDef.uuid] = fixedNodeDef ?? nodeDefToFix\n }\n }\n return {\n nodeDefs: nodeDefsResult,\n updatedNodeDefs,\n }\n}\n\nexport const NodeDefsFixer = {\n fixNodeDefs,\n}\n"]}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "name": "OpenForis",
5
5
  "email": "openforis.arena@gmail.com"
6
6
  },
7
- "version": "2.18.7",
7
+ "version": "2.18.9",
8
8
  "description": "Arena core module",
9
9
  "repository": {
10
10
  "type": "git",