@fnndsc/brasa 0.19.0 → 0.21.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.
@@ -94,6 +94,12 @@ const STACK = [
94
94
  { pkg: 'cumin', name: 'Cumin Underpins Management Infrastructure Needs', role: 'layer' },
95
95
  { pkg: 'calypso', name: 'CALYPSO Accepts Language, Yielding Permitted Shell Operations', role: 'sessionHost' },
96
96
  ];
97
+ /**
98
+ * The web surface. It is not in {@link STACK}: argus is an app served from a
99
+ * checkout, not a package the others depend on, so its version is known only
100
+ * to the daemon that found its bundle and is passed in when the banner asks.
101
+ */
102
+ const ARGUS = { pkg: 'argus', name: 'ARGUS Renders Graphical User Surfaces', role: 'surface' };
97
103
  /**
98
104
  * Resolves the running version of a descriptor's package. brasa reads its own
99
105
  * package.json directly (this module lives in it); every other package resolves
@@ -154,10 +160,76 @@ export function versionReport_build() {
154
160
  * @param version - The package version to display.
155
161
  * @param build - The short build hash to display.
156
162
  * @returns A line of the form `ChELL Executes Layered Logic, v 5.3.0 (886f09). Welcome.`
163
+ * for a surface; a session host's line ends at the build, with no welcome.
157
164
  */
158
165
  export function welcomeLine_compose(pkg, version, build) {
159
166
  const descriptor = STACK.find((d) => d.pkg === pkg) ?? STACK[0];
160
- return `${descriptor.name}, v ${version} (${build}). Welcome.`;
167
+ // The welcome belongs to a surface, where it marks the end of boot and the
168
+ // start of the operator's session. A session host has nobody to welcome
169
+ // yet: its boot ends with the readout's own last row.
170
+ const welcome = descriptor.role === 'surface' ? ' Welcome.' : '';
171
+ return `${descriptor.name}, v ${version} (${build}).${welcome}`;
172
+ }
173
+ /**
174
+ * Builds the stack banner a daemon prints under its own line: every package
175
+ * written out in full, backronym and version aligned, the web surface last
176
+ * when the daemon found one to serve.
177
+ *
178
+ * @param argusVersion - The served argus bundle's version, or null when the
179
+ * daemon serves no web surface.
180
+ * @returns One `name version` line per package.
181
+ */
182
+ export function stackBanner_build(argusVersion) {
183
+ return stackBanner_compose(versions_get(), argusVersion);
184
+ }
185
+ /**
186
+ * Composes the stack banner from explicit versions, so a surface attached to
187
+ * a daemon writes out the daemon's stack rather than its own install's.
188
+ *
189
+ * @param versions - Versions keyed by short package name; a package with no
190
+ * version (an older daemon that did not report it) gets no row.
191
+ * @param argusVersion - The served web surface's version, or null for no row.
192
+ * @returns One `name version` line per package known, in stack order.
193
+ */
194
+ export function stackBanner_compose(versions, argusVersion = null) {
195
+ return stackBanner_rows(versions, argusVersion).map((row) => `${row.name.padEnd(row.nameWidth)} ${row.version}`);
196
+ }
197
+ /**
198
+ * The stack banner as rows, for a host that paints each part in its own
199
+ * colour: the package's name is the first word of its backronym, the rest
200
+ * of the phrase follows, and the version stands in one column.
201
+ *
202
+ * @param versions - Versions keyed by short package name; a package with no
203
+ * version gets no row.
204
+ * @param argusVersion - The served web surface's version, or null for no row.
205
+ * @returns One row per package known, in stack order, each carrying the
206
+ * shared name width.
207
+ */
208
+ export function stackBanner_rows(versions, argusVersion = null) {
209
+ const byPkg = Object.fromEntries(Object.entries(versions));
210
+ const rows = [
211
+ ...STACK.flatMap((descriptor) => {
212
+ const version = byPkg[descriptor.pkg];
213
+ return version === undefined ? [] : [{ ...descriptor, version }];
214
+ }),
215
+ ...(argusVersion !== null ? [{ ...ARGUS, version: argusVersion }] : []),
216
+ ];
217
+ const nameWidth = Math.max(0, ...rows.map((row) => row.name.length));
218
+ return rows.map((row) => ({ ...row, nameWidth }));
219
+ }
220
+ /**
221
+ * Paints one banner row: the package's own name bright, the rest of its
222
+ * backronym plain, the version dim in its column.
223
+ *
224
+ * @param row - The row to paint.
225
+ * @param paint - The three colours, applied to name, phrase, and version.
226
+ * @returns The painted line, aligned as the plain banner is.
227
+ */
228
+ export function stackBannerRow_paint(row, paint) {
229
+ const [first, ...rest] = row.name.split(' ');
230
+ const phrase = rest.length > 0 ? ` ${rest.join(' ')}` : '';
231
+ const padding = ' '.repeat(row.nameWidth - row.name.length);
232
+ return `${paint.name(first)}${paint.phrase(phrase)}${padding} ${paint.version(row.version)}`;
161
233
  }
