@jigisha_ruparel/taf-client-metadata 0.1.0 → 0.2.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/index.d.ts +82 -1
- package/dist/index.js +113 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -62,6 +62,82 @@ interface QueryDef {
|
|
|
62
62
|
appObjectName: string;
|
|
63
63
|
configurations: unknown;
|
|
64
64
|
}
|
|
65
|
+
interface DiffEntry {
|
|
66
|
+
id: string;
|
|
67
|
+
referenceName: string;
|
|
68
|
+
oldValue?: unknown;
|
|
69
|
+
newValue?: unknown;
|
|
70
|
+
}
|
|
71
|
+
interface DiffGroup {
|
|
72
|
+
added: DiffEntry[];
|
|
73
|
+
updated: DiffEntry[];
|
|
74
|
+
deleted: DiffEntry[];
|
|
75
|
+
}
|
|
76
|
+
interface EnvInfo {
|
|
77
|
+
id: string;
|
|
78
|
+
name: string;
|
|
79
|
+
sequence: number;
|
|
80
|
+
releaseVersion?: string;
|
|
81
|
+
connectionId?: string;
|
|
82
|
+
}
|
|
83
|
+
interface MetadataDiff {
|
|
84
|
+
source: EnvInfo;
|
|
85
|
+
target: EnvInfo;
|
|
86
|
+
appObjects: DiffGroup;
|
|
87
|
+
customScripts: DiffGroup;
|
|
88
|
+
screens: DiffGroup;
|
|
89
|
+
}
|
|
90
|
+
interface TableDiff extends DiffGroup {
|
|
91
|
+
summary: {
|
|
92
|
+
added: number;
|
|
93
|
+
updated: number;
|
|
94
|
+
deleted: number;
|
|
95
|
+
totalChanges: number;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
interface DataDiff {
|
|
99
|
+
source: EnvInfo;
|
|
100
|
+
target: EnvInfo;
|
|
101
|
+
tables: Record<string, TableDiff>;
|
|
102
|
+
summary: {
|
|
103
|
+
tablesCompared: number;
|
|
104
|
+
tablesWithChanges: number;
|
|
105
|
+
totalAdded: number;
|
|
106
|
+
totalUpdated: number;
|
|
107
|
+
totalDeleted: number;
|
|
108
|
+
totalChanges: number;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
interface ApplyReleaseInput {
|
|
112
|
+
releaseId: string;
|
|
113
|
+
sourceEnvId: string;
|
|
114
|
+
targetEnvId: string;
|
|
115
|
+
}
|
|
116
|
+
interface ApplyReleaseError {
|
|
117
|
+
entityId: string;
|
|
118
|
+
entityType: string;
|
|
119
|
+
error: string;
|
|
120
|
+
}
|
|
121
|
+
interface ApplyReleaseResult {
|
|
122
|
+
success: boolean;
|
|
123
|
+
totalApplied: number;
|
|
124
|
+
totalFailed: number;
|
|
125
|
+
totalSkipped: number;
|
|
126
|
+
message: string;
|
|
127
|
+
errors: ApplyReleaseError[];
|
|
128
|
+
}
|
|
129
|
+
interface SyncResult {
|
|
130
|
+
message: string;
|
|
131
|
+
correlationId: string;
|
|
132
|
+
isFullRebuild: boolean;
|
|
133
|
+
}
|
|
134
|
+
interface CompareOptions {
|
|
135
|
+
sourceEnvId?: string;
|
|
136
|
+
targetEnvId?: string;
|
|
137
|
+
}
|
|
138
|
+
interface SubscribeOptions {
|
|
139
|
+
intervalMs?: number;
|
|
140
|
+
}
|
|
65
141
|
|
|
66
142
|
interface MetadataClient {
|
|
67
143
|
getEntity(nameOrId: string, version?: string): Promise<EntitySchema>;
|
|
@@ -72,6 +148,11 @@ interface MetadataClient {
|
|
|
72
148
|
appObjectName: string;
|
|
73
149
|
queryName: string;
|
|
74
150
|
}, version?: string): Promise<QueryDef>;
|
|
151
|
+
compareMetadata(opts?: CompareOptions): Promise<MetadataDiff>;
|
|
152
|
+
compareData(opts?: CompareOptions): Promise<DataDiff>;
|
|
153
|
+
applyRelease(input: ApplyReleaseInput): Promise<ApplyReleaseResult>;
|
|
154
|
+
syncMetadata(full?: boolean): Promise<SyncResult>;
|
|
155
|
+
subscribe(onChange: () => void, opts?: SubscribeOptions): () => void;
|
|
75
156
|
}
|
|
76
157
|
declare function createMetadataClient(core: TafClientCore): MetadataClient;
|
|
77
158
|
|
|
@@ -81,4 +162,4 @@ declare function parseAppObject(resp: {
|
|
|
81
162
|
appObjectJson?: string;
|
|
82
163
|
}): EntitySchema;
|
|
83
164
|
|
|
84
|
-
export { type ColumnType, type EntitySchema, type EntitySummary, type FieldConfig, type FieldSchema, type FieldTypeInfo, type LookupInfo, type MetadataClient, type QueryDef, type ScreenDef, columnTypeFor, createMetadataClient, parseAppObject };
|
|
165
|
+
export { type ApplyReleaseError, type ApplyReleaseInput, type ApplyReleaseResult, type ColumnType, type CompareOptions, type DataDiff, type DiffEntry, type DiffGroup, type EntitySchema, type EntitySummary, type EnvInfo, type FieldConfig, type FieldSchema, type FieldTypeInfo, type LookupInfo, type MetadataClient, type MetadataDiff, type QueryDef, type ScreenDef, type SubscribeOptions, type SyncResult, type TableDiff, columnTypeFor, createMetadataClient, parseAppObject };
|
package/dist/index.js
CHANGED
|
@@ -88,6 +88,20 @@ function jsonParse(s) {
|
|
|
88
88
|
return s;
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
function envInfo(e) {
|
|
92
|
+
const o = e ?? {};
|
|
93
|
+
return { id: String(o["id"] ?? ""), name: String(o["name"] ?? ""), sequence: Number(o["sequence"] ?? 0), releaseVersion: o["releaseVersion"] ?? void 0, connectionId: o["connectionId"] ?? void 0 };
|
|
94
|
+
}
|
|
95
|
+
function diffEntry(x) {
|
|
96
|
+
const o = x ?? {};
|
|
97
|
+
const props = o["properties"];
|
|
98
|
+
return { id: String(o["id"] ?? ""), referenceName: String(o["referenceName"] ?? ""), oldValue: props ? props["oldValue"] : o["oldValue"], newValue: props ? props["newValue"] : o["newValue"] };
|
|
99
|
+
}
|
|
100
|
+
function diffGroup(g) {
|
|
101
|
+
const o = g ?? {};
|
|
102
|
+
const arr = (k) => Array.isArray(o[k]) ? o[k].map(diffEntry) : [];
|
|
103
|
+
return { added: arr("added"), updated: arr("updated"), deleted: arr("deleted") };
|
|
104
|
+
}
|
|
91
105
|
function createMetadataClient(core) {
|
|
92
106
|
const { http } = core;
|
|
93
107
|
let fieldTypes = null;
|
|
@@ -97,7 +111,7 @@ function createMetadataClient(core) {
|
|
|
97
111
|
if (!ok) throwForError(error, res.status);
|
|
98
112
|
return value;
|
|
99
113
|
}
|
|
100
|
-
|
|
114
|
+
const client = {
|
|
101
115
|
async getEntity(nameOrId, version) {
|
|
102
116
|
const resp = await get(`appobject/${encodeURIComponent(nameOrId)}${q(version)}`);
|
|
103
117
|
return parseAppObject(resp);
|
|
@@ -121,8 +135,106 @@ function createMetadataClient(core) {
|
|
|
121
135
|
const path = typeof idOrName === "string" ? `query/${encodeURIComponent(idOrName)}${q(version)}` : `query?appObjectName=${encodeURIComponent(idOrName.appObjectName)}&queryName=${encodeURIComponent(idOrName.queryName)}${version ? `&version=${encodeURIComponent(version)}` : ""}`;
|
|
122
136
|
const r = await get(path);
|
|
123
137
|
return { queryId: String(r["queryId"] ?? ""), queryName: String(r["queryName"] ?? ""), appObjectId: String(r["appObjectId"] ?? ""), appObjectName: String(r["appObjectName"] ?? ""), configurations: jsonParse(r["configurations"]) };
|
|
138
|
+
},
|
|
139
|
+
async compareMetadata(opts) {
|
|
140
|
+
const p = new URLSearchParams();
|
|
141
|
+
if (opts?.sourceEnvId) p.set("sourceEnvironmentId", opts.sourceEnvId);
|
|
142
|
+
if (opts?.targetEnvId) p.set("targetEnvironmentId", opts.targetEnvId);
|
|
143
|
+
const qs = p.toString();
|
|
144
|
+
const r = await get(`release/diff/metadata${qs ? `?${qs}` : ""}`);
|
|
145
|
+
const md = r["metadataDiff"] ?? {};
|
|
146
|
+
return {
|
|
147
|
+
source: envInfo(r["sourceEnvironment"]),
|
|
148
|
+
target: envInfo(r["targetEnvironment"]),
|
|
149
|
+
appObjects: diffGroup(md["appObjects"]),
|
|
150
|
+
customScripts: diffGroup(md["customScripts"]),
|
|
151
|
+
screens: diffGroup(md["screens"])
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
async compareData(opts) {
|
|
155
|
+
const p = new URLSearchParams();
|
|
156
|
+
if (opts?.sourceEnvId) p.set("sourceEnvironmentId", opts.sourceEnvId);
|
|
157
|
+
if (opts?.targetEnvId) p.set("targetEnvironmentId", opts.targetEnvId);
|
|
158
|
+
const qs = p.toString();
|
|
159
|
+
const r = await get(`release/diff/data${qs ? `?${qs}` : ""}`);
|
|
160
|
+
const dd = r["dataDiff"] ?? {};
|
|
161
|
+
const tables = {};
|
|
162
|
+
for (const [name, raw] of Object.entries(dd)) {
|
|
163
|
+
const g = diffGroup(raw);
|
|
164
|
+
const s = raw["summary"] ?? {};
|
|
165
|
+
tables[name] = { ...g, summary: { added: Number(s["addedCount"] ?? 0), updated: Number(s["updatedCount"] ?? 0), deleted: Number(s["deletedCount"] ?? 0), totalChanges: Number(s["totalChanges"] ?? 0) } };
|
|
166
|
+
}
|
|
167
|
+
const sm = r["summary"] ?? {};
|
|
168
|
+
return {
|
|
169
|
+
source: envInfo(r["sourceEnvironment"]),
|
|
170
|
+
target: envInfo(r["targetEnvironment"]),
|
|
171
|
+
tables,
|
|
172
|
+
summary: { tablesCompared: Number(sm["tablesCompared"] ?? 0), tablesWithChanges: Number(sm["tablesWithChanges"] ?? 0), totalAdded: Number(sm["totalAdded"] ?? 0), totalUpdated: Number(sm["totalUpdated"] ?? 0), totalDeleted: Number(sm["totalDeleted"] ?? 0), totalChanges: Number(sm["totalChanges"] ?? 0) }
|
|
173
|
+
};
|
|
174
|
+
},
|
|
175
|
+
async applyRelease(input) {
|
|
176
|
+
const res = await http.request("metadata", "POST", "release/apply", { body: { releaseId: input.releaseId, sourceEnvId: input.sourceEnvId, targetEnvId: input.targetEnvId } });
|
|
177
|
+
const { ok, value, error } = unwrap(res.body);
|
|
178
|
+
if (!ok) throwForError(error, res.status);
|
|
179
|
+
const v = value ?? {};
|
|
180
|
+
const errs = Array.isArray(v["allErrors"]) ? v["allErrors"] : [];
|
|
181
|
+
return {
|
|
182
|
+
success: v["success"] === true,
|
|
183
|
+
totalApplied: Number(v["totalApplied"] ?? 0),
|
|
184
|
+
totalFailed: Number(v["totalFailed"] ?? 0),
|
|
185
|
+
totalSkipped: Number(v["totalSkipped"] ?? 0),
|
|
186
|
+
message: String(v["message"] ?? ""),
|
|
187
|
+
errors: errs.map((e) => ({ entityId: String(e["entityId"] ?? ""), entityType: String(e["entityType"] ?? ""), error: String(e["error"] ?? "") }))
|
|
188
|
+
};
|
|
189
|
+
},
|
|
190
|
+
async syncMetadata(full) {
|
|
191
|
+
const res = await http.request("metadata", "POST", `sync/metadata?full=${full ? "true" : "false"}`);
|
|
192
|
+
if (res.status >= 400) {
|
|
193
|
+
const { error } = unwrap(res.body);
|
|
194
|
+
throwForError(error, res.status);
|
|
195
|
+
}
|
|
196
|
+
const b2 = res.body ?? {};
|
|
197
|
+
return { message: String(b2["message"] ?? ""), correlationId: String(b2["correlationId"] ?? ""), isFullRebuild: b2["isFullRebuild"] === true };
|
|
198
|
+
},
|
|
199
|
+
subscribe(onChange, opts) {
|
|
200
|
+
const intervalMs = opts?.intervalMs ?? 3e4;
|
|
201
|
+
let marker = null;
|
|
202
|
+
let stopped = false;
|
|
203
|
+
const readMarker = async () => {
|
|
204
|
+
try {
|
|
205
|
+
const list = await client.listEntities();
|
|
206
|
+
return JSON.stringify(list.map((e) => e.appObjectId).sort());
|
|
207
|
+
} catch {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
const tick = async () => {
|
|
212
|
+
if (stopped) return;
|
|
213
|
+
const next = await readMarker();
|
|
214
|
+
if (stopped || next === null) return;
|
|
215
|
+
if (marker === null) {
|
|
216
|
+
marker = next;
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (next !== marker) {
|
|
220
|
+
marker = next;
|
|
221
|
+
try {
|
|
222
|
+
onChange();
|
|
223
|
+
} catch {
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const handle = setInterval(() => {
|
|
228
|
+
void tick();
|
|
229
|
+
}, intervalMs);
|
|
230
|
+
void tick();
|
|
231
|
+
return () => {
|
|
232
|
+
stopped = true;
|
|
233
|
+
clearInterval(handle);
|
|
234
|
+
};
|
|
124
235
|
}
|
|
125
236
|
};
|
|
237
|
+
return client;
|
|
126
238
|
}
|
|
127
239
|
export {
|
|
128
240
|
columnTypeFor,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/metadata.ts","../src/map.ts"],"sourcesContent":["import type { TafClientCore } from '@jigisha_ruparel/taf-client-core';\nimport { unwrap, throwForError } from '@jigisha_ruparel/taf-client-core';\nimport type { EntitySchema, EntitySummary, FieldTypeInfo, QueryDef, ScreenDef } from './types';\nimport { mapFieldTypes, parseAppObject } from './map';\n\nexport interface MetadataClient {\n getEntity(nameOrId: string, version?: string): Promise<EntitySchema>;\n listEntities(version?: string): Promise<EntitySummary[]>;\n getFieldTypes(): Promise<Map<number, FieldTypeInfo>>;\n getScreen(screenId: string): Promise<ScreenDef>;\n getQuery(idOrName: string | { appObjectName: string; queryName: string }, version?: string): Promise<QueryDef>;\n}\nconst q = (v?: string) => (v ? `?version=${encodeURIComponent(v)}` : '');\nfunction jsonParse(s: unknown): unknown { if (typeof s !== 'string') return s; try { return JSON.parse(s); } catch { return s; } }\n\nexport function createMetadataClient(core: TafClientCore): MetadataClient {\n const { http } = core;\n let fieldTypes: Map<number, FieldTypeInfo> | null = null;\n async function get<T>(path: string): Promise<T> {\n const res = await http.request<unknown>('metadata', 'GET', path);\n const { ok, value, error } = unwrap<T>(res.body);\n if (!ok) throwForError(error, res.status);\n return value as T;\n }\n return {\n async getEntity(nameOrId, version) {\n const resp = await get<{ appObjectId?: string; appObjectJson?: string }>(`appobject/${encodeURIComponent(nameOrId)}${q(version)}`);\n return parseAppObject(resp);\n },\n async listEntities(version) {\n const schema = await get<{ appObjects?: Record<string, unknown>[] }>(`metadata/schema${q(version)}`);\n return (schema.appObjects ?? []).map((a) => ({ appObjectId: String(a['appObjectId'] ?? ''), objectName: String(a['objectName'] ?? a['appObjectName'] ?? ''), displayName: String(a['displayName'] ?? a['objectName'] ?? '') }));\n },\n async getFieldTypes() {\n if (fieldTypes) return fieldTypes;\n const resp = await get<{ items?: Record<string, unknown>[] } | Record<string, unknown>[]>('metadata/field-types');\n const items = Array.isArray(resp) ? resp : (resp.items ?? []);\n fieldTypes = mapFieldTypes(items);\n return fieldTypes;\n },\n async getScreen(screenId) {\n const s = await get<Record<string, unknown>>(`screen/${encodeURIComponent(screenId)}`);\n return { screenId: String(s['screenId'] ?? screenId), screenName: String(s['screenName'] ?? ''), screenType: Number(s['screenType'] ?? 0), container: jsonParse(s['container']) };\n },\n async getQuery(idOrName, version) {\n const path = typeof idOrName === 'string'\n ? `query/${encodeURIComponent(idOrName)}${q(version)}`\n : `query?appObjectName=${encodeURIComponent(idOrName.appObjectName)}&queryName=${encodeURIComponent(idOrName.queryName)}${version ? `&version=${encodeURIComponent(version)}` : ''}`;\n const r = await get<Record<string, unknown>>(path);\n return { queryId: String(r['queryId'] ?? ''), queryName: String(r['queryName'] ?? ''), appObjectId: String(r['appObjectId'] ?? ''), appObjectName: String(r['appObjectName'] ?? ''), configurations: jsonParse(r['configurations']) };\n },\n };\n}\n","import type { ColumnType, EntitySchema, FieldSchema, FieldTypeInfo } from './types';\nexport function columnTypeFor(dataType: number, hasLookup: boolean): ColumnType {\n if (hasLookup) return 'lookup';\n switch (dataType) {\n case 1: return 'string';\n case 2: case 4: case 16: return 'number';\n case 3: return 'boolean';\n case 5: return 'date';\n case 6: return 'datetime';\n case 17: return 'lookup';\n default: return 'string';\n }\n}\nfunction dataTypeOf(ft: unknown): number {\n if (ft && typeof ft === 'object' && 'dataType' in (ft as Record<string, unknown>)) return Number((ft as { dataType: unknown }).dataType) || 0;\n return typeof ft === 'number' ? ft : 0;\n}\nfunction b(v: unknown): boolean { return v === true; }\nfunction mapField(fd: Record<string, unknown>): FieldSchema {\n const dataType = dataTypeOf(fd['fieldType']);\n const lud = fd['lookUpDetails'] as Record<string, unknown> | undefined;\n const lookup = lud ? { lookupObject: String(lud['lookupObject'] ?? ''), lookupField: String(lud['lookupField'] ?? 'Id'), displayField: String(lud['displayField'] ?? '') } : undefined;\n const cfg = fd['fieldConfiguration'] as Record<string, unknown> | undefined;\n return {\n fieldName: String(fd['fieldName'] ?? ''), displayName: String(fd['displayName'] ?? fd['fieldName'] ?? ''),\n dataType, columnType: columnTypeFor(dataType, !!lookup),\n isPrimaryKey: b(fd['isPrimaryKey']), isRequired: b(fd['isRequired']), isUnique: b(fd['isUnique']),\n isUpdatable: fd['isUpdatable'] !== false, isSearchable: b(fd['isSearchable']),\n isVisible: fd['isVisible'] !== false, isConfidential: b(fd['isConfidential']),\n isDeprecated: b(fd['isDeprecated']), isDisplayField: b(fd['isDisplayField']),\n lookup, config: cfg ? { defaultValue: cfg['defaultValue'], maxLength: cfg['maxLength'] as number|undefined, minValue: cfg['minValue'] as number|undefined, maxValue: cfg['maxValue'] as number|undefined, picklistValues: cfg['picklistValues'] as unknown[]|undefined, formatter: cfg['formatter'] as string|undefined } : undefined,\n };\n}\nexport function parseAppObject(resp: { appObjectId?: string; appObjectJson?: string }): EntitySchema {\n let ao: Record<string, unknown> = {};\n try { ao = resp.appObjectJson ? (JSON.parse(resp.appObjectJson) as Record<string, unknown>) : {}; } catch { ao = {}; }\n const fields = Array.isArray(ao['fields']) ? (ao['fields'] as Record<string, unknown>[]).map(mapField) : [];\n return {\n appObjectId: String(resp.appObjectId ?? ao['appObjectId'] ?? ''),\n objectName: String(ao['objectName'] ?? ''), displayName: String(ao['displayName'] ?? ao['objectName'] ?? ''),\n allowSoftDelete: b(ao['allowSoftDelete']), fields,\n };\n}\nexport function mapFieldTypes(items: Record<string, unknown>[]): Map<number, FieldTypeInfo> {\n const m = new Map<number, FieldTypeInfo>();\n for (const it of items ?? []) { const id = Number(it['id']); if (!Number.isNaN(id)) m.set(id, { id, name: String(it['name'] ?? ''), sqlType: String(it['canonicalSqlType'] ?? it['sqlType'] ?? '') }); }\n return m;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/metadata.ts","../src/map.ts"],"sourcesContent":["import type { TafClientCore } from '@jigisha_ruparel/taf-client-core';\nimport { unwrap, throwForError } from '@jigisha_ruparel/taf-client-core';\nimport type { EntitySchema, EntitySummary, FieldTypeInfo, QueryDef, ScreenDef, MetadataDiff, DataDiff, DiffGroup, DiffEntry, EnvInfo, TableDiff, ApplyReleaseInput, ApplyReleaseResult, SyncResult, CompareOptions, SubscribeOptions } from './types';\nimport { mapFieldTypes, parseAppObject } from './map';\n\nexport interface MetadataClient {\n getEntity(nameOrId: string, version?: string): Promise<EntitySchema>;\n listEntities(version?: string): Promise<EntitySummary[]>;\n getFieldTypes(): Promise<Map<number, FieldTypeInfo>>;\n getScreen(screenId: string): Promise<ScreenDef>;\n getQuery(idOrName: string | { appObjectName: string; queryName: string }, version?: string): Promise<QueryDef>;\n // v2: version / compare / apply / sync / subscribe\n compareMetadata(opts?: CompareOptions): Promise<MetadataDiff>;\n compareData(opts?: CompareOptions): Promise<DataDiff>;\n applyRelease(input: ApplyReleaseInput): Promise<ApplyReleaseResult>;\n syncMetadata(full?: boolean): Promise<SyncResult>;\n subscribe(onChange: () => void, opts?: SubscribeOptions): () => void;\n}\nconst q = (v?: string) => (v ? `?version=${encodeURIComponent(v)}` : '');\nfunction jsonParse(s: unknown): unknown { if (typeof s !== 'string') return s; try { return JSON.parse(s); } catch { return s; } }\n\n// ---- v2 diff mapping helpers (camelCase wire shapes, verified against the response DTOs) ---------\nfunction envInfo(e: unknown): EnvInfo {\n const o = (e ?? {}) as Record<string, unknown>;\n return { id: String(o['id'] ?? ''), name: String(o['name'] ?? ''), sequence: Number(o['sequence'] ?? 0), releaseVersion: (o['releaseVersion'] ?? undefined) as string | undefined, connectionId: (o['connectionId'] ?? undefined) as string | undefined };\n}\nfunction diffEntry(x: unknown): DiffEntry {\n const o = (x ?? {}) as Record<string, unknown>;\n // AppObject items carry oldValue/newValue under `properties`; entity/record items carry them at the top.\n const props = o['properties'] as Record<string, unknown> | undefined;\n return { id: String(o['id'] ?? ''), referenceName: String(o['referenceName'] ?? ''), oldValue: props ? props['oldValue'] : o['oldValue'], newValue: props ? props['newValue'] : o['newValue'] };\n}\nfunction diffGroup(g: unknown): DiffGroup {\n const o = (g ?? {}) as Record<string, unknown>;\n const arr = (k: string) => (Array.isArray(o[k]) ? (o[k] as unknown[]).map(diffEntry) : []);\n return { added: arr('added'), updated: arr('updated'), deleted: arr('deleted') };\n}\n\nexport function createMetadataClient(core: TafClientCore): MetadataClient {\n const { http } = core;\n let fieldTypes: Map<number, FieldTypeInfo> | null = null;\n async function get<T>(path: string): Promise<T> {\n const res = await http.request<unknown>('metadata', 'GET', path);\n const { ok, value, error } = unwrap<T>(res.body);\n if (!ok) throwForError(error, res.status);\n return value as T;\n }\n const client: MetadataClient = {\n async getEntity(nameOrId, version) {\n const resp = await get<{ appObjectId?: string; appObjectJson?: string }>(`appobject/${encodeURIComponent(nameOrId)}${q(version)}`);\n return parseAppObject(resp);\n },\n async listEntities(version) {\n const schema = await get<{ appObjects?: Record<string, unknown>[] }>(`metadata/schema${q(version)}`);\n return (schema.appObjects ?? []).map((a) => ({ appObjectId: String(a['appObjectId'] ?? ''), objectName: String(a['objectName'] ?? a['appObjectName'] ?? ''), displayName: String(a['displayName'] ?? a['objectName'] ?? '') }));\n },\n async getFieldTypes() {\n if (fieldTypes) return fieldTypes;\n const resp = await get<{ items?: Record<string, unknown>[] } | Record<string, unknown>[]>('metadata/field-types');\n const items = Array.isArray(resp) ? resp : (resp.items ?? []);\n fieldTypes = mapFieldTypes(items);\n return fieldTypes;\n },\n async getScreen(screenId) {\n const s = await get<Record<string, unknown>>(`screen/${encodeURIComponent(screenId)}`);\n return { screenId: String(s['screenId'] ?? screenId), screenName: String(s['screenName'] ?? ''), screenType: Number(s['screenType'] ?? 0), container: jsonParse(s['container']) };\n },\n async getQuery(idOrName, version) {\n const path = typeof idOrName === 'string'\n ? `query/${encodeURIComponent(idOrName)}${q(version)}`\n : `query?appObjectName=${encodeURIComponent(idOrName.appObjectName)}&queryName=${encodeURIComponent(idOrName.queryName)}${version ? `&version=${encodeURIComponent(version)}` : ''}`;\n const r = await get<Record<string, unknown>>(path);\n return { queryId: String(r['queryId'] ?? ''), queryName: String(r['queryName'] ?? ''), appObjectId: String(r['appObjectId'] ?? ''), appObjectName: String(r['appObjectName'] ?? ''), configurations: jsonParse(r['configurations']) };\n },\n\n async compareMetadata(opts) {\n const p = new URLSearchParams();\n if (opts?.sourceEnvId) p.set('sourceEnvironmentId', opts.sourceEnvId);\n if (opts?.targetEnvId) p.set('targetEnvironmentId', opts.targetEnvId);\n const qs = p.toString();\n const r = await get<Record<string, unknown>>(`release/diff/metadata${qs ? `?${qs}` : ''}`);\n const md = (r['metadataDiff'] ?? {}) as Record<string, unknown>;\n return {\n source: envInfo(r['sourceEnvironment']), target: envInfo(r['targetEnvironment']),\n appObjects: diffGroup(md['appObjects']), customScripts: diffGroup(md['customScripts']), screens: diffGroup(md['screens']),\n };\n },\n async compareData(opts) {\n const p = new URLSearchParams();\n if (opts?.sourceEnvId) p.set('sourceEnvironmentId', opts.sourceEnvId);\n if (opts?.targetEnvId) p.set('targetEnvironmentId', opts.targetEnvId);\n const qs = p.toString();\n const r = await get<Record<string, unknown>>(`release/diff/data${qs ? `?${qs}` : ''}`);\n const dd = (r['dataDiff'] ?? {}) as Record<string, unknown>;\n const tables: Record<string, TableDiff> = {};\n for (const [name, raw] of Object.entries(dd)) {\n const g = diffGroup(raw);\n const s = ((raw as Record<string, unknown>)['summary'] ?? {}) as Record<string, unknown>;\n tables[name] = { ...g, summary: { added: Number(s['addedCount'] ?? 0), updated: Number(s['updatedCount'] ?? 0), deleted: Number(s['deletedCount'] ?? 0), totalChanges: Number(s['totalChanges'] ?? 0) } };\n }\n const sm = (r['summary'] ?? {}) as Record<string, unknown>;\n return {\n source: envInfo(r['sourceEnvironment']), target: envInfo(r['targetEnvironment']), tables,\n summary: { tablesCompared: Number(sm['tablesCompared'] ?? 0), tablesWithChanges: Number(sm['tablesWithChanges'] ?? 0), totalAdded: Number(sm['totalAdded'] ?? 0), totalUpdated: Number(sm['totalUpdated'] ?? 0), totalDeleted: Number(sm['totalDeleted'] ?? 0), totalChanges: Number(sm['totalChanges'] ?? 0) },\n };\n },\n async applyRelease(input) {\n const res = await http.request<unknown>('metadata', 'POST', 'release/apply', { body: { releaseId: input.releaseId, sourceEnvId: input.sourceEnvId, targetEnvId: input.targetEnvId } });\n const { ok, value, error } = unwrap<Record<string, unknown>>(res.body);\n if (!ok) throwForError(error, res.status);\n const v = value ?? {};\n const errs = Array.isArray(v['allErrors']) ? (v['allErrors'] as Record<string, unknown>[]) : [];\n return {\n success: v['success'] === true, totalApplied: Number(v['totalApplied'] ?? 0), totalFailed: Number(v['totalFailed'] ?? 0), totalSkipped: Number(v['totalSkipped'] ?? 0),\n message: String(v['message'] ?? ''), errors: errs.map((e) => ({ entityId: String(e['entityId'] ?? ''), entityType: String(e['entityType'] ?? ''), error: String(e['error'] ?? '') })),\n };\n },\n async syncMetadata(full) {\n const res = await http.request<Record<string, unknown>>('metadata', 'POST', `sync/metadata?full=${full ? 'true' : 'false'}`);\n // http.request does NOT throw on non-2xx — surface a failure rather than returning an empty body.\n if (res.status >= 400) { const { error } = unwrap<unknown>(res.body); throwForError(error, res.status); }\n const b = (res.body ?? {}) as Record<string, unknown>; // RAW 202 body — not an OperationResult\n return { message: String(b['message'] ?? ''), correlationId: String(b['correlationId'] ?? ''), isFullRebuild: b['isFullRebuild'] === true };\n },\n subscribe(onChange, opts) {\n const intervalMs = opts?.intervalMs ?? 30000;\n let marker: string | null = null;\n let stopped = false;\n // A failed poll yields null → it never establishes a baseline or fires onChange (no spurious signal).\n const readMarker = async (): Promise<string | null> => {\n try { const list = await client.listEntities(); return JSON.stringify(list.map((e) => e.appObjectId).sort()); }\n catch { return null; }\n };\n const tick = async () => {\n if (stopped) return;\n const next = await readMarker();\n if (stopped || next === null) return; // re-check stopped after the await; skip failed polls\n if (marker === null) { marker = next; return; } // first successful read establishes the baseline only\n if (next !== marker) { marker = next; try { onChange(); } catch { /* consumer callback error is not ours to handle */ } }\n };\n const handle = setInterval(() => { void tick(); }, intervalMs);\n void tick(); // establish the baseline immediately\n return () => { stopped = true; clearInterval(handle); };\n },\n };\n return client;\n}\n","import type { ColumnType, EntitySchema, FieldSchema, FieldTypeInfo } from './types';\nexport function columnTypeFor(dataType: number, hasLookup: boolean): ColumnType {\n if (hasLookup) return 'lookup';\n switch (dataType) {\n case 1: return 'string';\n case 2: case 4: case 16: return 'number';\n case 3: return 'boolean';\n case 5: return 'date';\n case 6: return 'datetime';\n case 17: return 'lookup';\n default: return 'string';\n }\n}\nfunction dataTypeOf(ft: unknown): number {\n if (ft && typeof ft === 'object' && 'dataType' in (ft as Record<string, unknown>)) return Number((ft as { dataType: unknown }).dataType) || 0;\n return typeof ft === 'number' ? ft : 0;\n}\nfunction b(v: unknown): boolean { return v === true; }\nfunction mapField(fd: Record<string, unknown>): FieldSchema {\n const dataType = dataTypeOf(fd['fieldType']);\n const lud = fd['lookUpDetails'] as Record<string, unknown> | undefined;\n const lookup = lud ? { lookupObject: String(lud['lookupObject'] ?? ''), lookupField: String(lud['lookupField'] ?? 'Id'), displayField: String(lud['displayField'] ?? '') } : undefined;\n const cfg = fd['fieldConfiguration'] as Record<string, unknown> | undefined;\n return {\n fieldName: String(fd['fieldName'] ?? ''), displayName: String(fd['displayName'] ?? fd['fieldName'] ?? ''),\n dataType, columnType: columnTypeFor(dataType, !!lookup),\n isPrimaryKey: b(fd['isPrimaryKey']), isRequired: b(fd['isRequired']), isUnique: b(fd['isUnique']),\n isUpdatable: fd['isUpdatable'] !== false, isSearchable: b(fd['isSearchable']),\n isVisible: fd['isVisible'] !== false, isConfidential: b(fd['isConfidential']),\n isDeprecated: b(fd['isDeprecated']), isDisplayField: b(fd['isDisplayField']),\n lookup, config: cfg ? { defaultValue: cfg['defaultValue'], maxLength: cfg['maxLength'] as number|undefined, minValue: cfg['minValue'] as number|undefined, maxValue: cfg['maxValue'] as number|undefined, picklistValues: cfg['picklistValues'] as unknown[]|undefined, formatter: cfg['formatter'] as string|undefined } : undefined,\n };\n}\nexport function parseAppObject(resp: { appObjectId?: string; appObjectJson?: string }): EntitySchema {\n let ao: Record<string, unknown> = {};\n try { ao = resp.appObjectJson ? (JSON.parse(resp.appObjectJson) as Record<string, unknown>) : {}; } catch { ao = {}; }\n const fields = Array.isArray(ao['fields']) ? (ao['fields'] as Record<string, unknown>[]).map(mapField) : [];\n return {\n appObjectId: String(resp.appObjectId ?? ao['appObjectId'] ?? ''),\n objectName: String(ao['objectName'] ?? ''), displayName: String(ao['displayName'] ?? ao['objectName'] ?? ''),\n allowSoftDelete: b(ao['allowSoftDelete']), fields,\n };\n}\nexport function mapFieldTypes(items: Record<string, unknown>[]): Map<number, FieldTypeInfo> {\n const m = new Map<number, FieldTypeInfo>();\n for (const it of items ?? []) { const id = Number(it['id']); if (!Number.isNaN(id)) m.set(id, { id, name: String(it['name'] ?? ''), sqlType: String(it['canonicalSqlType'] ?? it['sqlType'] ?? '') }); }\n return m;\n}\n"],"mappings":"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","names":["b"]}
|