@platform-mesh/portal-ui-lib 0.60.0 → 0.61.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.
|
@@ -266,6 +266,56 @@ function stripTypename(value) {
|
|
|
266
266
|
return value;
|
|
267
267
|
}
|
|
268
268
|
|
|
269
|
+
function deletePropertyByPath(object, path) {
|
|
270
|
+
const segments = path.split('.').filter(Boolean);
|
|
271
|
+
if (segments.length === 0) {
|
|
272
|
+
return object;
|
|
273
|
+
}
|
|
274
|
+
let current = object;
|
|
275
|
+
for (let i = 0; i < segments.length - 1; i += 1) {
|
|
276
|
+
const key = segments[i];
|
|
277
|
+
const next = current[key];
|
|
278
|
+
if (next == null || typeof next !== 'object') {
|
|
279
|
+
return object;
|
|
280
|
+
}
|
|
281
|
+
current = next;
|
|
282
|
+
}
|
|
283
|
+
delete current[segments[segments.length - 1]];
|
|
284
|
+
return object;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** Drops write-only fields whose value is empty so updates leave them unchanged. */
|
|
288
|
+
function omitEmptyWriteOnlyFields(resource, fields) {
|
|
289
|
+
const result = structuredClone(resource);
|
|
290
|
+
for (const field of flattenFieldTree(fields)) {
|
|
291
|
+
if (!field.writeOnly || typeof field.property !== 'string') {
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
const value = getValueByPath(result, field.property);
|
|
295
|
+
if (value === '' || value == null) {
|
|
296
|
+
deletePropertyByPath(result, field.property);
|
|
297
|
+
pruneEmptyParents(result, field.property);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return result;
|
|
301
|
+
}
|
|
302
|
+
function pruneEmptyParents(object, path) {
|
|
303
|
+
const segments = path.split('.').filter(Boolean);
|
|
304
|
+
for (let i = segments.length - 1; i > 0; i -= 1) {
|
|
305
|
+
const parentPath = segments.slice(0, i).join('.');
|
|
306
|
+
const parent = getValueByPath(object, parentPath);
|
|
307
|
+
if (parent &&
|
|
308
|
+
typeof parent === 'object' &&
|
|
309
|
+
!Array.isArray(parent) &&
|
|
310
|
+
Object.keys(parent).length === 0) {
|
|
311
|
+
deletePropertyByPath(object, parentPath);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
269
319
|
function setPropertyByPath(object, path, value) {
|
|
270
320
|
const segments = path.split('.').filter(Boolean);
|
|
271
321
|
if (segments.length === 0) {
|
|
@@ -293,5 +343,5 @@ function setPropertyByPath(object, path, value) {
|
|
|
293
343
|
* Generated bundle index. Do not edit.
|
|
294
344
|
*/
|
|
295
345
|
|
|
296
|
-
export { buildGraphQLInputTypeName, buildResourcePath, decodeBase64, encodeBase64, flattenFieldTree, generateGraphQLFields, generateGraphQLReadFields, getResourceValueByJsonPath, getValueByPath, isLocalSetup, isNamespacedResource, mergeListWithSubscriptionResult, parseRawGqlQueryToFields, permissionKey, resourceActionAllowed, setPropertyByPath, stripTypename };
|
|
346
|
+
export { buildGraphQLInputTypeName, buildResourcePath, decodeBase64, deletePropertyByPath, encodeBase64, flattenFieldTree, generateGraphQLFields, generateGraphQLReadFields, getResourceValueByJsonPath, getValueByPath, isLocalSetup, isNamespacedResource, mergeListWithSubscriptionResult, omitEmptyWriteOnlyFields, parseRawGqlQueryToFields, permissionKey, resourceActionAllowed, setPropertyByPath, stripTypename };
|
|
297
347
|
//# sourceMappingURL=platform-mesh-portal-ui-lib-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-mesh-portal-ui-lib-utils.mjs","sources":["../../projects/lib/utils/utils/build-graphql-input-type-name.ts","../../projects/lib/utils/utils/build-resource-list-operation.ts","../../projects/lib/utils/utils/flatten-field-tree.ts","../../projects/lib/utils/utils/columns-to-gql-fields.ts","../../projects/lib/utils/utils/resource-field-by-path.ts","../../projects/lib/utils/utils/get-value-by-path.ts","../../projects/lib/utils/utils/instance-permission-key.ts","../../projects/lib/utils/utils/is-local-setup.ts","../../projects/lib/utils/utils/is-namespaced-resource.ts","../../projects/lib/utils/utils/merge-list-with-subscription-result.ts","../../projects/lib/utils/utils/parse-raw-gql-query.ts","../../projects/lib/utils/utils/resource-action-allowed.ts","../../projects/lib/utils/utils/resource-sanitizer.ts","../../projects/lib/utils/utils/set-property-by-path.ts","../../projects/lib/utils/platform-mesh-portal-ui-lib-utils.ts"],"sourcesContent":["function sanitizeGroup(group: string): string {\n let sanitized = group.replace(/[^a-zA-Z0-9]/g, '_');\n if (/^[0-9]/.test(sanitized)) {\n sanitized = '_' + sanitized;\n }\n return sanitized;\n}\n\nfunction pascalize(snakeCase: string): string {\n return snakeCase\n .split('_')\n .filter((segment) => segment.length > 0)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join('');\n}\n\nexport function buildGraphQLInputTypeName(\n apiGroup: string | undefined,\n version: string | undefined,\n entity: string,\n): string {\n let prefix: string;\n\n if (apiGroup && version) {\n prefix = pascalize(sanitizeGroup(apiGroup) + '_' + version);\n } else if (apiGroup) {\n prefix = pascalize(sanitizeGroup(apiGroup));\n } else if (version) {\n prefix = pascalize('_' + version);\n } else {\n return `${entity}_Input`;\n }\n\n return `${prefix}${entity}_Input`;\n}\n","export function buildResourcePath(\n input: {\n apiGroup?: string | undefined;\n entity: string;\n version?: string | undefined;\n },\n separator: string = '_',\n): string {\n return [input.apiGroup, input.version, input.entity]\n .filter((p): p is string => !!p)\n .join(separator);\n}\n","import { PlatformMeshFieldDefinition } from '@platform-mesh/portal-ui-lib/models';\n\n/** Flattens nested `propertyCollection` trees into a list of leaf field definitions. */\nexport function flattenFieldTree(\n fields: readonly PlatformMeshFieldDefinition[] | undefined,\n): PlatformMeshFieldDefinition[] {\n const result: PlatformMeshFieldDefinition[] = [];\n for (const field of fields ?? []) {\n if (field.propertyCollection?.length) {\n result.push(...flattenFieldTree(field.propertyCollection));\n continue;\n }\n result.push(field);\n }\n return result;\n}\n","import { flattenFieldTree } from './flatten-field-tree';\nimport { PlatformMeshFieldDefinition } from '@platform-mesh/portal-ui-lib/models';\n\nexport type GenerateGraphQLFieldsOptions = {\n /** Omit fields marked writeOnly (for queries/mutation return selections). */\n forRead?: boolean;\n};\n\n/** Builds GraphQL field selections for reads, omitting write-only secrets. */\nexport const generateGraphQLReadFields = (\n uiFields: readonly PlatformMeshFieldDefinition[],\n): any[] => generateGraphQLFields(uiFields, { forRead: true });\n\nexport const generateGraphQLFields = (\n uiFields: readonly PlatformMeshFieldDefinition[],\n options: GenerateGraphQLFieldsOptions = {},\n): any[] => {\n const graphQLFields: any[] = [];\n const flattened = flattenFieldTree(uiFields);\n const fields = options.forRead\n ? flattened.filter((field) => !field.writeOnly)\n : flattened;\n fields.map((field) => {\n if (field.property instanceof Array) {\n field.property.map((property) => generate(property, graphQLFields));\n } else {\n generate(field.property, graphQLFields);\n }\n });\n return graphQLFields;\n};\n\nconst generate = (root: string | undefined, fields: any = []) => {\n if (!root) {\n return [];\n }\n\n const paths = root.split('.');\n\n for (const part of paths) {\n if (paths.length === 1) {\n fields.push(part);\n return fields;\n }\n\n fields.push({\n [part]: [...generate(paths.splice(1).join('.'))],\n });\n\n return fields;\n }\n};\n","import {\n PropertyField,\n TransformType,\n} from '@platform-mesh/portal-ui-lib/models';\nimport { JSONPath } from 'jsonpath-plus';\n\nexport const getResourceValueByJsonPath = <T>(\n resource: T,\n field: {\n jsonPathExpression?: string;\n property?: string | string[];\n propertyField?: PropertyField;\n },\n) => {\n const property = field.jsonPathExpression || field.property;\n if (!property) {\n return undefined;\n }\n\n if (property instanceof Array) {\n console.error(\n `Property defined as an array: ${JSON.stringify(property)}, provide \"jsonPathExpression\" field to properly ready resource value`,\n );\n return undefined;\n }\n\n const prefix = property.startsWith('$.') ? '' : '$.';\n const queryResult = JSONPath({\n path: `${prefix}${property}`,\n json: resource as object,\n });\n const value = queryResult.length ? queryResult[0] : undefined;\n\n if (value && field.propertyField) {\n return executeTransform(\n value[field.propertyField.key],\n field.propertyField.transform,\n );\n }\n\n return value;\n};\n\nconst executeTransform = (\n value: string | undefined,\n transform: TransformType[] | undefined,\n): string | undefined => {\n if (value == null || transform == null || !transform.length) return value;\n\n return transform.reduce((acc, t) => {\n if (acc == null) return acc;\n\n switch (t) {\n case 'uppercase':\n return acc.toUpperCase();\n case 'lowercase':\n return acc.toLowerCase();\n case 'capitalize': {\n const str = String(acc);\n return str.length ? str.charAt(0).toUpperCase() + str.slice(1) : str;\n }\n case 'decode': {\n try {\n return decodeBase64(acc);\n } catch {\n return acc;\n }\n }\n case 'encode': {\n try {\n return encodeBase64(acc);\n } catch {\n return acc;\n }\n }\n default:\n return acc;\n }\n }, value);\n};\n\nexport const encodeBase64 = (str: string): string => {\n try {\n const utf8Bytes = new TextEncoder().encode(str);\n const binaryString = Array.from(utf8Bytes, (byte) =>\n String.fromCharCode(byte),\n ).join('');\n return btoa(binaryString);\n } catch (error) {\n console.error('Base64 encoding failed:', error);\n throw new Error('Failed to encode string to Base64');\n }\n};\n\nexport const decodeBase64 = (base64: string): string => {\n try {\n const binaryString = atob(base64);\n const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));\n return new TextDecoder().decode(bytes);\n } catch (error) {\n console.error('Base64 decoding failed:', error);\n throw new Error('Failed to decode Base64 string');\n }\n};\n","import { getResourceValueByJsonPath } from './resource-field-by-path';\nimport { Resource } from '@platform-mesh/portal-ui-lib/models';\n\nexport const getValueByPath = <T extends object, R = unknown>(\n obj: T,\n path: string,\n): R | undefined => {\n return getResourceValueByJsonPath(obj as Resource, {\n jsonPathExpression: path,\n });\n};\n","import { InstancePermission } from '@platform-mesh/portal-ui-lib/models';\n\nexport const permissionKey = (\n instance: Partial<Omit<InstancePermission, 'actions'>>,\n): string =>\n [instance.resource, instance.namespace, instance.name]\n .filter(Boolean)\n .join('/');\n","export const isLocalSetup = () => {\n return (\n window.location.hostname.includes('localhost') ||\n window.location.hostname.includes('portal.dev.local')\n );\n};\n","import { NodeContext } from '@openmfp/portal-ui-lib';\n\nexport function isNamespacedResource(nodeContext: Partial<NodeContext>) {\n return nodeContext?.resourceDefinition?.scope === 'Namespaced';\n}\n","import {\n Resource,\n ResourceOperationTypeMap,\n ResourceSubscriptionResult,\n} from '@platform-mesh/portal-ui-lib/models';\n\nexport interface MergeListWithSubscriptionResultOptions<T> {\n getItemKey: (item: T) => string | undefined;\n mapSubscriptionObjectToItem: (object: Resource) => T;\n}\n\nexport function mergeListWithSubscriptionResult<T>(\n items: T[],\n subscriptionResult: ResourceSubscriptionResult | undefined,\n options: MergeListWithSubscriptionResultOptions<T>,\n): T[] {\n if (!subscriptionResult) {\n return items;\n }\n\n const { getItemKey, mapSubscriptionObjectToItem } = options;\n\n const result = new Map<string, T>();\n items.forEach((item) => {\n const key = getItemKey(item);\n if (!key) {\n return;\n }\n result.set(key, item);\n });\n\n const { type, object } = subscriptionResult;\n const mappedObject = mapSubscriptionObjectToItem(object);\n const objectKey = getItemKey(mappedObject);\n if (!objectKey) {\n return items;\n }\n\n if (type === ResourceOperationTypeMap.ADDED) {\n result.set(objectKey, mappedObject);\n } else if (type === ResourceOperationTypeMap.MODIFIED) {\n if (result.has(objectKey)) {\n result.set(objectKey, mappedObject);\n }\n } else if (type === ResourceOperationTypeMap.DELETED) {\n result.delete(objectKey);\n }\n\n return [...result.values()];\n}\n","export const parseRawGqlQueryToFields = (s: string): any[] => {\n const tokens = s.replace(/[{}]/g, ' $& ').trim().split(/\\s+/);\n const root: any[] = [];\n const stack: any[][] = [root];\n\n for (let i = 0; i < tokens.length; i++) {\n const v = tokens[i];\n\n if (v === '{') continue;\n if (v === '}') {\n stack.pop();\n continue;\n }\n\n if (tokens[i + 1] === '{') {\n const node = { [v]: [] };\n stack.at(-1)?.push(node);\n stack.push(node[v]);\n } else {\n stack.at(-1)?.push(v);\n }\n }\n\n return root;\n};\n","/**\n * Tier-1 resource-level permission check (fail-open).\n *\n * Returns true when the verb is granted for the resource, OR when no\n * permissions were fetched for the resource at all (no entry in\n * portalPermissions → we don't gate). Returns false ONLY when permissions\n * WERE fetched for the resource and the verb is absent.\n */\nexport const resourceActionAllowed = (\n portalPermissions: { [key: string]: string[] } | undefined,\n resource: string | undefined,\n verb: string,\n): boolean => portalPermissions?.[resource ?? '']?.includes(verb) ?? true;\n","export function stripTypename<T>(value: T): T {\n if (Array.isArray(value)) {\n return (value as unknown as any[]).map((v) => stripTypename(v)) as T;\n }\n if (value && typeof value === 'object') {\n const { __typename, ...rest } = value as Record<string, unknown> & {\n __typename?: string;\n };\n for (const k of Object.keys(rest)) {\n // @ts-ignore - rest is an indexable object\n rest[k] = stripTypename((rest as any)[k]);\n }\n return rest as T;\n }\n return value;\n}\n","export function setPropertyByPath<T extends Record<string, any>>(\n object: T,\n path: string,\n value: unknown,\n): T {\n const segments = path.split('.').filter(Boolean);\n if (segments.length === 0) {\n return object;\n }\n\n let current: Record<string, any> = object;\n\n for (let i = 0; i < segments.length; i += 1) {\n const key = segments[i];\n if (i === segments.length - 1) {\n current[key] = value;\n break;\n }\n\n const existing = current[key];\n\n if (\n existing === undefined ||\n existing === null ||\n typeof existing !== 'object'\n ) {\n current[key] = {};\n }\n\n current = current[key];\n }\n\n return object;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-mesh-portal-ui-lib-utils.mjs","sources":["../../projects/lib/utils/utils/build-graphql-input-type-name.ts","../../projects/lib/utils/utils/build-resource-list-operation.ts","../../projects/lib/utils/utils/flatten-field-tree.ts","../../projects/lib/utils/utils/columns-to-gql-fields.ts","../../projects/lib/utils/utils/resource-field-by-path.ts","../../projects/lib/utils/utils/get-value-by-path.ts","../../projects/lib/utils/utils/instance-permission-key.ts","../../projects/lib/utils/utils/is-local-setup.ts","../../projects/lib/utils/utils/is-namespaced-resource.ts","../../projects/lib/utils/utils/merge-list-with-subscription-result.ts","../../projects/lib/utils/utils/parse-raw-gql-query.ts","../../projects/lib/utils/utils/resource-action-allowed.ts","../../projects/lib/utils/utils/resource-sanitizer.ts","../../projects/lib/utils/utils/delete-property-by-path.ts","../../projects/lib/utils/utils/omit-empty-write-only-fields.ts","../../projects/lib/utils/utils/set-property-by-path.ts","../../projects/lib/utils/platform-mesh-portal-ui-lib-utils.ts"],"sourcesContent":["function sanitizeGroup(group: string): string {\n let sanitized = group.replace(/[^a-zA-Z0-9]/g, '_');\n if (/^[0-9]/.test(sanitized)) {\n sanitized = '_' + sanitized;\n }\n return sanitized;\n}\n\nfunction pascalize(snakeCase: string): string {\n return snakeCase\n .split('_')\n .filter((segment) => segment.length > 0)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join('');\n}\n\nexport function buildGraphQLInputTypeName(\n apiGroup: string | undefined,\n version: string | undefined,\n entity: string,\n): string {\n let prefix: string;\n\n if (apiGroup && version) {\n prefix = pascalize(sanitizeGroup(apiGroup) + '_' + version);\n } else if (apiGroup) {\n prefix = pascalize(sanitizeGroup(apiGroup));\n } else if (version) {\n prefix = pascalize('_' + version);\n } else {\n return `${entity}_Input`;\n }\n\n return `${prefix}${entity}_Input`;\n}\n","export function buildResourcePath(\n input: {\n apiGroup?: string | undefined;\n entity: string;\n version?: string | undefined;\n },\n separator: string = '_',\n): string {\n return [input.apiGroup, input.version, input.entity]\n .filter((p): p is string => !!p)\n .join(separator);\n}\n","import { PlatformMeshFieldDefinition } from '@platform-mesh/portal-ui-lib/models';\n\n/** Flattens nested `propertyCollection` trees into a list of leaf field definitions. */\nexport function flattenFieldTree(\n fields: readonly PlatformMeshFieldDefinition[] | undefined,\n): PlatformMeshFieldDefinition[] {\n const result: PlatformMeshFieldDefinition[] = [];\n for (const field of fields ?? []) {\n if (field.propertyCollection?.length) {\n result.push(...flattenFieldTree(field.propertyCollection));\n continue;\n }\n result.push(field);\n }\n return result;\n}\n","import { flattenFieldTree } from './flatten-field-tree';\nimport { PlatformMeshFieldDefinition } from '@platform-mesh/portal-ui-lib/models';\n\nexport type GenerateGraphQLFieldsOptions = {\n /** Omit fields marked writeOnly (for queries/mutation return selections). */\n forRead?: boolean;\n};\n\n/** Builds GraphQL field selections for reads, omitting write-only secrets. */\nexport const generateGraphQLReadFields = (\n uiFields: readonly PlatformMeshFieldDefinition[],\n): any[] => generateGraphQLFields(uiFields, { forRead: true });\n\nexport const generateGraphQLFields = (\n uiFields: readonly PlatformMeshFieldDefinition[],\n options: GenerateGraphQLFieldsOptions = {},\n): any[] => {\n const graphQLFields: any[] = [];\n const flattened = flattenFieldTree(uiFields);\n const fields = options.forRead\n ? flattened.filter((field) => !field.writeOnly)\n : flattened;\n fields.map((field) => {\n if (field.property instanceof Array) {\n field.property.map((property) => generate(property, graphQLFields));\n } else {\n generate(field.property, graphQLFields);\n }\n });\n return graphQLFields;\n};\n\nconst generate = (root: string | undefined, fields: any = []) => {\n if (!root) {\n return [];\n }\n\n const paths = root.split('.');\n\n for (const part of paths) {\n if (paths.length === 1) {\n fields.push(part);\n return fields;\n }\n\n fields.push({\n [part]: [...generate(paths.splice(1).join('.'))],\n });\n\n return fields;\n }\n};\n","import {\n PropertyField,\n TransformType,\n} from '@platform-mesh/portal-ui-lib/models';\nimport { JSONPath } from 'jsonpath-plus';\n\nexport const getResourceValueByJsonPath = <T>(\n resource: T,\n field: {\n jsonPathExpression?: string;\n property?: string | string[];\n propertyField?: PropertyField;\n },\n) => {\n const property = field.jsonPathExpression || field.property;\n if (!property) {\n return undefined;\n }\n\n if (property instanceof Array) {\n console.error(\n `Property defined as an array: ${JSON.stringify(property)}, provide \"jsonPathExpression\" field to properly ready resource value`,\n );\n return undefined;\n }\n\n const prefix = property.startsWith('$.') ? '' : '$.';\n const queryResult = JSONPath({\n path: `${prefix}${property}`,\n json: resource as object,\n });\n const value = queryResult.length ? queryResult[0] : undefined;\n\n if (value && field.propertyField) {\n return executeTransform(\n value[field.propertyField.key],\n field.propertyField.transform,\n );\n }\n\n return value;\n};\n\nconst executeTransform = (\n value: string | undefined,\n transform: TransformType[] | undefined,\n): string | undefined => {\n if (value == null || transform == null || !transform.length) return value;\n\n return transform.reduce((acc, t) => {\n if (acc == null) return acc;\n\n switch (t) {\n case 'uppercase':\n return acc.toUpperCase();\n case 'lowercase':\n return acc.toLowerCase();\n case 'capitalize': {\n const str = String(acc);\n return str.length ? str.charAt(0).toUpperCase() + str.slice(1) : str;\n }\n case 'decode': {\n try {\n return decodeBase64(acc);\n } catch {\n return acc;\n }\n }\n case 'encode': {\n try {\n return encodeBase64(acc);\n } catch {\n return acc;\n }\n }\n default:\n return acc;\n }\n }, value);\n};\n\nexport const encodeBase64 = (str: string): string => {\n try {\n const utf8Bytes = new TextEncoder().encode(str);\n const binaryString = Array.from(utf8Bytes, (byte) =>\n String.fromCharCode(byte),\n ).join('');\n return btoa(binaryString);\n } catch (error) {\n console.error('Base64 encoding failed:', error);\n throw new Error('Failed to encode string to Base64');\n }\n};\n\nexport const decodeBase64 = (base64: string): string => {\n try {\n const binaryString = atob(base64);\n const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));\n return new TextDecoder().decode(bytes);\n } catch (error) {\n console.error('Base64 decoding failed:', error);\n throw new Error('Failed to decode Base64 string');\n }\n};\n","import { getResourceValueByJsonPath } from './resource-field-by-path';\nimport { Resource } from '@platform-mesh/portal-ui-lib/models';\n\nexport const getValueByPath = <T extends object, R = unknown>(\n obj: T,\n path: string,\n): R | undefined => {\n return getResourceValueByJsonPath(obj as Resource, {\n jsonPathExpression: path,\n });\n};\n","import { InstancePermission } from '@platform-mesh/portal-ui-lib/models';\n\nexport const permissionKey = (\n instance: Partial<Omit<InstancePermission, 'actions'>>,\n): string =>\n [instance.resource, instance.namespace, instance.name]\n .filter(Boolean)\n .join('/');\n","export const isLocalSetup = () => {\n return (\n window.location.hostname.includes('localhost') ||\n window.location.hostname.includes('portal.dev.local')\n );\n};\n","import { NodeContext } from '@openmfp/portal-ui-lib';\n\nexport function isNamespacedResource(nodeContext: Partial<NodeContext>) {\n return nodeContext?.resourceDefinition?.scope === 'Namespaced';\n}\n","import {\n Resource,\n ResourceOperationTypeMap,\n ResourceSubscriptionResult,\n} from '@platform-mesh/portal-ui-lib/models';\n\nexport interface MergeListWithSubscriptionResultOptions<T> {\n getItemKey: (item: T) => string | undefined;\n mapSubscriptionObjectToItem: (object: Resource) => T;\n}\n\nexport function mergeListWithSubscriptionResult<T>(\n items: T[],\n subscriptionResult: ResourceSubscriptionResult | undefined,\n options: MergeListWithSubscriptionResultOptions<T>,\n): T[] {\n if (!subscriptionResult) {\n return items;\n }\n\n const { getItemKey, mapSubscriptionObjectToItem } = options;\n\n const result = new Map<string, T>();\n items.forEach((item) => {\n const key = getItemKey(item);\n if (!key) {\n return;\n }\n result.set(key, item);\n });\n\n const { type, object } = subscriptionResult;\n const mappedObject = mapSubscriptionObjectToItem(object);\n const objectKey = getItemKey(mappedObject);\n if (!objectKey) {\n return items;\n }\n\n if (type === ResourceOperationTypeMap.ADDED) {\n result.set(objectKey, mappedObject);\n } else if (type === ResourceOperationTypeMap.MODIFIED) {\n if (result.has(objectKey)) {\n result.set(objectKey, mappedObject);\n }\n } else if (type === ResourceOperationTypeMap.DELETED) {\n result.delete(objectKey);\n }\n\n return [...result.values()];\n}\n","export const parseRawGqlQueryToFields = (s: string): any[] => {\n const tokens = s.replace(/[{}]/g, ' $& ').trim().split(/\\s+/);\n const root: any[] = [];\n const stack: any[][] = [root];\n\n for (let i = 0; i < tokens.length; i++) {\n const v = tokens[i];\n\n if (v === '{') continue;\n if (v === '}') {\n stack.pop();\n continue;\n }\n\n if (tokens[i + 1] === '{') {\n const node = { [v]: [] };\n stack.at(-1)?.push(node);\n stack.push(node[v]);\n } else {\n stack.at(-1)?.push(v);\n }\n }\n\n return root;\n};\n","/**\n * Tier-1 resource-level permission check (fail-open).\n *\n * Returns true when the verb is granted for the resource, OR when no\n * permissions were fetched for the resource at all (no entry in\n * portalPermissions → we don't gate). Returns false ONLY when permissions\n * WERE fetched for the resource and the verb is absent.\n */\nexport const resourceActionAllowed = (\n portalPermissions: { [key: string]: string[] } | undefined,\n resource: string | undefined,\n verb: string,\n): boolean => portalPermissions?.[resource ?? '']?.includes(verb) ?? true;\n","export function stripTypename<T>(value: T): T {\n if (Array.isArray(value)) {\n return (value as unknown as any[]).map((v) => stripTypename(v)) as T;\n }\n if (value && typeof value === 'object') {\n const { __typename, ...rest } = value as Record<string, unknown> & {\n __typename?: string;\n };\n for (const k of Object.keys(rest)) {\n // @ts-ignore - rest is an indexable object\n rest[k] = stripTypename((rest as any)[k]);\n }\n return rest as T;\n }\n return value;\n}\n","export function deletePropertyByPath<T extends Record<string, unknown>>(\n object: T,\n path: string,\n): T {\n const segments = path.split('.').filter(Boolean);\n if (segments.length === 0) {\n return object;\n }\n\n let current: Record<string, unknown> = object;\n\n for (let i = 0; i < segments.length - 1; i += 1) {\n const key = segments[i];\n const next = current[key];\n if (next == null || typeof next !== 'object') {\n return object;\n }\n current = next as Record<string, unknown>;\n }\n\n delete current[segments[segments.length - 1]];\n return object;\n}\n","import { deletePropertyByPath } from './delete-property-by-path';\nimport { flattenFieldTree } from './flatten-field-tree';\nimport { getValueByPath } from './get-value-by-path';\nimport { PlatformMeshFieldDefinition } from '@platform-mesh/portal-ui-lib/models';\n\n/** Drops write-only fields whose value is empty so updates leave them unchanged. */\nexport function omitEmptyWriteOnlyFields<T extends Record<string, unknown>>(\n resource: T,\n fields: readonly PlatformMeshFieldDefinition[] | undefined,\n): T {\n const result = structuredClone(resource);\n\n for (const field of flattenFieldTree(fields)) {\n if (!field.writeOnly || typeof field.property !== 'string') {\n continue;\n }\n\n const value = getValueByPath(result, field.property);\n if (value === '' || value == null) {\n deletePropertyByPath(result, field.property);\n pruneEmptyParents(result, field.property);\n }\n }\n\n return result;\n}\n\nfunction pruneEmptyParents(\n object: Record<string, unknown>,\n path: string,\n): void {\n const segments = path.split('.').filter(Boolean);\n for (let i = segments.length - 1; i > 0; i -= 1) {\n const parentPath = segments.slice(0, i).join('.');\n const parent = getValueByPath(object, parentPath);\n if (\n parent &&\n typeof parent === 'object' &&\n !Array.isArray(parent) &&\n Object.keys(parent as Record<string, unknown>).length === 0\n ) {\n deletePropertyByPath(object, parentPath);\n } else {\n break;\n }\n }\n}\n","export function setPropertyByPath<T extends Record<string, any>>(\n object: T,\n path: string,\n value: unknown,\n): T {\n const segments = path.split('.').filter(Boolean);\n if (segments.length === 0) {\n return object;\n }\n\n let current: Record<string, any> = object;\n\n for (let i = 0; i < segments.length; i += 1) {\n const key = segments[i];\n if (i === segments.length - 1) {\n current[key] = value;\n break;\n }\n\n const existing = current[key];\n\n if (\n existing === undefined ||\n existing === null ||\n typeof existing !== 'object'\n ) {\n current[key] = {};\n }\n\n current = current[key];\n }\n\n return object;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -55,10 +55,15 @@ declare const decodeBase64: (base64: string) => string;
|
|
|
55
55
|
|
|
56
56
|
declare function stripTypename<T>(value: T): T;
|
|
57
57
|
|
|
58
|
+
declare function deletePropertyByPath<T extends Record<string, unknown>>(object: T, path: string): T;
|
|
59
|
+
|
|
58
60
|
/** Flattens nested `propertyCollection` trees into a list of leaf field definitions. */
|
|
59
61
|
declare function flattenFieldTree(fields: readonly PlatformMeshFieldDefinition[] | undefined): PlatformMeshFieldDefinition[];
|
|
60
62
|
|
|
63
|
+
/** Drops write-only fields whose value is empty so updates leave them unchanged. */
|
|
64
|
+
declare function omitEmptyWriteOnlyFields<T extends Record<string, unknown>>(resource: T, fields: readonly PlatformMeshFieldDefinition[] | undefined): T;
|
|
65
|
+
|
|
61
66
|
declare function setPropertyByPath<T extends Record<string, any>>(object: T, path: string, value: unknown): T;
|
|
62
67
|
|
|
63
|
-
export { buildGraphQLInputTypeName, buildResourcePath, decodeBase64, encodeBase64, flattenFieldTree, generateGraphQLFields, generateGraphQLReadFields, getResourceValueByJsonPath, getValueByPath, isLocalSetup, isNamespacedResource, mergeListWithSubscriptionResult, parseRawGqlQueryToFields, permissionKey, resourceActionAllowed, setPropertyByPath, stripTypename };
|
|
68
|
+
export { buildGraphQLInputTypeName, buildResourcePath, decodeBase64, deletePropertyByPath, encodeBase64, flattenFieldTree, generateGraphQLFields, generateGraphQLReadFields, getResourceValueByJsonPath, getValueByPath, isLocalSetup, isNamespacedResource, mergeListWithSubscriptionResult, omitEmptyWriteOnlyFields, parseRawGqlQueryToFields, permissionKey, resourceActionAllowed, setPropertyByPath, stripTypename };
|
|
64
69
|
export type { GenerateGraphQLFieldsOptions, MergeListWithSubscriptionResultOptions };
|