@fnndsc/salsa 3.8.0 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/pipelines/diagram.js +4 -4
- package/dist/pipelines/diagram.js.map +1 -1
- package/dist/pipelines/manifest.js +9 -9
- package/dist/pipelines/manifest.js.map +1 -1
- package/dist/vfs/providers/pacsGrammar.d.ts +69 -0
- package/dist/vfs/providers/pacsGrammar.js +83 -0
- package/dist/vfs/providers/pacsGrammar.js.map +1 -0
- package/dist/vfs/providers/pacsHelpers.d.ts +11 -43
- package/dist/vfs/providers/pacsHelpers.js +21 -60
- package/dist/vfs/providers/pacsHelpers.js.map +1 -1
- package/package.json +7 -2
|
@@ -58,12 +58,12 @@ async function pipelineDiagram_get(specifier) {
|
|
|
58
58
|
cumin_1.errorStack.stack_push('error', `Pipeline ${resolved.value.id} not found.`);
|
|
59
59
|
return (0, cumin_1.Err)();
|
|
60
60
|
}
|
|
61
|
-
const [pipingItems,
|
|
62
|
-
pipeline.
|
|
63
|
-
pipeline.defaultParametersPage_get({ limit
|
|
61
|
+
const [pipingItems, defaultRows] = await Promise.all([
|
|
62
|
+
(0, cumin_1.listPages_drain)((offset, limit) => pipeline.pluginPipingsPage_get({ limit, offset })),
|
|
63
|
+
(0, cumin_1.listPages_drain)((offset, limit) => pipeline.defaultParametersPage_get({ limit, offset })),
|
|
64
64
|
]);
|
|
65
65
|
const pipings = pipingItems.map((item) => item.data);
|
|
66
|
-
const defaults =
|
|
66
|
+
const defaults = defaultRows
|
|
67
67
|
.map((row) => defaultParameter_narrow(row))
|
|
68
68
|
.filter((row) => row !== null);
|
|
69
69
|
const defaultsByPiping = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagram.js","sourceRoot":"","sources":["../../src/pipelines/diagram.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"diagram.js","sourceRoot":"","sources":["../../src/pipelines/diagram.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,19 +54,19 @@ async function pluginMetadata_get(cache, item, piping) {
|
|
|
54
54
|
const plugin = await item.plugin_get();
|
|
55
55
|
if (plugin === null)
|
|
56
56
|
throw new Error('piping exposes no plugin link');
|
|
57
|
-
const [
|
|
58
|
-
plugin.parametersPage_get({ limit
|
|
59
|
-
plugin.computeResourcesPage_get({ limit
|
|
57
|
+
const [parameterRows, computeRows] = await Promise.all([
|
|
58
|
+
(0, cumin_1.listPages_drain)((offset, limit) => plugin.parametersPage_get({ limit, offset })),
|
|
59
|
+
(0, cumin_1.listPages_drain)((offset, limit) => plugin.computeResourcesPage_get({ limit, offset })),
|
|
60
60
|
]);
|
|
61
61
|
return {
|
|
62
|
-
parameterDefinitions:
|
|
62
|
+
parameterDefinitions: parameterRows.map((parameter) => ({
|
|
63
63
|
name: parameter.name,
|
|
64
64
|
type: parameter.type ?? 'string',
|
|
65
65
|
optional: parameter.optional ?? false,
|
|
66
66
|
default: parameter.default,
|
|
67
67
|
help: parameter.help,
|
|
68
68
|
})),
|
|
69
|
-
computeResources:
|
|
69
|
+
computeResources: computeRows
|
|
70
70
|
.map((compute) => compute.name)
|
|
71
71
|
.filter((name) => typeof name === 'string'),
|
|
72
72
|
};
|
|
@@ -112,11 +112,11 @@ function definedValue_getFirst(...values) {
|
|
|
112
112
|
async function pipelineManifest_project(pipelineRecord, pipeline, detail, cache) {
|
|
113
113
|
const manifestKey = `${pipelineRecord.id}:${detail}`;
|
|
114
114
|
try {
|
|
115
|
-
const [pipingItems,
|
|
116
|
-
pipeline.
|
|
117
|
-
pipeline.defaultParametersPage_get({ limit
|
|
115
|
+
const [pipingItems, defaultRows] = await Promise.all([
|
|
116
|
+
(0, cumin_1.listPages_drain)((offset, limit) => pipeline.pluginPipingsPage_get({ limit, offset })),
|
|
117
|
+
(0, cumin_1.listPages_drain)((offset, limit) => pipeline.defaultParametersPage_get({ limit, offset })),
|
|
118
118
|
]);
|
|
119
|
-
const defaults =
|
|
119
|
+
const defaults = defaultRows
|
|
120
120
|
.map((row) => defaultParameter_narrow(row))
|
|
121
121
|
.filter((row) => row !== null);
|
|
122
122
|
const defaultsByPiping = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/pipelines/manifest.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/pipelines/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file The PACS VFS folder grammar, both directions.
|
|
3
|
+
*
|
|
4
|
+
* Query folders are named `<desc>_qid:<id>[_<user>][_no-hits]`, study
|
|
5
|
+
* folders `Study_<uid>_<desc>`, series folders `Series_<uid>_<desc>`. This
|
|
6
|
+
* module owns building those names and parsing them back, so a path a
|
|
7
|
+
* surface builds is always the path the listing shows.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately dependency-free: test mocks forward these functions directly
|
|
10
|
+
* (via the package's `./pacs-grammar` subpath export) instead of maintaining
|
|
11
|
+
* copies, so nothing here may import anything.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Extracts the numeric query id from a query folder name or any path
|
|
17
|
+
* containing one.
|
|
18
|
+
*
|
|
19
|
+
* @param folder - Folder name or full path carrying a `_qid:<id>` marker.
|
|
20
|
+
* @returns The query id, or NaN when no marker is present.
|
|
21
|
+
*/
|
|
22
|
+
export declare function queryId_extractFromFolder(folder: string): number;
|
|
23
|
+
/**
|
|
24
|
+
* Extracts the descriptive label of a query folder, the part before its
|
|
25
|
+
* `_qid:` marker (the id, user, and no-hits suffixes are all dropped).
|
|
26
|
+
*
|
|
27
|
+
* @param folder - Query folder name (`<desc>_qid:<id>[_<user>][_no-hits]`).
|
|
28
|
+
* @returns The label, or the folder unchanged when it carries no marker.
|
|
29
|
+
*/
|
|
30
|
+
export declare function queryLabel_extractFromFolder(folder: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Extracts the UID portion of a study or series folder name
|
|
33
|
+
* (`<prefix>_<uid>_<label>`).
|
|
34
|
+
*
|
|
35
|
+
* @param folder - The folder name.
|
|
36
|
+
* @param prefix - The expected prefix, `Study` or `Series`.
|
|
37
|
+
* @returns The UID between the prefix and the first following underscore.
|
|
38
|
+
*/
|
|
39
|
+
export declare function folderUID_get(folder: string, prefix: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Everything that determines a query folder's name.
|
|
42
|
+
*
|
|
43
|
+
* @property queryId - The query's numeric id.
|
|
44
|
+
* @property queryObj - The query's key-value search terms; blank values are
|
|
45
|
+
* skipped.
|
|
46
|
+
* @property title - The query record's title, used as the description when
|
|
47
|
+
* queryObj yields nothing.
|
|
48
|
+
* @property username - Owning username, appended as `_<user>` when present.
|
|
49
|
+
* @property hasResult - Whether the query holds a result payload; false
|
|
50
|
+
* appends the `_no-hits` suffix. Defaults to true.
|
|
51
|
+
*/
|
|
52
|
+
export interface QueryFolderNameParts {
|
|
53
|
+
queryId: number | string;
|
|
54
|
+
queryObj: Record<string, unknown>;
|
|
55
|
+
title?: string;
|
|
56
|
+
username?: string;
|
|
57
|
+
hasResult?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Builds a query folder name: `<desc>_qid:<id>[_<user>][_no-hits]`.
|
|
61
|
+
*
|
|
62
|
+
* This is the single naming authority: the listing provider and any surface
|
|
63
|
+
* that pre-computes a query's path must both use it, otherwise a freshly
|
|
64
|
+
* created query can be addressed by a name `ls` will never show.
|
|
65
|
+
*
|
|
66
|
+
* @param parts - The name's inputs. See QueryFolderNameParts.
|
|
67
|
+
* @returns The folder name (no leading path).
|
|
68
|
+
*/
|
|
69
|
+
export declare function queryFolderName_build(parts: QueryFolderNameParts): string;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file The PACS VFS folder grammar, both directions.
|
|
4
|
+
*
|
|
5
|
+
* Query folders are named `<desc>_qid:<id>[_<user>][_no-hits]`, study
|
|
6
|
+
* folders `Study_<uid>_<desc>`, series folders `Series_<uid>_<desc>`. This
|
|
7
|
+
* module owns building those names and parsing them back, so a path a
|
|
8
|
+
* surface builds is always the path the listing shows.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately dependency-free: test mocks forward these functions directly
|
|
11
|
+
* (via the package's `./pacs-grammar` subpath export) instead of maintaining
|
|
12
|
+
* copies, so nothing here may import anything.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.queryId_extractFromFolder = queryId_extractFromFolder;
|
|
18
|
+
exports.queryLabel_extractFromFolder = queryLabel_extractFromFolder;
|
|
19
|
+
exports.folderUID_get = folderUID_get;
|
|
20
|
+
exports.queryFolderName_build = queryFolderName_build;
|
|
21
|
+
/**
|
|
22
|
+
* Extracts the numeric query id from a query folder name or any path
|
|
23
|
+
* containing one.
|
|
24
|
+
*
|
|
25
|
+
* @param folder - Folder name or full path carrying a `_qid:<id>` marker.
|
|
26
|
+
* @returns The query id, or NaN when no marker is present.
|
|
27
|
+
*/
|
|
28
|
+
function queryId_extractFromFolder(folder) {
|
|
29
|
+
const match = /_qid:(\d+)/.exec(folder);
|
|
30
|
+
return match ? Number(match[1]) : NaN;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Extracts the descriptive label of a query folder, the part before its
|
|
34
|
+
* `_qid:` marker (the id, user, and no-hits suffixes are all dropped).
|
|
35
|
+
*
|
|
36
|
+
* @param folder - Query folder name (`<desc>_qid:<id>[_<user>][_no-hits]`).
|
|
37
|
+
* @returns The label, or the folder unchanged when it carries no marker.
|
|
38
|
+
*/
|
|
39
|
+
function queryLabel_extractFromFolder(folder) {
|
|
40
|
+
return folder.replace(/_qid:\d+.*$/, "");
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Extracts the UID portion of a study or series folder name
|
|
44
|
+
* (`<prefix>_<uid>_<label>`).
|
|
45
|
+
*
|
|
46
|
+
* @param folder - The folder name.
|
|
47
|
+
* @param prefix - The expected prefix, `Study` or `Series`.
|
|
48
|
+
* @returns The UID between the prefix and the first following underscore.
|
|
49
|
+
*/
|
|
50
|
+
function folderUID_get(folder, prefix) {
|
|
51
|
+
const withoutPrefix = folder.replace(new RegExp(`^${prefix}_`), "");
|
|
52
|
+
return withoutPrefix.split("_")[0];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Builds a query folder name: `<desc>_qid:<id>[_<user>][_no-hits]`.
|
|
56
|
+
*
|
|
57
|
+
* This is the single naming authority: the listing provider and any surface
|
|
58
|
+
* that pre-computes a query's path must both use it, otherwise a freshly
|
|
59
|
+
* created query can be addressed by a name `ls` will never show.
|
|
60
|
+
*
|
|
61
|
+
* @param parts - The name's inputs. See QueryFolderNameParts.
|
|
62
|
+
* @returns The folder name (no leading path).
|
|
63
|
+
*/
|
|
64
|
+
function queryFolderName_build(parts) {
|
|
65
|
+
const segments = [];
|
|
66
|
+
for (const [k, v] of Object.entries(parts.queryObj)) {
|
|
67
|
+
if (v !== undefined && v !== null && String(v).trim().length > 0)
|
|
68
|
+
segments.push(`${k}:${v}`);
|
|
69
|
+
}
|
|
70
|
+
let desc = segments.join("_");
|
|
71
|
+
if (!desc) {
|
|
72
|
+
const title = parts.title ?? "";
|
|
73
|
+
desc = title
|
|
74
|
+
? title.replace(/^pacs_query_\d+_\d+$/, "query").replace(/^pacs_query_/, "")
|
|
75
|
+
: "query";
|
|
76
|
+
if (!desc)
|
|
77
|
+
desc = "query";
|
|
78
|
+
}
|
|
79
|
+
const userSuffix = parts.username ? `_${parts.username}` : "";
|
|
80
|
+
const noHitsSuffix = parts.hasResult === false ? "_no-hits" : "";
|
|
81
|
+
return `${desc}_qid:${parts.queryId}${userSuffix}${noHitsSuffix}`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=pacsGrammar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pacsGrammar.js","sourceRoot":"","sources":["../../../src/vfs/providers/pacsGrammar.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AASH,8DAGC;AASD,oEAEC;AAUD,sCAGC;AAgCD,sDAgBC;AAlFD;;;;;;GAMG;AACH,SAAgB,yBAAyB,CAAC,MAAc;IACtD,MAAM,KAAK,GAA2B,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,4BAA4B,CAAC,MAAc;IACzD,OAAO,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,aAAa,CAAC,MAAc,EAAE,MAAc;IAC1D,MAAM,aAAa,GAAW,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAsBD;;;;;;;;;GASG;AACH,SAAgB,qBAAqB,CAAC,KAA2B;IAC/D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,IAAI,GAAW,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,GAAW,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,IAAI,GAAG,KAAK;YACV,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;YAC5E,CAAC,CAAC,OAAO,CAAC;QACZ,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,CAAC;IACD,MAAM,UAAU,GAAW,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,YAAY,GAAW,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,OAAO,GAAG,IAAI,QAAQ,KAAK,CAAC,OAAO,GAAG,UAAU,GAAG,YAAY,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -14,55 +14,23 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { Result } from "@fnndsc/cumin";
|
|
16
16
|
export { tag_extractValue, studies_extractFromDecoded, series_extractFromStudy, study_findByUID, series_findByUID, } from "@fnndsc/cumin";
|
|
17
|
-
export declare function path_normalize(pathStr: string): string;
|
|
18
|
-
export declare function queryId_extractFromFolder(folder: string): number;
|
|
19
17
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* Normalizes a VFS path: guarantees a leading slash and strips one trailing
|
|
19
|
+
* slash (the root path keeps its single slash).
|
|
22
20
|
*
|
|
23
|
-
* @param
|
|
24
|
-
* @returns The
|
|
21
|
+
* @param pathStr - Raw path string.
|
|
22
|
+
* @returns The normalized absolute path.
|
|
25
23
|
*/
|
|
26
|
-
export declare function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
* (`<prefix>_<uid>_<label>`).
|
|
30
|
-
*
|
|
31
|
-
* @param folder - The folder name.
|
|
32
|
-
* @param prefix - The expected prefix, `Study` or `Series`.
|
|
33
|
-
* @returns The UID between the prefix and the first following underscore.
|
|
34
|
-
*/
|
|
35
|
-
export declare function folderUID_get(folder: string, prefix: string): string;
|
|
36
|
-
/**
|
|
37
|
-
* Everything that determines a query folder's name.
|
|
38
|
-
*
|
|
39
|
-
* @property queryId - The query's numeric id.
|
|
40
|
-
* @property queryObj - The query's key-value search terms; blank values are
|
|
41
|
-
* skipped.
|
|
42
|
-
* @property title - The query record's title, used as the description when
|
|
43
|
-
* queryObj yields nothing.
|
|
44
|
-
* @property username - Owning username, appended as `_<user>` when present.
|
|
45
|
-
* @property hasResult - Whether the query holds a result payload; false
|
|
46
|
-
* appends the `_no-hits` suffix. Defaults to true.
|
|
47
|
-
*/
|
|
48
|
-
export interface QueryFolderNameParts {
|
|
49
|
-
queryId: number | string;
|
|
50
|
-
queryObj: Record<string, unknown>;
|
|
51
|
-
title?: string;
|
|
52
|
-
username?: string;
|
|
53
|
-
hasResult?: boolean;
|
|
54
|
-
}
|
|
24
|
+
export declare function path_normalize(pathStr: string): string;
|
|
25
|
+
export { queryId_extractFromFolder, queryLabel_extractFromFolder, folderUID_get, queryFolderName_build, } from "./pacsGrammar.js";
|
|
26
|
+
export type { QueryFolderNameParts } from "./pacsGrammar.js";
|
|
55
27
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* This is the single naming authority: the listing provider and any surface
|
|
59
|
-
* that pre-computes a query's path must both use it, otherwise a freshly
|
|
60
|
-
* created query can be addressed by a name `ls` will never show.
|
|
28
|
+
* Parses a `cp` source path into its study, optional series, and query id.
|
|
61
29
|
*
|
|
62
|
-
* @param
|
|
63
|
-
* @returns The
|
|
30
|
+
* @param src - Source path naming a Study or Series directory under a query.
|
|
31
|
+
* @returns The parsed identifiers, or Err with a rendered reason on the
|
|
32
|
+
* error stack when the path is not a copyable PACS location.
|
|
64
33
|
*/
|
|
65
|
-
export declare function queryFolderName_build(parts: QueryFolderNameParts): string;
|
|
66
34
|
export declare function cpSrc_parse(src: string): Result<{
|
|
67
35
|
studyUID: string;
|
|
68
36
|
seriesUID?: string;
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.series_findByUID = exports.study_findByUID = exports.series_extractFromStudy = exports.studies_extractFromDecoded = exports.tag_extractValue = void 0;
|
|
3
|
+
exports.queryFolderName_build = exports.folderUID_get = exports.queryLabel_extractFromFolder = exports.queryId_extractFromFolder = exports.series_findByUID = exports.study_findByUID = exports.series_extractFromStudy = exports.studies_extractFromDecoded = exports.tag_extractValue = void 0;
|
|
4
4
|
exports.path_normalize = path_normalize;
|
|
5
|
-
exports.queryId_extractFromFolder = queryId_extractFromFolder;
|
|
6
|
-
exports.queryLabel_extractFromFolder = queryLabel_extractFromFolder;
|
|
7
|
-
exports.folderUID_get = folderUID_get;
|
|
8
|
-
exports.queryFolderName_build = queryFolderName_build;
|
|
9
5
|
exports.cpSrc_parse = cpSrc_parse;
|
|
10
6
|
/**
|
|
11
7
|
* @file Pure helpers for the PACS VFS provider.
|
|
@@ -22,73 +18,38 @@ exports.cpSrc_parse = cpSrc_parse;
|
|
|
22
18
|
* @module
|
|
23
19
|
*/
|
|
24
20
|
const cumin_1 = require("@fnndsc/cumin");
|
|
21
|
+
const pacsGrammar_js_1 = require("./pacsGrammar.js");
|
|
25
22
|
var cumin_2 = require("@fnndsc/cumin");
|
|
26
23
|
Object.defineProperty(exports, "tag_extractValue", { enumerable: true, get: function () { return cumin_2.tag_extractValue; } });
|
|
27
24
|
Object.defineProperty(exports, "studies_extractFromDecoded", { enumerable: true, get: function () { return cumin_2.studies_extractFromDecoded; } });
|
|
28
25
|
Object.defineProperty(exports, "series_extractFromStudy", { enumerable: true, get: function () { return cumin_2.series_extractFromStudy; } });
|
|
29
26
|
Object.defineProperty(exports, "study_findByUID", { enumerable: true, get: function () { return cumin_2.study_findByUID; } });
|
|
30
27
|
Object.defineProperty(exports, "series_findByUID", { enumerable: true, get: function () { return cumin_2.series_findByUID; } });
|
|
28
|
+
/**
|
|
29
|
+
* Normalizes a VFS path: guarantees a leading slash and strips one trailing
|
|
30
|
+
* slash (the root path keeps its single slash).
|
|
31
|
+
*
|
|
32
|
+
* @param pathStr - Raw path string.
|
|
33
|
+
* @returns The normalized absolute path.
|
|
34
|
+
*/
|
|
31
35
|
function path_normalize(pathStr) {
|
|
32
36
|
let p = pathStr.startsWith("/") ? pathStr : "/" + pathStr;
|
|
33
37
|
if (p.length > 1 && p.endsWith("/"))
|
|
34
38
|
p = p.slice(0, -1);
|
|
35
39
|
return p;
|
|
36
40
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
* Extracts the descriptive label of a query folder, the part before its
|
|
43
|
-
* `_qid:` marker (the id, user, and no-hits suffixes are all dropped).
|
|
44
|
-
*
|
|
45
|
-
* @param folder - Query folder name (`<desc>_qid:<id>[_<user>][_no-hits]`).
|
|
46
|
-
* @returns The label, or the folder unchanged when it carries no marker.
|
|
47
|
-
*/
|
|
48
|
-
function queryLabel_extractFromFolder(folder) {
|
|
49
|
-
return folder.replace(/_qid:\d+.*$/, "");
|
|
50
|
-
}
|
|
41
|
+
var pacsGrammar_js_2 = require("./pacsGrammar.js");
|
|
42
|
+
Object.defineProperty(exports, "queryId_extractFromFolder", { enumerable: true, get: function () { return pacsGrammar_js_2.queryId_extractFromFolder; } });
|
|
43
|
+
Object.defineProperty(exports, "queryLabel_extractFromFolder", { enumerable: true, get: function () { return pacsGrammar_js_2.queryLabel_extractFromFolder; } });
|
|
44
|
+
Object.defineProperty(exports, "folderUID_get", { enumerable: true, get: function () { return pacsGrammar_js_2.folderUID_get; } });
|
|
45
|
+
Object.defineProperty(exports, "queryFolderName_build", { enumerable: true, get: function () { return pacsGrammar_js_2.queryFolderName_build; } });
|
|
51
46
|
/**
|
|
52
|
-
*
|
|
53
|
-
* (`<prefix>_<uid>_<label>`).
|
|
47
|
+
* Parses a `cp` source path into its study, optional series, and query id.
|
|
54
48
|
*
|
|
55
|
-
* @param
|
|
56
|
-
* @
|
|
57
|
-
*
|
|
49
|
+
* @param src - Source path naming a Study or Series directory under a query.
|
|
50
|
+
* @returns The parsed identifiers, or Err with a rendered reason on the
|
|
51
|
+
* error stack when the path is not a copyable PACS location.
|
|
58
52
|
*/
|
|
59
|
-
function folderUID_get(folder, prefix) {
|
|
60
|
-
const withoutPrefix = folder.replace(new RegExp(`^${prefix}_`), "");
|
|
61
|
-
return withoutPrefix.split("_")[0];
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Builds a query folder name: `<desc>_qid:<id>[_<user>][_no-hits]`.
|
|
65
|
-
*
|
|
66
|
-
* This is the single naming authority: the listing provider and any surface
|
|
67
|
-
* that pre-computes a query's path must both use it, otherwise a freshly
|
|
68
|
-
* created query can be addressed by a name `ls` will never show.
|
|
69
|
-
*
|
|
70
|
-
* @param parts - The name's inputs. See QueryFolderNameParts.
|
|
71
|
-
* @returns The folder name (no leading path).
|
|
72
|
-
*/
|
|
73
|
-
function queryFolderName_build(parts) {
|
|
74
|
-
const segments = [];
|
|
75
|
-
for (const [k, v] of Object.entries(parts.queryObj)) {
|
|
76
|
-
if (v !== undefined && v !== null && String(v).trim().length > 0)
|
|
77
|
-
segments.push(`${k}:${v}`);
|
|
78
|
-
}
|
|
79
|
-
let desc = segments.join("_");
|
|
80
|
-
if (!desc) {
|
|
81
|
-
const title = parts.title ?? "";
|
|
82
|
-
desc = title
|
|
83
|
-
? title.replace(/^pacs_query_\d+_\d+$/, "query").replace(/^pacs_query_/, "")
|
|
84
|
-
: "query";
|
|
85
|
-
if (!desc)
|
|
86
|
-
desc = "query";
|
|
87
|
-
}
|
|
88
|
-
const userSuffix = parts.username ? `_${parts.username}` : "";
|
|
89
|
-
const noHitsSuffix = parts.hasResult === false ? "_no-hits" : "";
|
|
90
|
-
return `${desc}_qid:${parts.queryId}${userSuffix}${noHitsSuffix}`;
|
|
91
|
-
}
|
|
92
53
|
function cpSrc_parse(src) {
|
|
93
54
|
const absolutePath = src.startsWith("/") ? src : "/" + src;
|
|
94
55
|
const parts = absolutePath.split("/").filter(Boolean);
|
|
@@ -105,12 +66,12 @@ function cpSrc_parse(src) {
|
|
|
105
66
|
cumin_1.errorStack.stack_push("error", `cp: Invalid PACS Study folder format: '${studyFolder}'`);
|
|
106
67
|
return (0, cumin_1.Err)();
|
|
107
68
|
}
|
|
108
|
-
const studyUID = folderUID_get(studyFolder, "Study");
|
|
69
|
+
const studyUID = (0, pacsGrammar_js_1.folderUID_get)(studyFolder, "Study");
|
|
109
70
|
let seriesUID;
|
|
110
71
|
if (parts.length >= queryIdx + 3 && parts[queryIdx + 2].startsWith("Series_")) {
|
|
111
|
-
seriesUID = folderUID_get(parts[queryIdx + 2], "Series");
|
|
72
|
+
seriesUID = (0, pacsGrammar_js_1.folderUID_get)(parts[queryIdx + 2], "Series");
|
|
112
73
|
}
|
|
113
|
-
const queryId = queryId_extractFromFolder(parts[queryIdx]);
|
|
74
|
+
const queryId = (0, pacsGrammar_js_1.queryId_extractFromFolder)(parts[queryIdx]);
|
|
114
75
|
if (Number.isNaN(queryId)) {
|
|
115
76
|
cumin_1.errorStack.stack_push("error", `cp: Invalid query ID in path '${src}'`);
|
|
116
77
|
return (0, cumin_1.Err)();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pacsHelpers.js","sourceRoot":"","sources":["../../../src/vfs/providers/pacsHelpers.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"pacsHelpers.js","sourceRoot":"","sources":["../../../src/vfs/providers/pacsHelpers.ts"],"names":[],"mappings":";;;AAgCA,wCAIC;AAiBD,kCAiCC;AAtFD;;;;;;;;;;;;;GAaG;AACH,yCAA4D;AAC5D,qDAA4E;AAE5E,uCAMuB;AALrB,yGAAA,gBAAgB,OAAA;AAChB,mHAAA,0BAA0B,OAAA;AAC1B,gHAAA,uBAAuB,OAAA;AACvB,wGAAA,eAAe,OAAA;AACf,yGAAA,gBAAgB,OAAA;AAGlB;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC,GAAW,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC;IAClE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mDAK0B;AAJxB,2HAAA,yBAAyB,OAAA;AACzB,8HAAA,4BAA4B,OAAA;AAC5B,+GAAA,aAAa,OAAA;AACb,uHAAA,qBAAqB,OAAA;AAIvB;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,MAAM,YAAY,GAAW,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;IACnE,MAAM,KAAK,GAAa,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhE,yEAAyE;IACzE,2EAA2E;IAC3E,0DAA0D;IAC1D,MAAM,QAAQ,GAAW,KAAK,CAAC,SAAS,CAAC,CAAC,IAAY,EAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QACnD,kBAAU,CAAC,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,iEAAiE,CAAC,CAAC;QAC1H,OAAO,IAAA,WAAG,GAAE,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAW,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,kBAAU,CAAC,UAAU,CAAC,OAAO,EAAE,0CAA0C,WAAW,GAAG,CAAC,CAAC;QACzF,OAAO,IAAA,WAAG,GAAE,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAW,IAAA,8BAAa,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE7D,IAAI,SAA6B,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9E,SAAS,GAAG,IAAA,8BAAa,EAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,OAAO,GAAW,IAAA,0CAAyB,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,kBAAU,CAAC,UAAU,CAAC,OAAO,EAAE,iCAAiC,GAAG,GAAG,CAAC,CAAC;QACxE,OAAO,IAAA,WAAG,GAAE,CAAC;IACf,CAAC;IAED,OAAO,IAAA,UAAE,EAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fnndsc/salsa",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"description": "Shared Application Logic and Service Assets for ChRIS",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
"types": "./dist/index.d.ts",
|
|
30
30
|
"require": "./dist/index.js"
|
|
31
31
|
},
|
|
32
|
+
"./pacs-grammar": {
|
|
33
|
+
"import": "./dist/vfs/providers/pacsGrammar.js",
|
|
34
|
+
"types": "./dist/vfs/providers/pacsGrammar.d.ts",
|
|
35
|
+
"require": "./dist/vfs/providers/pacsGrammar.js"
|
|
36
|
+
},
|
|
32
37
|
"./package.json": "./package.json"
|
|
33
38
|
},
|
|
34
39
|
"scripts": {
|
|
@@ -54,7 +59,7 @@
|
|
|
54
59
|
"inflight": "npm:@aashutoshrathi/word-wrap@^1.2.6"
|
|
55
60
|
},
|
|
56
61
|
"dependencies": {
|
|
57
|
-
"@fnndsc/cumin": "^3.
|
|
62
|
+
"@fnndsc/cumin": "^3.14.0",
|
|
58
63
|
"axios": "^1.6.8",
|
|
59
64
|
"ws": "^8.21.0"
|
|
60
65
|
}
|