@sonisoft/now-sdk-ext-core 6.6.3 → 6.8.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 (79) hide show
  1. package/README.md +6 -0
  2. package/dist/comm/http/FormHtmlParser.d.ts +34 -0
  3. package/dist/comm/http/FormHtmlParser.js +227 -0
  4. package/dist/comm/http/FormHtmlParser.js.map +1 -0
  5. package/dist/comm/http/FormRecordModels.d.ts +120 -0
  6. package/dist/comm/http/FormRecordModels.js +6 -0
  7. package/dist/comm/http/FormRecordModels.js.map +1 -0
  8. package/dist/comm/http/FormRecordWriter.d.ts +99 -0
  9. package/dist/comm/http/FormRecordWriter.js +385 -0
  10. package/dist/comm/http/FormRecordWriter.js.map +1 -0
  11. package/dist/comm/http/HTTPRequest.d.ts +4 -0
  12. package/dist/comm/http/RequestHandler.d.ts +1 -0
  13. package/dist/comm/http/RequestHandler.js +34 -22
  14. package/dist/comm/http/RequestHandler.js.map +1 -1
  15. package/dist/comm/http/internal/FormTransportModels.d.ts +26 -0
  16. package/dist/comm/http/internal/FormTransportModels.js +2 -0
  17. package/dist/comm/http/internal/FormTransportModels.js.map +1 -0
  18. package/dist/exception/FormSubmitError.d.ts +13 -0
  19. package/dist/exception/FormSubmitError.js +19 -0
  20. package/dist/exception/FormSubmitError.js.map +1 -0
  21. package/dist/exception/WorkflowValidationError.d.ts +24 -0
  22. package/dist/exception/WorkflowValidationError.js +24 -0
  23. package/dist/exception/WorkflowValidationError.js.map +1 -0
  24. package/dist/index.d.ts +19 -0
  25. package/dist/index.js +19 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/sn/metadata/MetadataFormWriter.d.ts +13 -0
  28. package/dist/sn/metadata/MetadataFormWriter.js +264 -0
  29. package/dist/sn/metadata/MetadataFormWriter.js.map +1 -0
  30. package/dist/sn/metadata/MetadataModels.d.ts +44 -0
  31. package/dist/sn/metadata/MetadataModels.js +2 -0
  32. package/dist/sn/metadata/MetadataModels.js.map +1 -0
  33. package/dist/sn/metadata/MetadataScopeError.d.ts +5 -0
  34. package/dist/sn/metadata/MetadataScopeError.js +10 -0
  35. package/dist/sn/metadata/MetadataScopeError.js.map +1 -0
  36. package/dist/sn/metadata/MetadataVerificationError.d.ts +11 -0
  37. package/dist/sn/metadata/MetadataVerificationError.js +20 -0
  38. package/dist/sn/metadata/MetadataVerificationError.js.map +1 -0
  39. package/dist/sn/metadata/internal/MetadataPreferences.d.ts +12 -0
  40. package/dist/sn/metadata/internal/MetadataPreferences.js +27 -0
  41. package/dist/sn/metadata/internal/MetadataPreferences.js.map +1 -0
  42. package/dist/sn/metadata/internal/MetadataReader.d.ts +9 -0
  43. package/dist/sn/metadata/internal/MetadataReader.js +55 -0
  44. package/dist/sn/metadata/internal/MetadataReader.js.map +1 -0
  45. package/dist/sn/variables/VariableDefinitions.d.ts +23 -0
  46. package/dist/sn/variables/VariableDefinitions.js +106 -0
  47. package/dist/sn/variables/VariableDefinitions.js.map +1 -0
  48. package/dist/sn/variables/VariableModels.d.ts +49 -0
  49. package/dist/sn/variables/VariableModels.js +6 -0
  50. package/dist/sn/variables/VariableModels.js.map +1 -0
  51. package/dist/sn/workflow/WorkflowConversionModels.d.ts +209 -0
  52. package/dist/sn/workflow/WorkflowConversionModels.js +2 -0
  53. package/dist/sn/workflow/WorkflowConversionModels.js.map +1 -0
  54. package/dist/sn/workflow/WorkflowDiagramClient.d.ts +70 -0
  55. package/dist/sn/workflow/WorkflowDiagramClient.js +151 -0
  56. package/dist/sn/workflow/WorkflowDiagramClient.js.map +1 -0
  57. package/dist/sn/workflow/WorkflowFlowConversion.d.ts +19 -0
  58. package/dist/sn/workflow/WorkflowFlowConversion.js +1013 -0
  59. package/dist/sn/workflow/WorkflowFlowConversion.js.map +1 -0
  60. package/dist/sn/workflow/WorkflowFlowHints.d.ts +3 -0
  61. package/dist/sn/workflow/WorkflowFlowHints.js +36 -0
  62. package/dist/sn/workflow/WorkflowFlowHints.js.map +1 -0
  63. package/dist/sn/workflow/WorkflowFluentGenerator.d.ts +17 -0
  64. package/dist/sn/workflow/WorkflowFluentGenerator.js +348 -0
  65. package/dist/sn/workflow/WorkflowFluentGenerator.js.map +1 -0
  66. package/dist/sn/workflow/WorkflowGraphML.d.ts +39 -0
  67. package/dist/sn/workflow/WorkflowGraphML.js +162 -0
  68. package/dist/sn/workflow/WorkflowGraphML.js.map +1 -0
  69. package/dist/sn/workflow/WorkflowManager.d.ts +236 -6
  70. package/dist/sn/workflow/WorkflowManager.js +1443 -15
  71. package/dist/sn/workflow/WorkflowManager.js.map +1 -1
  72. package/dist/sn/workflow/WorkflowModels.d.ts +738 -0
  73. package/dist/sn/workflow/WorkflowStructure.d.ts +137 -0
  74. package/dist/sn/workflow/WorkflowStructure.js +368 -0
  75. package/dist/sn/workflow/WorkflowStructure.js.map +1 -0
  76. package/dist/sn/workflow/WorkflowViews.d.ts +104 -0
  77. package/dist/sn/workflow/WorkflowViews.js +408 -0
  78. package/dist/sn/workflow/WorkflowViews.js.map +1 -0
  79. package/package.json +2 -1