162
234
  /**
163
235
  * Builds the startup welcome line for a locally resolved package: its backronym
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -29,6 +29,7 @@ export * from './lib/vfs/vfs.js';
29
29
  export * from './lib/spinner.js';
30
30
  export * from './logo/brain.js';
31
31
  export * from './lib/prefetch.js';
32
+ export * from './lib/count.js';
32
33
  export * from './lib/parser.js';
33
34
  export * from './lib/pipe.js';
34
35
  export * from './lib/semicolonParser.js';
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ export * from './lib/vfs/vfs.js';
30
30
  export * from './lib/spinner.js';
31
31
  export * from './logo/brain.js';
32
32
  export * from './lib/prefetch.js';
33
+ export * from './lib/count.js';
33
34
  export * from './lib/parser.js';
34
35
  export * from './lib/pipe.js';
35
36
  export * from './lib/semicolonParser.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,kBAAkB,CAAC;AACjC,iEAAiE;AACjE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAkB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,kBAAkB,CAAC;AACjC,iEAAiE;AACjE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAkB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @file A count with its noun, in the number the count calls for.
3
+ *
4
+ * A readout knows how many things it has before it prints them, so it
5
+ * never has to hedge with `feed(s)` or `quer(y/ies)`: one thing takes the
6
+ * singular, any other number the plural.
7
+ *
8
+ * Kept free of imports so any layer can use it.
9
+ *
10
+ * @module
11
+ */
12
+ /**
13
+ * Renders a count followed by its noun in the right number.
14
+ *
15
+ * @param count - How many there are.
16
+ * @param singular - The noun for exactly one.
17
+ * @param plural - The noun for any other count; defaults to `singular` + `s`.
18
+ * @returns `1 feed`, `3 feeds`, `0 queries`.
19
+ */
20
+ export declare function count_noun(count: number, singular: string, plural?: string): string;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @file A count with its noun, in the number the count calls for.
3
+ *
4
+ * A readout knows how many things it has before it prints them, so it
5
+ * never has to hedge with `feed(s)` or `quer(y/ies)`: one thing takes the
6
+ * singular, any other number the plural.
7
+ *
8
+ * Kept free of imports so any layer can use it.
9
+ *
10
+ * @module
11
+ */
12
+ /**
13
+ * Renders a count followed by its noun in the right number.
14
+ *
15
+ * @param count - How many there are.
16
+ * @param singular - The noun for exactly one.
17
+ * @param plural - The noun for any other count; defaults to `singular` + `s`.
18
+ * @returns `1 feed`, `3 feeds`, `0 queries`.
19
+ */
20
+ export function count_noun(count, singular, plural = `${singular}s`) {
21
+ return `${count} ${count === 1 ? singular : plural}`;
22
+ }
23
+ //# sourceMappingURL=count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count.js","sourceRoot":"","sources":["../../src/lib/count.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE,SAAiB,GAAG,QAAQ,GAAG;IACzF,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACvD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnndsc/brasa",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "description": "BRASA Runs Abstracted Shell Actions - the hostable ChRIS shell engine (kernel)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -44,14 +44,14 @@
44
44
  "license": "MIT",
45
45
  "dependencies": {
46
46
  "@fnndsc/chili": "^3.6.6",
47
- "@fnndsc/cumin": "^3.20.0",
48
- "@fnndsc/salsa": "^3.14.0",
47
+ "@fnndsc/cumin": "^3.21.1",
48
+ "@fnndsc/salsa": "^3.16.0",
49
49
  "chalk": "^4.1.2",
50
50
  "cli-highlight": "^2.1.11",
51
51
  "js-yaml": "^4.1.0",
52
52
  "minimatch": "^10.1.1",
53
53
  "ws": "^8.21.0",
54
- "@fnndsc/menu": "^0.6.0"
54
+ "@fnndsc/menu": "^0.8.0"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/jest": "^30.0.0",