From 45c12dce33539b39193d1aae6661d4f43970bb4d Mon Sep 17 00:00:00 2001 From: Maxim Chervonny Date: Thu, 21 Jul 2022 16:10:15 +0300 Subject: [PATCH] Selective metadata packages list (#2941) --- .../Bucket/PackageList/PackageList.tsx | 192 ++++++++++---- .../PackageList/gql/PackageList.generated.ts | 17 ++ .../PackageList/gql/PackageList.graphql | 4 + .../BucketPreferences.spec.ts | 1 + .../BucketPreferences/BucketPreferences.ts | 37 ++- catalog/package-lock.json | 235 ++++++++++++++++-- catalog/package.json | 2 + shared/schemas/bucketConfig.yml.json | 21 ++ 8 files changed, 448 insertions(+), 61 deletions(-) diff --git a/catalog/app/containers/Bucket/PackageList/PackageList.tsx b/catalog/app/containers/Bucket/PackageList/PackageList.tsx index c96f73529e5..7c8ee6944ee 100644 --- a/catalog/app/containers/Bucket/PackageList/PackageList.tsx +++ b/catalog/app/containers/Bucket/PackageList/PackageList.tsx @@ -1,4 +1,5 @@ import * as dateFns from 'date-fns' +import * as jsonpath from 'jsonpath' import * as R from 'ramda' import * as React from 'react' import * as RRDom from 'react-router-dom' @@ -18,6 +19,7 @@ import * as Format from 'utils/format' import parseSearch from 'utils/parseSearch' import mkStorage from 'utils/storage' import { readableQuantity } from 'utils/string' +import { JsonRecord } from 'utils/types' import useDebouncedInput from 'utils/useDebouncedInput' import usePrevious from 'utils/usePrevious' import useQuery from 'utils/useQuery' @@ -136,10 +138,123 @@ function Counts({ counts, total }: CountsProps) { ) } -const usePackageStyles = M.makeStyles((t) => ({ - root: { +const useRevisionAttributesStyles = M.makeStyles((t) => ({ + revisionsNumber: { + ...t.typography.subtitle2, + color: t.palette.text.secondary, + position: 'relative', + }, + updated: { + ...t.typography.body2, + color: t.palette.text.secondary, position: 'relative', + marginLeft: t.spacing(2), + }, +})) + +interface RevisionAttributesProps { + className: string + revisions: { + total: number + } + modified: Date +} + +function RevisionAttributes({ className, modified, revisions }: RevisionAttributesProps) { + const classes = useRevisionAttributesStyles() + const t = M.useTheme() + const xs = M.useMediaQuery(t.breakpoints.down('xs')) + return ( +
+ + {revisions.total}{' '} + {xs ? ( + 'Rev.' + ) : ( + + )} + + + {xs ? 'Upd. ' : 'Updated '} + {modified ? : '[unknown: see console]'} + +
+ ) +} + +const useRevisionMetaStyles = M.makeStyles((t) => ({ + root: { + borderTop: `1px solid ${t.palette.divider}`, + padding: t.spacing(2), + ...t.typography.body2, + color: t.palette.text.secondary, + }, + section: { + '& + &': { + marginTop: t.spacing(1), + }, + }, + tag: { + '& + &': { + marginLeft: t.spacing(1), + }, + }, +})) + +interface RevisionMetaProps { + sections: (string | string[])[] +} + +function RevisionMeta({ sections }: RevisionMetaProps) { + const classes = useRevisionMetaStyles() + + return ( +
+ {sections.map((section, i) => ( +
+ {Array.isArray(section) + ? section.map((label, j) => ( + + )) + : section} +
+ ))} +
+ ) +} + +function usePackageMeta( + name: string, + revision: { message: string | null; userMeta: JsonRecord | null } | null, +): (string | string[])[] { + // TODO: move visible meta calculation to the graphql + const preferences = BucketPreferences.use() + return React.useMemo(() => { + const { message, userMeta } = + preferences?.ui.packages[name] || preferences?.ui.packages['*'] || {} + const output = [] + if (message && revision?.message) output.push(revision.message) + if (userMeta && revision?.userMeta) + userMeta.forEach((jPath) => { + const section = jsonpath.value(revision.userMeta, jPath) + if (typeof section === 'string') output.push(section) + if (Array.isArray(section)) output.push(section.filter(R.is(String))) + }) + return output + }, [name, preferences, revision]) +} +const usePackageStyles = M.makeStyles((t) => ({ + root: { [t.breakpoints.down('xs')]: { borderRadius: 0, }, @@ -148,15 +263,17 @@ const usePackageStyles = M.makeStyles((t) => ({ marginTop: t.spacing(1), }, }, + base: { + padding: t.spacing(2), + position: 'relative', + }, handleContainer: { WebkitBoxOrient: 'vertical', WebkitLineClamp: 2, display: '-webkit-box', overflow: 'hidden', overflowWrap: 'break-word', - paddingLeft: t.spacing(2), paddingRight: t.spacing(21), - paddingTop: t.spacing(2), textOverflow: 'ellipsis', }, handle: { @@ -178,15 +295,8 @@ const usePackageStyles = M.makeStyles((t) => ({ background: t.palette.action.hover, }, }, - revisions: { - ...t.typography.subtitle2, - color: t.palette.text.secondary, - position: 'relative', - }, - updated: { - ...t.typography.body2, - color: t.palette.text.secondary, - position: 'relative', + attributes: { + marginTop: t.spacing(1), }, })) @@ -194,41 +304,37 @@ type PackageProps = NonNullable< ResultOf['packages'] >['page'][number] -function Package({ name, modified, revisions, bucket, accessCounts }: PackageProps) { +function Package({ + name, + modified, + revisions, + bucket, + accessCounts, + revision, +}: PackageProps) { const { urls } = NamedRoutes.use() const classes = usePackageStyles() - const t = M.useTheme() - const xs = M.useMediaQuery(t.breakpoints.down('xs')) + const meta = usePackageMeta(name, revision) return ( -
- - - {name} - +
+
+ + + {name} + +
+ + {!!accessCounts && }
- - - {revisions.total}{' '} - {xs ? ( - 'Rev.' - ) : ( - - )} - - - - {xs ? 'Upd. ' : 'Updated '} - {modified ? : '[unknown: see console]'} - - - {!!accessCounts && } + {!!meta && !!meta.length && } ) } diff --git a/catalog/app/containers/Bucket/PackageList/gql/PackageList.generated.ts b/catalog/app/containers/Bucket/PackageList/gql/PackageList.generated.ts index c4183686c35..7da939df2ab 100644 --- a/catalog/app/containers/Bucket/PackageList/gql/PackageList.generated.ts +++ b/catalog/app/containers/Bucket/PackageList/gql/PackageList.generated.ts @@ -37,6 +37,12 @@ export type containers_Bucket_PackageList_gql_PackageListQuery = { > } > + readonly revision: Types.Maybe< + { readonly __typename: 'PackageRevision' } & Pick< + Types.PackageRevision, + 'message' | 'userMeta' + > + > } > } @@ -179,6 +185,17 @@ export const containers_Bucket_PackageList_gql_PackageListDocument = { ], }, }, + { + kind: 'Field', + name: { kind: 'Name', value: 'revision' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'message' } }, + { kind: 'Field', name: { kind: 'Name', value: 'userMeta' } }, + ], + }, + }, ], }, }, diff --git a/catalog/app/containers/Bucket/PackageList/gql/PackageList.graphql b/catalog/app/containers/Bucket/PackageList/gql/PackageList.graphql index e36b51261bd..aeb5362b8a2 100644 --- a/catalog/app/containers/Bucket/PackageList/gql/PackageList.graphql +++ b/catalog/app/containers/Bucket/PackageList/gql/PackageList.graphql @@ -20,6 +20,10 @@ query ( value } } + revision { + message + userMeta + } } } } diff --git a/catalog/app/utils/BucketPreferences/BucketPreferences.spec.ts b/catalog/app/utils/BucketPreferences/BucketPreferences.spec.ts index 1fd6c460816..6484d3c8456 100644 --- a/catalog/app/utils/BucketPreferences/BucketPreferences.spec.ts +++ b/catalog/app/utils/BucketPreferences/BucketPreferences.spec.ts @@ -23,6 +23,7 @@ const expectedDefaults = { packages: true, queries: true, }, + packages: {}, sourceBuckets: { list: [], }, diff --git a/catalog/app/utils/BucketPreferences/BucketPreferences.ts b/catalog/app/utils/BucketPreferences/BucketPreferences.ts index 89fd5248ae6..1b724fccbf2 100644 --- a/catalog/app/utils/BucketPreferences/BucketPreferences.ts +++ b/catalog/app/utils/BucketPreferences/BucketPreferences.ts @@ -17,6 +17,17 @@ type BlocksPreferences = Record<'analytics' | 'browser' | 'code' | 'meta', boole export type NavPreferences = Record<'files' | 'packages' | 'queries', boolean> +interface PackagePreferencesInput { + message?: true + user_meta?: ReadonlyArray +} +interface PackagePreferences { + message?: true + userMeta?: ReadonlyArray +} +type PackagesListPreferencesInput = Record +type PackagesListPreferences = Record + type DefaultSourceBucketInput = string type SourceBucketsInput = Record @@ -25,6 +36,7 @@ interface UiPreferencesInput { blocks?: Partial defaultSourceBucket?: DefaultSourceBucketInput nav?: Partial + packages?: PackagesListPreferencesInput sourceBuckets?: SourceBucketsInput } @@ -41,6 +53,7 @@ interface UiPreferences { actions: ActionPreferences blocks: BlocksPreferences nav: NavPreferences + packages: PackagesListPreferences sourceBuckets: SourceBuckets } @@ -68,6 +81,11 @@ const defaultPreferences: BucketPreferences = { packages: true, queries: true, }, + packages: { + '*': { + message: true, + }, + }, sourceBuckets: { getDefault: () => '', list: [], @@ -86,6 +104,19 @@ function validate(data: unknown): asserts data is BucketPreferencesInput { if (errors.length) throw new bucketErrors.BucketPreferencesInvalid({ errors }) } +function parsePackages(packages?: PackagesListPreferencesInput): PackagesListPreferences { + return Object.entries(packages || {}).reduce( + (memo, [name, { message, user_meta }]) => ({ + ...memo, + [name]: { + message, + userMeta: user_meta, + }, + }), + defaultPreferences.ui.packages, + ) +} + function parseSourceBuckets( sentry: SentryInstance, sourceBuckets?: SourceBucketsInput, @@ -110,10 +141,14 @@ function parseSourceBuckets( } } -export function extendDefaults(data: BucketPreferencesInput, sentry: SentryInstance) { +export function extendDefaults( + data: BucketPreferencesInput, + sentry: SentryInstance, +): BucketPreferences { return { ui: { ...R.mergeDeepRight(defaultPreferences.ui, data?.ui || {}), + packages: parsePackages(data?.ui?.packages), sourceBuckets: parseSourceBuckets( sentry, data?.ui?.sourceBuckets, diff --git a/catalog/package-lock.json b/catalog/package-lock.json index badc62c25d7..6dba705d642 100644 --- a/catalog/package-lock.json +++ b/catalog/package-lock.json @@ -48,6 +48,7 @@ "io-ts-types": "^0.5.16", "js-yaml": "^4.1.0", "jsoneditor-react": "^3.1.2", + "jsonpath": "^1.1.1", "katex": "^0.13.19", "lodash": "^4.17.21", "match-sorter": "^6.3.1", @@ -120,6 +121,7 @@ "@types/invariant": "^2.2.35", "@types/jest": "^27.4.1", "@types/js-yaml": "^4.0.5", + "@types/jsonpath": "^0.2.0", "@types/lodash": "^4.14.182", "@types/mime-types": "^2.1.1", "@types/ramda": "^0.27.44", @@ -4919,6 +4921,12 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/jsonpath": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@types/jsonpath/-/jsonpath-0.2.0.tgz", + "integrity": "sha512-v7qlPA0VpKUlEdhghbDqRoKMxFB3h3Ch688TApBJ6v+XLDdvWCGLJIYiPKGZnS6MAOie+IorCfNYVHOPIHSWwQ==", + "dev": true + }, "node_modules/@types/jsonwebtoken": { "version": "8.5.2", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.2.tgz", @@ -12351,8 +12359,7 @@ "node_modules/deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "node_modules/deepmerge": { "version": "4.2.2", @@ -14092,7 +14099,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "devOptional": true, "engines": { "node": ">=4.0" } @@ -14101,7 +14107,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -14720,8 +14725,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fastest-levenshtein": { "version": "1.0.12", @@ -19090,6 +19094,28 @@ "integrity": "sha1-1CsNz9kaxY7zEQ+W0sWZQEw9wnw=", "dev": true }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/jsonrepair": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-2.2.0.tgz", @@ -27554,6 +27580,91 @@ "node": ">=8" } }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -29227,6 +29338,11 @@ "node": ">=0.10.0" } }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -31289,7 +31405,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -35443,6 +35558,12 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/jsonpath": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@types/jsonpath/-/jsonpath-0.2.0.tgz", + "integrity": "sha512-v7qlPA0VpKUlEdhghbDqRoKMxFB3h3Ch688TApBJ6v+XLDdvWCGLJIYiPKGZnS6MAOie+IorCfNYVHOPIHSWwQ==", + "dev": true + }, "@types/jsonwebtoken": { "version": "8.5.2", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.2.tgz", @@ -41425,8 +41546,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { "version": "4.2.2", @@ -42782,14 +42902,12 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "devOptional": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -43264,8 +43382,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastest-levenshtein": { "version": "1.0.12", @@ -46622,6 +46739,23 @@ "integrity": "sha1-1CsNz9kaxY7zEQ+W0sWZQEw9wnw=", "dev": true }, + "jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "requires": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + }, + "dependencies": { + "esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==" + } + } + }, "jsonrepair": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-2.2.0.tgz", @@ -53343,6 +53477,69 @@ } } }, + "static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "requires": { + "escodegen": "^1.8.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -54623,6 +54820,11 @@ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -56325,8 +56527,7 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "worker-loader": { "version": "3.0.8", diff --git a/catalog/package.json b/catalog/package.json index 5118dac8230..65c62e3fc02 100644 --- a/catalog/package.json +++ b/catalog/package.json @@ -89,6 +89,7 @@ "io-ts-types": "^0.5.16", "js-yaml": "^4.1.0", "jsoneditor-react": "^3.1.2", + "jsonpath": "^1.1.1", "katex": "^0.13.19", "lodash": "^4.17.21", "match-sorter": "^6.3.1", @@ -161,6 +162,7 @@ "@types/invariant": "^2.2.35", "@types/jest": "^27.4.1", "@types/js-yaml": "^4.0.5", + "@types/jsonpath": "^0.2.0", "@types/lodash": "^4.14.182", "@types/mime-types": "^2.1.1", "@types/ramda": "^0.27.44", diff --git a/shared/schemas/bucketConfig.yml.json b/shared/schemas/bucketConfig.yml.json index 9b0467069b7..41ab06580c8 100644 --- a/shared/schemas/bucketConfig.yml.json +++ b/shared/schemas/bucketConfig.yml.json @@ -79,6 +79,27 @@ } } }, + "packages": { + "type": "object", + "description": "Configure JSON fields to extract from revision for each revision meta", + "minProperties": 1, + "additionalProperties": { + "type": "object", + "properties": { + "message": { + "type": "boolean", + "description": "Whether to show message or not" + }, + "user_meta": { + "type": "array", + "items": { + "type": "string", + "description": "JSONPath to string or array of strings inside user_meta" + } + } + } + } + }, "sourceBuckets": { "type": "object", "description": "Buckets usable as sources for adding objects from while editing a package via web UI.",