@@ -0,0 +1,44 @@
1
+ import type { FormWriteOptions } from '../../comm/http/FormRecordModels.js';
2
+ /** Global must be requested explicitly. Named scopes resolve to one active application. */
3
+ export type MetadataScopeRef = {
4
+ sysId: string;
5
+ } | {
6
+ scope: string;
7
+ } | 'global';
8
+ export interface MetadataWriteOptions extends FormWriteOptions {
9
+ scope: MetadataScopeRef;
10
+ updateSet?: string;
11
+ allowMixedScopeCapture?: boolean;
12
+ }
13
+ export interface MetadataDeleteOptions extends Omit<MetadataWriteOptions, 'fields' | 'variables' | 'initialQuery'> {
14
+ confirm: {
15
+ table: string;
16
+ sysId: string;
17
+ };
18
+ }
19
+ export interface CaptureReport {
20
+ updateSetSysId: string;
21
+ updateSetName: string;
22
+ updateSetScope: string;
23
+ predictedUpdateSetSysId?: string;
24
+ recordScope: string;
25
+ action: string;
26
+ preferencesUnchanged: boolean;
27
+ preferenceRowsReplaced: string[];
28
+ currentUpdateSet: {
29
+ before?: string;
30
+ after?: string;
31
+ switched: boolean;
32
+ };
33
+ }
34
+ export interface MetadataWriteResult {
35
+ table: string;
36
+ sysId: string;
37
+ action: 'insert' | 'update' | 'delete';
38
+ scope: {
39
+ sysId: string;
40
+ scope: string;
41
+ };
42
+ capture: CaptureReport;
43
+ messages: string[];
44
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MetadataModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataModels.js","sourceRoot":"","sources":["../../../src/sn/metadata/MetadataModels.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ /** A refusal before the form POST. Messages contain codes, never caller values. */
2
+ export declare class MetadataScopeError extends Error {
3
+ readonly code: 'scope_required' | 'scope_unknown' | 'scope_ambiguous' | 'scope_mismatch' | 'scope_not_applied' | 'store_scope' | 'table_not_supported' | 'field_not_supported' | 'delete_not_supported' | 'not_permitted' | 'csrf_token_unavailable' | 'invalid_input' | 'evidence_unavailable';
4
+ constructor(code: 'scope_required' | 'scope_unknown' | 'scope_ambiguous' | 'scope_mismatch' | 'scope_not_applied' | 'store_scope' | 'table_not_supported' | 'field_not_supported' | 'delete_not_supported' | 'not_permitted' | 'csrf_token_unavailable' | 'invalid_input' | 'evidence_unavailable');
5
+ }
@@ -0,0 +1,10 @@
1
+ /** A refusal before the form POST. Messages contain codes, never caller values. */
2
+ export class MetadataScopeError extends Error {
3
+ code;
4
+ constructor(code) {
5
+ super(`Metadata write refused: ${code}`);
6
+ this.code = code;
7
+ this.name = 'MetadataScopeError';
8
+ }
9
+ }
10
+ //# sourceMappingURL=MetadataScopeError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataScopeError.js","sourceRoot":"","sources":["../../../src/sn/metadata/MetadataScopeError.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACN;IAAnC,YAAmC,IAGS;QACxC,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QAJV,SAAI,GAAJ,IAAI,CAGK;QAExC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACrC,CAAC;CACJ"}
@@ -0,0 +1,11 @@
1
+ import type { CaptureReport } from './MetadataModels.js';
2
+ /** A submit was attempted. Read the evidence before deciding how to clean up. Never replay automatically. */
3
+ export declare class MetadataVerificationError extends Error {
4
+ readonly code: 'scope_not_applied' | 'not_captured' | 'captured_elsewhere' | 'mixed_scope_capture' | 'session_changed' | 'delete_not_applied' | 'delete_not_captured' | 'write_not_applied' | 'verification_unavailable' | 'csrf_rejected';
5
+ readonly table: string;
6
+ readonly sysId: string;
7
+ readonly capture?: Partial<CaptureReport>;
8
+ readonly messages: string[];
9
+ readonly writeAttempted: boolean;
10
+ constructor(code: 'scope_not_applied' | 'not_captured' | 'captured_elsewhere' | 'mixed_scope_capture' | 'session_changed' | 'delete_not_applied' | 'delete_not_captured' | 'write_not_applied' | 'verification_unavailable' | 'csrf_rejected', table: string, sysId: string, capture?: Partial<CaptureReport>, messages?: string[], writeAttempted?: boolean);
11
+ }
@@ -0,0 +1,20 @@
1
+ /** A submit was attempted. Read the evidence before deciding how to clean up. Never replay automatically. */
2
+ export class MetadataVerificationError extends Error {
3
+ code;
4
+ table;
5
+ sysId;
6
+ capture;
7
+ messages;
8
+ writeAttempted;
9
+ constructor(code, table, sysId, capture, messages = [], writeAttempted = true) {
10
+ super(`Metadata submit verification failed: ${code}`);
11
+ this.code = code;
12
+ this.table = table;
13
+ this.sysId = sysId;
14
+ this.capture = capture;
15
+ this.messages = messages;
16
+ this.writeAttempted = writeAttempted;
17
+ this.name = 'MetadataVerificationError';
18
+ }
19
+ }
20
+ //# sourceMappingURL=MetadataVerificationError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataVerificationError.js","sourceRoot":"","sources":["../../../src/sn/metadata/MetadataVerificationError.ts"],"names":[],"mappings":"AACA,6GAA6G;AAC7G,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACb;IAGf;IAA+B;IAC/B;IAAkD;IAAyC;IAJ/G,YAAmC,IAEmC,EAClD,KAAa,EAAkB,KAAa,EAC5C,OAAgC,EAAkB,WAAqB,EAAE,EAAkB,iBAAiB,IAAI;QAChI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;QALvB,SAAI,GAAJ,IAAI,CAE+B;QAClD,UAAK,GAAL,KAAK,CAAQ;QAAkB,UAAK,GAAL,KAAK,CAAQ;QAC5C,YAAO,GAAP,OAAO,CAAyB;QAAkB,aAAQ,GAAR,QAAQ,CAAe;QAAkB,mBAAc,GAAd,cAAc,CAAO;QAEhI,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC5C,CAAC;CACJ"}
@@ -0,0 +1,12 @@
1
+ import type { MetadataRow } from './MetadataReader.js';
2
+ export declare function preferenceValue(rows: MetadataRow[], name: string): string | undefined;
3
+ export declare function comparePreferences(before: MetadataRow[], after: MetadataRow[], expectedSet?: string | string[]): {
4
+ valid: boolean;
5
+ unchanged: boolean;
6
+ replaced: string[];
7
+ currentUpdateSet: {
8
+ before: string;
9
+ after: string;
10
+ switched: boolean;
11
+ };
12
+ };
@@ -0,0 +1,27 @@
1
+ import { MetadataScopeError } from '../MetadataScopeError.js';
2
+ export function preferenceValue(rows, name) {
3
+ const values = [...new Set(rows.filter(row => row.name === name).map(row => row.value))];
4
+ if (values.length > 1)
5
+ throw new MetadataScopeError('evidence_unavailable');
6
+ return values[0];
7
+ }
8
+ function multiset(rows) {
9
+ return rows.map(row => JSON.stringify([row.name, row.value])).sort();
10
+ }
11
+ export function comparePreferences(before, after, expectedSet) {
12
+ const oldSet = preferenceValue(before, 'sys_update_set');
13
+ const newSet = preferenceValue(after, 'sys_update_set');
14
+ const switched = oldSet !== newSet;
15
+ const unchanged = JSON.stringify(multiset(before)) === JSON.stringify(multiset(after));
16
+ const destinations = Array.isArray(expectedSet) ? expectedSet : [expectedSet];
17
+ const allowed = switched && !!newSet && destinations.includes(newSet) &&
18
+ before.filter(row => row.name === 'sys_update_set').length === 1 &&
19
+ after.filter(row => row.name === 'sys_update_set').length === 1;
20
+ const remaining = (rows) => allowed ? rows.filter(row => row.name !== 'sys_update_set') : rows;
21
+ const valid = JSON.stringify(multiset(remaining(before))) === JSON.stringify(multiset(remaining(after)));
22
+ const oldIds = new Set(before.map(row => JSON.stringify([row.sys_id, row.name, row.value])));
23
+ const replaced = [...new Set(after.filter(row => !oldIds.has(JSON.stringify([row.sys_id, row.name, row.value])) &&
24
+ before.some(old => old.name === row.name && old.value === row.value)).map(row => row.name))].sort();
25
+ return { valid, unchanged, replaced, currentUpdateSet: { before: oldSet, after: newSet, switched } };
26
+ }
27
+ //# sourceMappingURL=MetadataPreferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataPreferences.js","sourceRoot":"","sources":["../../../../src/sn/metadata/internal/MetadataPreferences.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ServiceNowRequest } from '../../../comm/http/ServiceNowRequest.js';
2
+ export type MetadataRow = Record<string, string>;
3
+ /** Read-only, bounded pagination on the same authenticated request as the forms. */
4
+ export declare class MetadataReader {
5
+ private _request;
6
+ constructor(_request: ServiceNowRequest);
7
+ rows(table: string, query: string, fields: string): Promise<MetadataRow[]>;
8
+ exact(table: string, sysId: string, fields: string): Promise<MetadataRow | undefined>;
9
+ }
@@ -0,0 +1,55 @@
1
+ import { READ_ONLY } from '../../../policy/PolicyTypes.js';
2
+ import { MetadataScopeError } from '../MetadataScopeError.js';
3
+ /** Read-only, bounded pagination on the same authenticated request as the forms. */
4
+ export class MetadataReader {
5
+ _request;
6
+ constructor(_request) {
7
+ this._request = _request;
8
+ }
9
+ async rows(table, query, fields) {
10
+ const result = [];
11
+ const ids = new Set();
12
+ let expectedCount;
13
+ for (let page = 0; page < 100; page++) {
14
+ const response = await this._request.get({ path: `/api/now/table/${table}`,
15
+ headers: { Accept: 'application/json' }, body: null, requires: READ_ONLY, sensitive: true,
16
+ query: { sysparm_query: `${query}^ORDERBYsys_id`, sysparm_fields: fields,
17
+ sysparm_display_value: 'false', sysparm_exclude_reference_link: 'true', sysparm_no_count: 'false',
18
+ sysparm_limit: '200', sysparm_offset: String(page * 200) } });
19
+ const rows = response.bodyObject?.result;
20
+ if (response.status !== 200 || !Array.isArray(rows) || rows.length > 200)
21
+ throw new MetadataScopeError('evidence_unavailable');
22
+ const countHeader = response.headers?.['x-total-count'];
23
+ const count = Number(countHeader);
24
+ if (countHeader === undefined || !Number.isSafeInteger(count) || count < 0 || count > 20000 ||
25
+ (expectedCount !== undefined && expectedCount !== count))
26
+ throw new MetadataScopeError('evidence_unavailable');
27
+ expectedCount = count;
28
+ for (const value of rows) {
29
+ if (!value || typeof value !== 'object')
30
+ throw new MetadataScopeError('evidence_unavailable');
31
+ const row = value;
32
+ if (typeof row.sys_id !== 'string' || !row.sys_id || ids.has(row.sys_id) ||
33
+ fields.split(',').some(field => typeof row[field] !== 'string'))
34
+ throw new MetadataScopeError('evidence_unavailable');
35
+ ids.add(row.sys_id);
36
+ result.push(row);
37
+ }
38
+ if (result.length > expectedCount)
39
+ throw new MetadataScopeError('evidence_unavailable');
40
+ if (rows.length < 200) {
41
+ if (result.length !== expectedCount)
42
+ throw new MetadataScopeError('evidence_unavailable');
43
+ return result;
44
+ }
45
+ }
46
+ throw new MetadataScopeError('evidence_unavailable');
47
+ }
48
+ async exact(table, sysId, fields) {
49
+ const rows = await this.rows(table, `sys_id=${sysId}`, `sys_id,${fields}`);
50
+ if (rows.some(row => row.sys_id !== sysId) || rows.length > 1)
51
+ throw new MetadataScopeError('evidence_unavailable');
52
+ return rows[0];
53
+ }
54
+ }
55
+ //# sourceMappingURL=MetadataReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataReader.js","sourceRoot":"","sources":["../../../../src/sn/metadata/internal/MetadataReader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { ServiceNowInstance } from "../ServiceNowInstance.js";
2
+ import { ListVariableDefinitionsOptions, VariableDefinition } from "./VariableModels.js";
3
+ /**
4
+ * Reads variable definitions (`var_dictionary`) for a variable model, e.g. the variables
5
+ * a workflow activity type exposes (`var__m_<activity definition sys_id>`).
6
+ *
7
+ * Layout-only elements (names starting with `.`, such as `.begin_split`) are skipped:
8
+ * they never hold a value. Results are cached per model and language for the lifetime
9
+ * of the instance object.
10
+ */
11
+ export declare class VariableDefinitions {
12
+ private _tableAPI;
13
+ private _cache;
14
+ constructor(instance: ServiceNowInstance);
15
+ /**
16
+ * List the variables in a model, in display order.
17
+ *
18
+ * @param model Variable model table name, e.g. `var__m_3961a1da0a0a0b5c00ecd84822f70d85`
19
+ */
20
+ list(model: string, options?: ListVariableDefinitionsOptions): Promise<VariableDefinition[]>;
21
+ private load;
22
+ private read;
23
+ }
@@ -0,0 +1,106 @@
1
+ import { TableAPIRequest } from "../../comm/http/TableAPIRequest.js";
2
+ import { InvalidParameterException } from "../../exception/InvalidParameterException.js";
3
+ const MODEL = /^var__m_[a-z0-9_]+$/i;
4
+ const DEFINITION_FIELDS = [
5
+ "sys_id", "name", "element", "column_label", "internal_type", "default_value", "reference",
6
+ "mandatory", "order", "hint", "choice", "active",
7
+ ].join(",");
8
+ /**
9
+ * Reads variable definitions (`var_dictionary`) for a variable model, e.g. the variables
10
+ * a workflow activity type exposes (`var__m_<activity definition sys_id>`).
11
+ *
12
+ * Layout-only elements (names starting with `.`, such as `.begin_split`) are skipped:
13
+ * they never hold a value. Results are cached per model and language for the lifetime
14
+ * of the instance object.
15
+ */
16
+ export class VariableDefinitions {
17
+ _tableAPI;
18
+ _cache = new Map();
19
+ constructor(instance) {
20
+ this._tableAPI = new TableAPIRequest(instance);
21
+ }
22
+ /**
23
+ * List the variables in a model, in display order.
24
+ *
25
+ * @param model Variable model table name, e.g. `var__m_3961a1da0a0a0b5c00ecd84822f70d85`
26
+ */
27
+ async list(model, options = {}) {
28
+ if (!MODEL.test(model ?? "")) {
29
+ throw new InvalidParameterException(`Invalid variable model name '${model}'`);
30
+ }
31
+ const language = options.language ?? "en";
32
+ if (!/^[a-z]{2}(_[a-z]{2})?$/i.test(language)) {
33
+ throw new InvalidParameterException(`Invalid language '${language}'`);
34
+ }
35
+ const key = `${model}|${language}|${options.includeInactive ? 1 : 0}`;
36
+ if (!this._cache.has(key)) {
37
+ const pending = this.load(model, language, !!options.includeInactive);
38
+ this._cache.set(key, pending);
39
+ pending.catch(() => this._cache.delete(key));
40
+ }
41
+ return this._cache.get(key);
42
+ }
43
+ async load(model, language, includeInactive) {
44
+ const active = includeInactive ? "" : "^active=true";
45
+ const rows = await this.read("var_dictionary", `name=${model}${active}^ORDERBYorder`, DEFINITION_FIELDS);
46
+ const definitions = rows
47
+ .filter(row => !str(row.element).startsWith("."))
48
+ .map(row => toDefinition(row, model));
49
+ if (definitions.some(d => d.choices)) {
50
+ const choices = await this.read("sys_choice", `name=${model}^language=${language}^inactive=false^ORDERBYsequence`, "element,value,label,sequence");
51
+ for (const definition of definitions) {
52
+ if (!definition.choices)
53
+ continue;
54
+ definition.choices = choices
55
+ .filter(c => str(c.element) === definition.element)
56
+ .map((c) => ({ value: str(c.value) === "NULL_OVERRIDE" ? "" : str(c.value), label: str(c.label) }));
57
+ // Reference variables can carry a choice flag with no choice rows.
58
+ if (!definition.choices.length)
59
+ delete definition.choices;
60
+ }
61
+ }
62
+ return definitions;
63
+ }
64
+ async read(table, query, fields) {
65
+ const params = { sysparm_query: query, sysparm_fields: fields, sysparm_limit: "1000", sysparm_exclude_reference_link: "true" };
66
+ let response = await this._tableAPI.get(table, params);
67
+ // 202: the instance queued the request behind others in this session; ask again.
68
+ for (let attempt = 1; response?.status === 202 && attempt <= 3; attempt++) {
69
+ await new Promise(resolve => setTimeout(resolve, 500 * attempt));
70
+ response = await this._tableAPI.get(table, params);
71
+ }
72
+ if (response?.status !== 200 || !Array.isArray(response.bodyObject?.result)) {
73
+ throw new Error(`Failed to read ${table}. Status: ${response?.status ?? "unknown"}`);
74
+ }
75
+ return response.bodyObject.result;
76
+ }
77
+ }
78
+ function toDefinition(row, model) {
79
+ const definition = {
80
+ sysId: str(row.sys_id),
81
+ model,
82
+ element: str(row.element),
83
+ label: str(row.column_label),
84
+ internalType: str(row.internal_type),
85
+ defaultValue: str(row.default_value),
86
+ mandatory: str(row.mandatory) === "true",
87
+ order: Number(str(row.order)) || 0,
88
+ };
89
+ if (str(row.reference))
90
+ definition.reference = str(row.reference);
91
+ if (str(row.hint))
92
+ definition.hint = str(row.hint);
93
+ if (str(row.choice) !== "" && str(row.choice) !== "0")
94
+ definition.choices = [];
95
+ return definition;
96
+ }
97
+ function str(value) {
98
+ if (typeof value === "string")
99
+ return value;
100
+ if (typeof value === "number" || typeof value === "boolean")
101
+ return String(value);
102
+ if (value && typeof value === "object" && "value" in value)
103
+ return str(value.value);
104
+ return "";
105
+ }
106
+ //# sourceMappingURL=VariableDefinitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariableDefinitions.js","sourceRoot":"","sources":["../../../src/sn/variables/VariableDefinitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Models for variable (glide_var) definitions — the `var_dictionary` rows that describe
3
+ * the variables a record such as a workflow activity carries.
4
+ */
5
+ /**
6
+ * One choice offered by a choice variable.
7
+ */
8
+ export interface VariableChoice {
9
+ /** Stored value. The platform's NULL_OVERRIDE ("none") choice is reported as an empty string, which is what it stores. */
10
+ value: string;
11
+ /** Display label */
12
+ label: string;
13
+ }
14
+ /**
15
+ * Definition of one variable in a variable model.
16
+ */
17
+ export interface VariableDefinition {
18
+ /** sys_id of the var_dictionary row (what `sys_variable_value.variable` references) */
19
+ sysId: string;
20
+ /** Variable model table name, e.g. `var__m_<activity definition sys_id>` */
21
+ model: string;
22
+ /** Element name — the key used when reading or writing the variable */
23
+ element: string;
24
+ /** Label shown on the form */
25
+ label: string;
26
+ /** Internal type, e.g. `string`, `script`, `boolean`, `glide_duration`, `reference`, `glide_list`, `conditions` */
27
+ internalType: string;
28
+ /** Default value, verbatim (may be a `javascript:` expression evaluated by the form) */
29
+ defaultValue: string;
30
+ /** Referenced table, for reference and glide_list variables */
31
+ reference?: string;
32
+ /** Whether the variable is mandatory */
33
+ mandatory: boolean;
34
+ /** Display order */
35
+ order: number;
36
+ /** Help text */
37
+ hint?: string;
38
+ /** Choices, for choice variables */
39
+ choices?: VariableChoice[];
40
+ }
41
+ /**
42
+ * Options for listing variable definitions.
43
+ */
44
+ export interface ListVariableDefinitionsOptions {
45
+ /** Choice label language. Defaults to `en`. */
46
+ language?: string;
47
+ /** Include inactive variables. Defaults to false. */
48
+ includeInactive?: boolean;
49
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Models for variable (glide_var) definitions — the `var_dictionary` rows that describe
3
+ * the variables a record such as a workflow activity carries.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=VariableModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariableModels.js","sourceRoot":"","sources":["../../../src/sn/variables/VariableModels.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,209 @@
1
+ import { WorkflowExport } from "./WorkflowModels.js";
2
+ /**
3
+ * Models for planning the move of a legacy workflow to Flow Designer.
4
+ */
5
+ /** How completely a step carries over. */
6
+ export type FlowPlanConfidence = 'direct' | 'partial' | 'manual';
7
+ /** A value for a Flow Designer action input. */
8
+ export type FlowPlanValue = {
9
+ kind: 'literal';
10
+ value: string | number | boolean;
11
+ }
12
+ /** A data pill: `expr` is a Fluent expression such as `params.trigger.request_item.requested_for.manager` */
13
+ | {
14
+ kind: 'pill';
15
+ expr: string;
16
+ type: string;
17
+ }
18
+ /** Text mixing literals and data pills, e.g. a subject line */
19
+ | {
20
+ kind: 'text';
21
+ parts: Array<string | {
22
+ expr: string;
23
+ type: string;
24
+ }>;
25
+ }
26
+ /** A field map (`TemplateValue({...})`) */
27
+ | {
28
+ kind: 'template';
29
+ fields: Record<string, FlowPlanValue>;
30
+ }
31
+ /** Approval rules (`wfa.approvalRules({...})`) */
32
+ | {
33
+ kind: 'approvalRules';
34
+ ruleType: 'Any' | 'All' | 'Res';
35
+ action: 'Approves' | 'Rejects' | 'ApprovesRejects';
36
+ users: FlowPlanValue[];
37
+ groups: FlowPlanValue[];
38
+ }
39
+ /** A duration (`Duration({...})`) */
40
+ | {
41
+ kind: 'duration';
42
+ seconds: number;
43
+ }
44
+ /** A list of values */
45
+ | {
46
+ kind: 'list';
47
+ items: FlowPlanValue[];
48
+ };
49
+ /** A flow condition: an encoded query whose fields may be data pills. */
50
+ export interface FlowPlanCondition {
51
+ /** The condition as a Fluent template literal body, e.g. `${wfa.dataPill(x, "string")}=1` — empty when it could not be derived */
52
+ expression: string;
53
+ /** The legacy condition or exit it came from */
54
+ source: string;
55
+ /** False when the condition has to be written by hand */
56
+ derived: boolean;
57
+ }
58
+ /** Where a planned step came from. */
59
+ export interface FlowPlanSource {
60
+ activity: string;
61
+ name: string;
62
+ type: string;
63
+ /** Step number in the workflow outline */
64
+ number: number;
65
+ }
66
+ /** A node of the planned flow body. */
67
+ export type FlowPlanNode = {
68
+ kind: 'action';
69
+ id: string;
70
+ source: FlowPlanSource;
71
+ /** Fluent action, e.g. `action.core.askForApproval` */
72
+ action: string;
73
+ label: string;
74
+ inputs: Record<string, FlowPlanValue>;
75
+ /** Variable name the action's outputs are captured in, when later steps use them */
76
+ output?: string;
77
+ confidence: FlowPlanConfidence;
78
+ notes: string[];
79
+ stage?: string;
80
+ waits: boolean;
81
+ } | {
82
+ kind: 'waitForADuration';
83
+ id: string;
84
+ source: FlowPlanSource;
85
+ seconds: number;
86
+ confidence: FlowPlanConfidence;
87
+ notes: string[];
88
+ } | {
89
+ kind: 'if';
90
+ id: string;
91
+ source: FlowPlanSource;
92
+ /** if, then elseIf… in order */
93
+ branches: Array<{
94
+ label: string;
95
+ condition: FlowPlanCondition;
96
+ body: FlowPlanNode[];
97
+ }>;
98
+ /** else, when present */
99
+ otherwise?: {
100
+ label: string;
101
+ body: FlowPlanNode[];
102
+ };
103
+ confidence: FlowPlanConfidence;
104
+ notes: string[];
105
+ } | {
106
+ kind: 'parallel';
107
+ id: string;
108
+ source: FlowPlanSource;
109
+ lanes: FlowPlanNode[][];
110
+ notes: string[];
111
+ } | {
112
+ /** Set flow variables (a script that only wrote workflow.scratchpad keys) */
113
+ kind: 'setFlowVariables';
114
+ id: string;
115
+ source: FlowPlanSource;
116
+ values: Record<string, FlowPlanValue>;
117
+ notes: string[];
118
+ } | {
119
+ kind: 'endFlow';
120
+ id: string;
121
+ source: FlowPlanSource;
122
+ } | {
123
+ /** A step that has to be designed by hand: a script, a loop, a goto, a spoke, … */
124
+ kind: 'todo';
125
+ id: string;
126
+ source: FlowPlanSource;
127
+ reason: string;
128
+ /** Legacy detail to work from (script body, inputs, condition) */
129
+ detail?: string;
130
+ /** Set when the path continues at a step the flow already has elsewhere (a goto): that step's activity sys_id */
131
+ continueAt?: string;
132
+ };
133
+ /** The trigger of the planned flow, or the inputs of a planned subflow. */
134
+ export interface FlowPlanTrigger {
135
+ /** `serviceCatalog` for catalog item workflows, `record` for table workflows, `subflow` when nothing triggers it */
136
+ kind: 'serviceCatalog' | 'record' | 'subflow';
137
+ table: string;
138
+ /** Record trigger: created or created-or-updated, and its condition */
139
+ recordEvent?: 'created' | 'createdOrUpdated';
140
+ condition?: string;
141
+ /** Catalog items whose workflow this is (the flow is bound to them, not to its trigger) */
142
+ catalogItems: Array<{
143
+ sysId: string;
144
+ name: string;
145
+ }>;
146
+ /** Subflow inputs, from the workflow's inputs */
147
+ inputs: Array<{
148
+ name: string;
149
+ label: string;
150
+ type: string;
151
+ mandatory: boolean;
152
+ }>;
153
+ /** Fluent expression for the record the workflow ran on */
154
+ recordPill: string;
155
+ notes: string[];
156
+ }
157
+ /** A decision the conversion leaves to a person (or agent). */
158
+ export interface FlowPlanDecision {
159
+ topic: 'script' | 'loop' | 'goto' | 'catalogVariable' | 'spoke' | 'subflow' | 'stage' | 'trigger' | 'mergeWithoutJoin' | 'deadExit' | 'unreachable' | 'approval' | 'task' | 'other';
160
+ detail: string;
161
+ /** Activities involved (sys_ids) */
162
+ activities: string[];
163
+ }
164
+ /**
165
+ * A plan for rebuilding a legacy workflow in Flow Designer: the trigger, flow variables
166
+ * from the scratchpad, a flow-shaped body mapped step by step, and the decisions that
167
+ * need a person.
168
+ */
169
+ export interface FlowConversionPlan {
170
+ format: 'now-sdk-ext/flow-conversion-plan@1';
171
+ source: {
172
+ workflowSysId: string;
173
+ versionSysId: string;
174
+ name: string;
175
+ table: string;
176
+ };
177
+ kind: 'flow' | 'subflow';
178
+ /** Suggested flow name and a code-safe identifier */
179
+ name: string;
180
+ identifier: string;
181
+ trigger: FlowPlanTrigger;
182
+ /** workflow.scratchpad keys used across steps become flow variables */
183
+ flowVariables: Array<{
184
+ name: string;
185
+ type: 'string' | 'boolean' | 'integer';
186
+ setBy: string[];
187
+ usedBy: string[];
188
+ }>;
189
+ steps: FlowPlanNode[];
190
+ openDecisions: FlowPlanDecision[];
191
+ /** How many activities map directly, partly, or need design work */
192
+ coverage: {
193
+ direct: number;
194
+ partial: number;
195
+ manual: number;
196
+ };
197
+ }
198
+ /** One generated source file. */
199
+ export interface FluentSourceFile {
200
+ /** Suggested path inside a now-sdk app, e.g. `src/fluent/flows/laptop-request.now.ts` */
201
+ path: string;
202
+ content: string;
203
+ }
204
+ /** A workflow version's move to Flow Designer: its export, the plan and the Fluent skeleton. */
205
+ export interface WorkflowFlowConversion {
206
+ export: WorkflowExport;
207
+ plan: FlowConversionPlan;
208
+ files: FluentSourceFile[];
209
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=WorkflowConversionModels.js.map