@ifc-lite/flow-nodes 0.2.0 → 0.5.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.
Files changed (107) hide show
  1. package/README.md +1 -0
  2. package/dist/apply-table-node.d.ts.map +1 -1
  3. package/dist/apply-table-node.js +7 -6
  4. package/dist/apply-table-node.js.map +1 -1
  5. package/dist/aps-client.d.ts +55 -0
  6. package/dist/aps-client.d.ts.map +1 -0
  7. package/dist/aps-client.js +194 -0
  8. package/dist/aps-client.js.map +1 -0
  9. package/dist/aps-nodes.d.ts +3 -0
  10. package/dist/aps-nodes.d.ts.map +1 -0
  11. package/dist/aps-nodes.js +192 -0
  12. package/dist/aps-nodes.js.map +1 -0
  13. package/dist/aps-table.d.ts +24 -0
  14. package/dist/aps-table.d.ts.map +1 -0
  15. package/dist/aps-table.js +123 -0
  16. package/dist/aps-table.js.map +1 -0
  17. package/dist/base64.d.ts +8 -0
  18. package/dist/base64.d.ts.map +1 -0
  19. package/dist/base64.js +59 -0
  20. package/dist/base64.js.map +1 -0
  21. package/dist/bcf-client.d.ts +36 -0
  22. package/dist/bcf-client.d.ts.map +1 -0
  23. package/dist/bcf-client.js +108 -0
  24. package/dist/bcf-client.js.map +1 -0
  25. package/dist/bcf-nodes.d.ts +3 -0
  26. package/dist/bcf-nodes.d.ts.map +1 -0
  27. package/dist/bcf-nodes.js +181 -0
  28. package/dist/bcf-nodes.js.map +1 -0
  29. package/dist/csv-nodes.d.ts.map +1 -1
  30. package/dist/csv-nodes.js +3 -4
  31. package/dist/csv-nodes.js.map +1 -1
  32. package/dist/documents-fetch.d.ts +23 -0
  33. package/dist/documents-fetch.d.ts.map +1 -0
  34. package/dist/documents-fetch.js +48 -0
  35. package/dist/documents-fetch.js.map +1 -0
  36. package/dist/documents-nodes.d.ts +5 -0
  37. package/dist/documents-nodes.d.ts.map +1 -0
  38. package/dist/documents-nodes.js +167 -0
  39. package/dist/documents-nodes.js.map +1 -0
  40. package/dist/host.d.ts +28 -0
  41. package/dist/host.d.ts.map +1 -1
  42. package/dist/host.js.map +1 -1
  43. package/dist/http-request-node.d.ts +9 -0
  44. package/dist/http-request-node.d.ts.map +1 -0
  45. package/dist/http-request-node.js +109 -0
  46. package/dist/http-request-node.js.map +1 -0
  47. package/dist/index.d.ts +20 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +34 -5
  50. package/dist/index.js.map +1 -1
  51. package/dist/model-nodes.d.ts.map +1 -1
  52. package/dist/model-nodes.js +11 -6
  53. package/dist/model-nodes.js.map +1 -1
  54. package/dist/open-model-node.d.ts +3 -0
  55. package/dist/open-model-node.d.ts.map +1 -0
  56. package/dist/open-model-node.js +47 -0
  57. package/dist/open-model-node.js.map +1 -0
  58. package/dist/script-node.d.ts.map +1 -1
  59. package/dist/script-node.js +55 -21
  60. package/dist/script-node.js.map +1 -1
  61. package/dist/secrets.d.ts +88 -0
  62. package/dist/secrets.d.ts.map +1 -0
  63. package/dist/secrets.js +202 -0
  64. package/dist/secrets.js.map +1 -0
  65. package/dist/speckle/client.d.ts +52 -0
  66. package/dist/speckle/client.d.ts.map +1 -0
  67. package/dist/speckle/client.js +153 -0
  68. package/dist/speckle/client.js.map +1 -0
  69. package/dist/speckle/geometry.d.ts +37 -0
  70. package/dist/speckle/geometry.d.ts.map +1 -0
  71. package/dist/speckle/geometry.js +126 -0
  72. package/dist/speckle/geometry.js.map +1 -0
  73. package/dist/speckle/mapping.d.ts +62 -0
  74. package/dist/speckle/mapping.d.ts.map +1 -0
  75. package/dist/speckle/mapping.js +208 -0
  76. package/dist/speckle/mapping.js.map +1 -0
  77. package/dist/speckle/parameters.d.ts +49 -0
  78. package/dist/speckle/parameters.d.ts.map +1 -0
  79. package/dist/speckle/parameters.js +95 -0
  80. package/dist/speckle/parameters.js.map +1 -0
  81. package/dist/speckle/refusals.d.ts +45 -0
  82. package/dist/speckle/refusals.d.ts.map +1 -0
  83. package/dist/speckle/refusals.js +40 -0
  84. package/dist/speckle/refusals.js.map +1 -0
  85. package/dist/speckle/units.d.ts +13 -0
  86. package/dist/speckle/units.d.ts.map +1 -0
  87. package/dist/speckle/units.js +59 -0
  88. package/dist/speckle/units.js.map +1 -0
  89. package/dist/speckle/url.d.ts +35 -0
  90. package/dist/speckle/url.d.ts.map +1 -0
  91. package/dist/speckle/url.js +48 -0
  92. package/dist/speckle/url.js.map +1 -0
  93. package/dist/speckle-receive-node.d.ts +9 -0
  94. package/dist/speckle-receive-node.d.ts.map +1 -0
  95. package/dist/speckle-receive-node.js +180 -0
  96. package/dist/speckle-receive-node.js.map +1 -0
  97. package/dist/xlsx-io.d.ts.map +1 -1
  98. package/dist/xlsx-io.js +3 -3
  99. package/dist/xlsx-io.js.map +1 -1
  100. package/dist/xlsx-nodes.d.ts.map +1 -1
  101. package/dist/xlsx-nodes.js +1 -40
  102. package/dist/xlsx-nodes.js.map +1 -1
  103. package/package.json +11 -9
  104. package/dist/strict-cell.d.ts +0 -20
  105. package/dist/strict-cell.d.ts.map +0 -1
  106. package/dist/strict-cell.js +0 -33
  107. package/dist/strict-cell.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ const FIXED = ['objectid', 'externalId', 'name', 'category', 'IfcGUID'];
5
+ function isRecord(v) {
6
+ return !!v && typeof v === 'object' && !Array.isArray(v);
7
+ }
8
+ function toCell(v) {
9
+ if (v === null || v === undefined)
10
+ return null;
11
+ if (typeof v === 'string' || typeof v === 'boolean')
12
+ return v;
13
+ if (typeof v === 'number')
14
+ return Number.isFinite(v) ? v : String(v);
15
+ if (Array.isArray(v))
16
+ return v.map((x) => (isRecord(x) || Array.isArray(x) ? JSON.stringify(x) : String(x))).join('; ');
17
+ return JSON.stringify(v);
18
+ }
19
+ /**
20
+ * Flatten a property tree to `path → value` leaves. Iterative (a JSON tree
21
+ * has no cycles, but a deep one must not cost stack), arrays kept as leaves.
22
+ */
23
+ function flatten(properties) {
24
+ const out = new Map();
25
+ const stack = [['', properties]];
26
+ while (stack.length > 0) {
27
+ const [prefix, obj] = stack.pop();
28
+ const groups = [];
29
+ for (const [k, v] of Object.entries(obj)) {
30
+ const path = prefix ? `${prefix}.${k}` : k;
31
+ if (isRecord(v))
32
+ groups.push([path, v]);
33
+ else
34
+ out.set(path, v);
35
+ }
36
+ // Reversed, so groups pop off the stack in response order.
37
+ for (let g = groups.length - 1; g >= 0; g--)
38
+ stack.push(groups[g]);
39
+ }
40
+ return out;
41
+ }
42
+ function findProperty(properties, prop, preferGroup) {
43
+ const groups = Object.entries(properties).filter((e) => isRecord(e[1]));
44
+ if (preferGroup)
45
+ groups.sort(([a], [b]) => Number(b === preferGroup) - Number(a === preferGroup));
46
+ for (const [, group] of groups) {
47
+ const v = group[prop];
48
+ if (v !== undefined && v !== null && v !== '')
49
+ return v;
50
+ }
51
+ return null;
52
+ }
53
+ function inferType(values) {
54
+ const present = values.filter((v) => v !== null);
55
+ if (present.length > 0 && present.every((v) => typeof v === 'number'))
56
+ return 'real';
57
+ if (present.length > 0 && present.every((v) => typeof v === 'boolean'))
58
+ return 'boolean';
59
+ return 'string';
60
+ }
61
+ /** Build the table; `key` must name one of its columns. */
62
+ export function propertiesToTable(collection, key) {
63
+ const fixedRows = [];
64
+ const flatRows = [];
65
+ const propColumns = [];
66
+ const seen = new Set();
67
+ for (const raw of collection) {
68
+ if (!isRecord(raw))
69
+ continue;
70
+ const item = raw;
71
+ const properties = isRecord(item.properties) ? item.properties : {};
72
+ fixedRows.push({
73
+ objectid: typeof item.objectid === 'number' ? item.objectid : null,
74
+ externalId: typeof item.externalId === 'string' && item.externalId.length > 0 ? item.externalId : null,
75
+ name: typeof item.name === 'string' ? item.name : null,
76
+ category: toCell(findProperty(properties, 'Category', '__category__')),
77
+ IfcGUID: toCell(findProperty(properties, 'IfcGUID', 'IFC Parameters')),
78
+ });
79
+ const flat = flatten(properties);
80
+ flatRows.push(flat);
81
+ for (const path of flat.keys()) {
82
+ if (seen.has(path))
83
+ continue;
84
+ seen.add(path);
85
+ propColumns.push(path);
86
+ }
87
+ }
88
+ // A top-level scalar property named like a fixed column would overwrite it.
89
+ const reserved = new Set(FIXED);
90
+ const columnName = new Map(propColumns.map((p) => [p, reserved.has(p) ? `properties.${p}` : p]));
91
+ const rows = fixedRows.map((fixed, i) => {
92
+ const row = { ...fixed };
93
+ for (const path of propColumns)
94
+ row[columnName.get(path)] = toCell(flatRows[i].get(path));
95
+ return row;
96
+ });
97
+ const columns = [
98
+ { name: 'objectid', type: 'integer' },
99
+ { name: 'externalId', type: 'identifier' },
100
+ { name: 'name', type: 'label' },
101
+ { name: 'category', type: 'label' },
102
+ { name: 'IfcGUID', type: 'identifier' },
103
+ ...propColumns.map((p) => {
104
+ const name = columnName.get(p);
105
+ return { name, type: inferType(rows.map((r) => r[name])) };
106
+ }),
107
+ ];
108
+ // Mixed columns were inferred `string`: make their cells agree.
109
+ for (const col of columns) {
110
+ if (col.type !== 'string')
111
+ continue;
112
+ for (const row of rows) {
113
+ const v = row[col.name];
114
+ if (v !== null && typeof v !== 'string')
115
+ row[col.name] = String(v);
116
+ }
117
+ }
118
+ if (!columns.some((c) => c.name === key)) {
119
+ throw new Error(`key column "${key}" is not in the table (columns: ${columns.slice(0, 12).map((c) => c.name).join(', ')}${columns.length > 12 ? ', …' : ''})`);
120
+ }
121
+ return { columns, rows, key };
122
+ }
123
+ //# sourceMappingURL=aps-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aps-table.js","sourceRoot":"","sources":["../src/aps-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Encode into one preallocated ASCII buffer and decode it once. Appending
3
+ * four characters per 3 bytes built hundreds of millions of intermediate
4
+ * strings for a large download (#5935 review).
5
+ */
6
+ export declare function toBase64(bytes: Uint8Array): string;
7
+ export declare function fromBase64(text: string): Uint8Array;
8
+ //# sourceMappingURL=base64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../src/base64.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAelD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAkBnD"}
package/dist/base64.js ADDED
@@ -0,0 +1,59 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Base64 without `Buffer` or `btoa`/`atob`: this package runs in the browser
6
+ * (`viewer-embed`) as well as headlessly, and neither global is guaranteed —
7
+ * `Buffer` needs a bundler polyfill most Vite configs do not add, and `atob`
8
+ * mangles bytes above 0x7F on some hosts' string-vs-binary handling. A tiny
9
+ * table-driven codec sidesteps both.
10
+ */
11
+ const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
12
+ const DECODE = (() => {
13
+ const table = new Int16Array(128).fill(-1);
14
+ for (let i = 0; i < BASE64_CHARS.length; i += 1)
15
+ table[BASE64_CHARS.charCodeAt(i)] = i;
16
+ return table;
17
+ })();
18
+ const PAD = 0x3d; // '='
19
+ /**
20
+ * Encode into one preallocated ASCII buffer and decode it once. Appending
21
+ * four characters per 3 bytes built hundreds of millions of intermediate
22
+ * strings for a large download (#5935 review).
23
+ */
24
+ export function toBase64(bytes) {
25
+ const out = new Uint8Array(Math.ceil(bytes.length / 3) * 4);
26
+ let o = 0;
27
+ for (let i = 0; i < bytes.length; i += 3) {
28
+ const b0 = bytes[i];
29
+ const has1 = i + 1 < bytes.length;
30
+ const has2 = i + 2 < bytes.length;
31
+ const b1 = has1 ? bytes[i + 1] : 0;
32
+ const b2 = has2 ? bytes[i + 2] : 0;
33
+ out[o++] = BASE64_CHARS.charCodeAt(b0 >> 2);
34
+ out[o++] = BASE64_CHARS.charCodeAt(((b0 & 0x03) << 4) | (b1 >> 4));
35
+ out[o++] = has1 ? BASE64_CHARS.charCodeAt(((b1 & 0x0f) << 2) | (b2 >> 6)) : PAD;
36
+ out[o++] = has2 ? BASE64_CHARS.charCodeAt(b2 & 0x3f) : PAD;
37
+ }
38
+ return new TextDecoder('ascii').decode(out);
39
+ }
40
+ export function fromBase64(text) {
41
+ const clean = text.replace(/[^A-Za-z0-9+/=]/g, '');
42
+ const len = clean.endsWith('==') ? clean.length - 2 : clean.endsWith('=') ? clean.length - 1 : clean.length;
43
+ const byteLength = Math.floor((len * 6) / 8);
44
+ const out = new Uint8Array(byteLength);
45
+ let bits = 0;
46
+ let value = 0;
47
+ let outIdx = 0;
48
+ for (let i = 0; i < len; i += 1) {
49
+ value = ((value << 6) | DECODE[clean.charCodeAt(i)]) & 0xffffff;
50
+ bits += 6;
51
+ if (bits >= 8) {
52
+ bits -= 8;
53
+ out[outIdx] = (value >> bits) & 0xff;
54
+ outIdx += 1;
55
+ }
56
+ }
57
+ return out;
58
+ }
59
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../src/base64.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The shared plumbing of the `bcf.*` flow nodes (#5167 phase 3.4): the
3
+ * connection params every one of them takes, and a `BcfApiClient` whose
4
+ * `fetchFn` is the gated `coreNetworkRequest` from `@ifc-lite/sandbox` —
5
+ * the same function `http.request` and `bim.network.fetch` use. So every
6
+ * request the BCF client issues passes the https-only / exact-host-grant /
7
+ * no-redirect / body-cap policy against `ctx.host.networkGrants`, and moves
8
+ * over `ctx.host.networkTransport`; a BCF node never reaches bare `fetch`.
9
+ *
10
+ * The bearer token is an ordinary string param, so a graph writes
11
+ * `{{secret:BCF_TOKEN}}` and the CLI/MCP runner substitutes it before the
12
+ * node runs (see `secrets.ts`). It is handed to the client's
13
+ * `getAccessToken` and appears nowhere else: never logged, never in an
14
+ * output, never in an error message this module composes.
15
+ */
16
+ import { BcfApiClient, type FetchLike } from '@ifc-lite/bcf-api';
17
+ import type { ParamDef } from '@ifc-lite/flow';
18
+ import type { Ctx } from './host.js';
19
+ /** Connection params shared by every `bcf.*` node, in palette order. */
20
+ export declare const BCF_CONNECTION_PARAMS: readonly ParamDef[];
21
+ /**
22
+ * A `FetchLike` for `BcfApiClient` that sends every request through
23
+ * `coreNetworkRequest`. Only GET and POST exist there, and they are all the
24
+ * `bcf.*` nodes need; any other method is refused before the network.
25
+ */
26
+ export declare function gatedBcfFetch(ctx: Ctx, nodeType: string, params: Readonly<Record<string, unknown>>): FetchLike;
27
+ /** Required non-empty string param, trimmed. */
28
+ export declare function requiredString(nodeType: string, params: Readonly<Record<string, unknown>>, name: string): string;
29
+ /** A `BcfApiClient` over the gated transport, plus the project it addresses. */
30
+ export declare function bcfClientFor(ctx: Ctx, nodeType: string, params: Readonly<Record<string, unknown>>): {
31
+ client: BcfApiClient;
32
+ projectId: string;
33
+ };
34
+ /** Name the node on a denial, as `http.request` does; every other error passes through unchanged. */
35
+ export declare function withBcfErrors<T>(nodeType: string, fn: () => Promise<T>): Promise<T>;
36
+ //# sourceMappingURL=bcf-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-client.d.ts","sourceRoot":"","sources":["../src/bcf-client.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAKrC,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,EAAE,SAAS,QAAQ,EAOpD,CAAC;AAmBF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAmB9G;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhH;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAiB7C;AAED,qGAAqG;AACrG,wBAAsB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOzF"}
@@ -0,0 +1,108 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * The shared plumbing of the `bcf.*` flow nodes (#5167 phase 3.4): the
6
+ * connection params every one of them takes, and a `BcfApiClient` whose
7
+ * `fetchFn` is the gated `coreNetworkRequest` from `@ifc-lite/sandbox` —
8
+ * the same function `http.request` and `bim.network.fetch` use. So every
9
+ * request the BCF client issues passes the https-only / exact-host-grant /
10
+ * no-redirect / body-cap policy against `ctx.host.networkGrants`, and moves
11
+ * over `ctx.host.networkTransport`; a BCF node never reaches bare `fetch`.
12
+ *
13
+ * The bearer token is an ordinary string param, so a graph writes
14
+ * `{{secret:BCF_TOKEN}}` and the CLI/MCP runner substitutes it before the
15
+ * node runs (see `secrets.ts`). It is handed to the client's
16
+ * `getAccessToken` and appears nowhere else: never logged, never in an
17
+ * output, never in an error message this module composes.
18
+ */
19
+ import { BcfApiClient } from '@ifc-lite/bcf-api';
20
+ import { coreNetworkRequest, NetworkDeniedError } from '@ifc-lite/sandbox';
21
+ const DEFAULT_TIMEOUT_MS = 15_000;
22
+ const DEFAULT_MAX_BYTES = 5 * 1024 * 1024;
23
+ /** Connection params shared by every `bcf.*` node, in palette order. */
24
+ export const BCF_CONNECTION_PARAMS = [
25
+ { name: 'baseUrl', kind: 'string', default: '', doc: 'https:// BCF API base URL, up to but excluding the version segment (e.g. https://bcf.example.com/bcf). The hostname must match a granted network.fetch:<host> capability exactly.' },
26
+ { name: 'version', kind: 'string', default: '2.1', doc: 'BCF API version segment.' },
27
+ { name: 'projectId', kind: 'string', default: '', doc: 'BCF project id.' },
28
+ { name: 'token', kind: 'string', default: '', doc: 'Bearer access token, sent as `Authorization: Bearer <token>`. Use {{secret:NAME}} with a declared secret.read:NAME; leave empty for an anonymous server.' },
29
+ { name: 'timeoutMs', kind: 'number', default: DEFAULT_TIMEOUT_MS, doc: 'Wall-clock limit per request.' },
30
+ { name: 'maxBytes', kind: 'number', default: DEFAULT_MAX_BYTES, doc: 'Response body cap per request; a larger response fails the node rather than being parsed truncated.' },
31
+ ];
32
+ /** A numeric bound, or `fallback` when absent or below `min` (same reading as `http.request`). */
33
+ function boundOr(value, fallback, min) {
34
+ const n = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value) : Number.NaN;
35
+ return Number.isFinite(n) && n >= min ? n : fallback;
36
+ }
37
+ function headerRecord(headers) {
38
+ const out = {};
39
+ new Headers(headers).forEach((value, key) => {
40
+ out[key] = value;
41
+ });
42
+ return out;
43
+ }
44
+ /** Statuses whose `Response` must have a null body (the constructor throws otherwise). */
45
+ const NULL_BODY_STATUSES = new Set([101, 204, 205, 304]);
46
+ /**
47
+ * A `FetchLike` for `BcfApiClient` that sends every request through
48
+ * `coreNetworkRequest`. Only GET and POST exist there, and they are all the
49
+ * `bcf.*` nodes need; any other method is refused before the network.
50
+ */
51
+ export function gatedBcfFetch(ctx, nodeType, params) {
52
+ const timeoutMs = boundOr(params.timeoutMs, DEFAULT_TIMEOUT_MS, 1);
53
+ const maxBytes = boundOr(params.maxBytes, DEFAULT_MAX_BYTES, 0);
54
+ return async (url, init) => {
55
+ const method = (init?.method ?? 'GET').toUpperCase();
56
+ if (method !== 'GET' && method !== 'POST')
57
+ throw new Error(`${nodeType}: HTTP method ${method} is not supported`);
58
+ const body = init?.body;
59
+ if (body !== undefined && body !== null && typeof body !== 'string') {
60
+ throw new Error(`${nodeType}: only JSON request bodies are supported`);
61
+ }
62
+ const res = await coreNetworkRequest({ url, method, headers: headerRecord(init?.headers), body: body ?? undefined, timeoutMs, maxBytes, signal: ctx.signal }, ctx.host.networkGrants ?? [], ctx.host.networkTransport);
63
+ // A cut-off JSON body would surface as a confusing parse error; name the cap instead.
64
+ if (res.truncated)
65
+ throw new Error(`${nodeType}: response from ${url} exceeded maxBytes (${maxBytes}); raise the node's maxBytes param`);
66
+ return new Response(NULL_BODY_STATUSES.has(res.status) ? null : res.body, { status: res.status, headers: res.headers });
67
+ };
68
+ }
69
+ /** Required non-empty string param, trimmed. */
70
+ export function requiredString(nodeType, params, name) {
71
+ const v = params[name];
72
+ const s = typeof v === 'string' ? v.trim() : '';
73
+ if (s.length === 0)
74
+ throw new Error(`${nodeType}: "${name}" is required`);
75
+ return s;
76
+ }
77
+ /** A `BcfApiClient` over the gated transport, plus the project it addresses. */
78
+ export function bcfClientFor(ctx, nodeType, params) {
79
+ const baseUrl = requiredString(nodeType, params, 'baseUrl');
80
+ try {
81
+ new URL(baseUrl);
82
+ }
83
+ catch {
84
+ throw new Error(`${nodeType}: "baseUrl" is not a valid URL`);
85
+ }
86
+ const projectId = requiredString(nodeType, params, 'projectId');
87
+ const version = typeof params.version === 'string' && params.version.trim() !== '' ? params.version.trim() : '2.1';
88
+ const token = typeof params.token === 'string' ? params.token.trim() : '';
89
+ const client = new BcfApiClient({
90
+ baseUrl,
91
+ version,
92
+ getAccessToken: () => (token.length > 0 ? token : undefined),
93
+ fetchFn: gatedBcfFetch(ctx, nodeType, params),
94
+ });
95
+ return { client, projectId };
96
+ }
97
+ /** Name the node on a denial, as `http.request` does; every other error passes through unchanged. */
98
+ export async function withBcfErrors(nodeType, fn) {
99
+ try {
100
+ return await fn();
101
+ }
102
+ catch (err) {
103
+ if (err instanceof NetworkDeniedError)
104
+ throw new Error(`${nodeType}: ${err.message}`, { cause: err });
105
+ throw err;
106
+ }
107
+ }
108
+ //# sourceMappingURL=bcf-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-client.js","sourceRoot":"","sources":["../src/bcf-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type FlowNodeDef } from './host.js';
2
+ export declare const bcfNodes: FlowNodeDef[];
3
+ //# sourceMappingURL=bcf-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-nodes.d.ts","sourceRoot":"","sources":["../src/bcf-nodes.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA4D,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAwEvG,eAAO,MAAM,QAAQ,EAAE,WAAW,EAqGjC,CAAC"}
@@ -0,0 +1,181 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { BCF_CONNECTION_PARAMS, bcfClientFor, requiredString, withBcfErrors } from './bcf-client.js';
5
+ import { ANY_ITEM, ANY_LIST, SCALAR_ITEM, SCALAR_LIST, TABLE_ITEM } from './host.js';
6
+ import { tableOf } from './table-nodes.js';
7
+ const NETWORK = { capabilities: ['network.fetch:*'], requires: { network: true }, volatile: true };
8
+ /** Labels travel through a table cell as one `;`-separated string. */
9
+ const LABEL_SEPARATOR = ';';
10
+ /** The `bcf.listTopics` table's columns; `bcf.createTopic` reads rows by the same names. */
11
+ const TOPIC_COLUMNS = [
12
+ { name: 'guid', type: 'identifier' },
13
+ { name: 'title', type: 'string' },
14
+ { name: 'status', type: 'string' },
15
+ { name: 'type', type: 'string' },
16
+ { name: 'priority', type: 'string' },
17
+ { name: 'assigned_to', type: 'string' },
18
+ { name: 'creation_date', type: 'string' },
19
+ { name: 'modified_date', type: 'string' },
20
+ { name: 'labels', type: 'string' },
21
+ { name: 'description', type: 'string' },
22
+ ];
23
+ function topicsTable(topics) {
24
+ const rows = topics.map((t) => ({
25
+ guid: t.guid,
26
+ title: t.title ?? null,
27
+ status: t.topic_status ?? null,
28
+ type: t.topic_type ?? null,
29
+ priority: t.priority ?? null,
30
+ assigned_to: t.assigned_to ?? null,
31
+ creation_date: t.creation_date ?? null,
32
+ modified_date: t.modified_date ?? null,
33
+ labels: t.labels && t.labels.length > 0 ? t.labels.join(LABEL_SEPARATOR) : null,
34
+ description: t.description ?? null,
35
+ }));
36
+ return { columns: TOPIC_COLUMNS, rows, key: 'guid' };
37
+ }
38
+ /** A trimmed non-empty string, or `undefined`. */
39
+ function text(v) {
40
+ if (v === undefined || v === null)
41
+ return undefined;
42
+ const s = String(v).trim();
43
+ return s.length > 0 ? s : undefined;
44
+ }
45
+ function labelsOf(v) {
46
+ const parts = Array.isArray(v) ? v.map((x) => String(x)) : typeof v === 'string' ? v.split(LABEL_SEPARATOR) : [];
47
+ const labels = parts.map((s) => s.trim()).filter((s) => s.length > 0);
48
+ return labels.length > 0 ? labels : undefined;
49
+ }
50
+ /** Topic fields from the node's params, each overridden by a non-empty cell of `row` when one is given. */
51
+ function topicWrite(params, row, where) {
52
+ const pick = (column, param) => text(row?.[column]) ?? text(params[param]);
53
+ const title = pick('title', 'title');
54
+ if (!title)
55
+ throw new Error(`bcf.createTopic: ${where} has no title`);
56
+ const out = { title };
57
+ const description = pick('description', 'description');
58
+ const type = pick('type', 'type');
59
+ const status = pick('status', 'status');
60
+ const priority = pick('priority', 'priority');
61
+ const assignedTo = pick('assigned_to', 'assignedTo');
62
+ const labels = labelsOf(row?.labels) ?? labelsOf(params.labels);
63
+ if (description)
64
+ out.description = description;
65
+ if (type)
66
+ out.topic_type = type;
67
+ if (status)
68
+ out.topic_status = status;
69
+ if (priority)
70
+ out.priority = priority;
71
+ if (assignedTo)
72
+ out.assigned_to = assignedTo;
73
+ if (labels)
74
+ out.labels = labels;
75
+ return out;
76
+ }
77
+ export const bcfNodes = [
78
+ {
79
+ type: 'bcf.listTopics',
80
+ title: 'BCF List Topics',
81
+ category: 'bcf',
82
+ doc: 'Lists a BCF API project\'s topics as a table (one row per topic, keyed by `guid`; labels `;`-separated) plus the raw topic list. Requests go only to a host covered by a granted `network.fetch:<host>` capability.',
83
+ inputs: [],
84
+ outputs: [
85
+ { name: 'table', type: TABLE_ITEM },
86
+ { name: 'topics', type: ANY_LIST },
87
+ { name: 'count', type: SCALAR_ITEM },
88
+ ],
89
+ params: [
90
+ ...BCF_CONNECTION_PARAMS,
91
+ { name: 'filter', kind: 'string', default: '', doc: 'OData $filter, e.g. topic_status eq \'Open\'.' },
92
+ { name: 'orderby', kind: 'string', default: '', doc: 'OData $orderby, e.g. creation_date desc.' },
93
+ { name: 'top', kind: 'number', default: 0, doc: 'OData $top; 0 lists every topic the server returns.' },
94
+ ],
95
+ ...NETWORK,
96
+ run: (ctx, _i, p) => withBcfErrors('bcf.listTopics', async () => {
97
+ const { client, projectId } = bcfClientFor(ctx, 'bcf.listTopics', p);
98
+ const top = Number(p.top);
99
+ const topics = await client.getTopics(projectId, {
100
+ filter: text(p.filter),
101
+ orderby: text(p.orderby),
102
+ top: Number.isInteger(top) && top > 0 ? top : undefined,
103
+ });
104
+ return { table: topicsTable(topics), topics, count: topics.length };
105
+ }),
106
+ },
107
+ {
108
+ type: 'bcf.createTopic',
109
+ title: 'BCF Create Topic',
110
+ category: 'bcf',
111
+ doc: 'Creates a topic in a BCF API project from the params — or, with `rows` connected, one topic per row, reading the `bcf.listTopics` column names (title, description, type, status, priority, assigned_to, labels) and falling back to the params for empty cells. Every row is validated before the first request.',
112
+ inputs: [{ name: 'rows', type: TABLE_ITEM, optional: true, doc: 'Optional table: one topic per row.' }],
113
+ outputs: [
114
+ { name: 'guids', type: SCALAR_LIST },
115
+ { name: 'topics', type: ANY_LIST },
116
+ ],
117
+ params: [
118
+ ...BCF_CONNECTION_PARAMS,
119
+ { name: 'title', kind: 'string', default: '' },
120
+ { name: 'description', kind: 'string', default: '' },
121
+ { name: 'type', kind: 'string', default: '', doc: 'topic_type, e.g. Issue.' },
122
+ { name: 'status', kind: 'string', default: '', doc: 'topic_status, e.g. Open.' },
123
+ { name: 'priority', kind: 'string', default: '' },
124
+ { name: 'assignedTo', kind: 'string', default: '', doc: 'assigned_to user id.' },
125
+ { name: 'labels', kind: 'string', default: '', doc: '`;`-separated labels.' },
126
+ ],
127
+ ...NETWORK,
128
+ run: (ctx, i, p) => withBcfErrors('bcf.createTopic', async () => {
129
+ const { client, projectId } = bcfClientFor(ctx, 'bcf.createTopic', p);
130
+ const writes = i.rows === undefined
131
+ ? [topicWrite(p, undefined, 'the node')]
132
+ : tableOf(i.rows).rows.map((row, idx) => topicWrite(p, row, `row ${idx + 1}`));
133
+ const topics = [];
134
+ for (const write of writes) {
135
+ try {
136
+ topics.push(await client.createTopic(projectId, write));
137
+ }
138
+ catch (err) {
139
+ // Name what already exists on the server, so a rerun does not duplicate it blindly.
140
+ if (topics.length === 0)
141
+ throw err;
142
+ const done = topics.map((t) => t.guid).join(', ');
143
+ throw new Error(`bcf.createTopic: failed after creating ${topics.length} topic(s) [${done}]: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
144
+ }
145
+ }
146
+ ctx.log('info', `created ${topics.length} topic(s)`);
147
+ return { guids: topics.map((t) => t.guid), topics };
148
+ }),
149
+ },
150
+ {
151
+ type: 'bcf.addComment',
152
+ title: 'BCF Add Comment',
153
+ category: 'bcf',
154
+ doc: 'Adds a comment to a BCF topic. `topicGuid`/`comment` inputs override the params, so wiring `bcf.createTopic`\'s `guids` comments on each new topic.',
155
+ inputs: [
156
+ { name: 'topicGuid', type: SCALAR_ITEM, optional: true },
157
+ { name: 'comment', type: SCALAR_ITEM, optional: true },
158
+ ],
159
+ outputs: [
160
+ { name: 'guid', type: SCALAR_ITEM },
161
+ { name: 'created', type: ANY_ITEM },
162
+ ],
163
+ params: [
164
+ ...BCF_CONNECTION_PARAMS,
165
+ { name: 'topicGuid', kind: 'string', default: '' },
166
+ { name: 'comment', kind: 'string', default: '' },
167
+ { name: 'replyToCommentGuid', kind: 'string', default: '' },
168
+ ],
169
+ ...NETWORK,
170
+ run: (ctx, i, p) => withBcfErrors('bcf.addComment', async () => {
171
+ const { client, projectId } = bcfClientFor(ctx, 'bcf.addComment', p);
172
+ const merged = { topicGuid: text(i.topicGuid) ?? p.topicGuid, comment: text(i.comment) ?? p.comment };
173
+ const topicGuid = requiredString('bcf.addComment', merged, 'topicGuid');
174
+ const comment = requiredString('bcf.addComment', merged, 'comment');
175
+ const replyTo = text(p.replyToCommentGuid);
176
+ const created = await client.createComment(projectId, topicGuid, replyTo ? { comment, reply_to_comment_guid: replyTo } : { comment });
177
+ return { guid: created.guid, created };
178
+ }),
179
+ },
180
+ ];
181
+ //# sourceMappingURL=bcf-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-nodes.js","sourceRoot":"","sources":["../src/bcf-nodes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"csv-nodes.d.ts","sourceRoot":"","sources":["../src/csv-nodes.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AA0BnF,eAAO,MAAM,QAAQ,EAAE,WAAW,EA0EjC,CAAC"}
1
+ {"version":3,"file":"csv-nodes.d.ts","sourceRoot":"","sources":["../src/csv-nodes.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AA0BnF,eAAO,MAAM,QAAQ,EAAE,WAAW,EA0EjC,CAAC"}
package/dist/csv-nodes.js CHANGED
@@ -14,11 +14,10 @@
14
14
  * has nothing new to find here.
15
15
  */
16
16
  import { tableToCsv } from '@ifc-lite/export';
17
- import { PARSE_INVALID } from '@ifc-lite/mutations';
18
- import { parseStrictCell } from './strict-cell.js';
17
+ import { PARSE_INVALID, parseValue } from '@ifc-lite/mutations';
19
18
  import { COLUMN_TYPES } from '@ifc-lite/flow';
20
19
  import { SCALAR_ITEM, SCALAR_LIST, TABLE_ITEM } from './host.js';
21
- import { tableOf } from './table-nodes.js';
20
+ import { VALUE_TYPE_BY_COLUMN_TYPE, tableOf } from './table-nodes.js';
22
21
  import { parseCsvText } from './csv-parse.js';
23
22
  function isColumnSpec(v) {
24
23
  return !!v && typeof v === 'object' && typeof v.name === 'string';
@@ -75,7 +74,7 @@ export const csvNodes = [
75
74
  row[col.name] = raw;
76
75
  return;
77
76
  }
78
- const parsedCell = parseStrictCell(raw, col.type);
77
+ const parsedCell = parseValue(raw, VALUE_TYPE_BY_COLUMN_TYPE[col.type]);
79
78
  if (parsedCell === PARSE_INVALID) {
80
79
  problems.push(`row ${rowIdx + 2}: column "${col.name}": cannot parse "${raw}" as ${col.type}`);
81
80
  row[col.name] = null;