Skip to content

Commit

Permalink
Merge pull request #12 from lens-protocol/release/0.1.0-alpha.11
Browse files Browse the repository at this point in the history
Release/0.1.0-alpha.11
  • Loading branch information
cesarenaldi authored Sep 6, 2023
2 parents 46e8463 + ce2fcce commit fa9d750
Show file tree
Hide file tree
Showing 18 changed files with 370 additions and 168 deletions.
5 changes: 5 additions & 0 deletions .changeset/hip-cherries-roll.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@lens-protocol/metadata': patch
---

**Fixed** TS4023 error while using `legacy` namespace by moving content under `@lens-protocol/metadata/legacy` entry point
5 changes: 5 additions & 0 deletions .changeset/large-pots-bow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@lens-protocol/metadata': patch
---

**Fixed** missing `EncryptionParams.encryptedFields` rules and typedef
3 changes: 3 additions & 0 deletions .changeset/pre.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@
"grumpy-hairs-carry",
"grumpy-jokes-drop",
"healthy-radios-lick",
"hip-cherries-roll",
"hot-jobs-collect",
"large-pots-bow",
"light-ligers-exist",
"popular-spies-enjoy",
"quick-pets-itch",
"shy-cougars-boil",
"shy-falcons-sip",
"three-lamps-develop",
"tiny-glasses-unite",
Expand Down
5 changes: 5 additions & 0 deletions .changeset/shy-cougars-boil.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@lens-protocol/metadata': patch
---

**Fixed** missing properties in `TransactionMetadata` and `SpaceSchema`
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# @lens-protocol/metadata

## 0.1.0-alpha.11

### Patch Changes

- eec20a1: **Fixed** TS4023 error while using `legacy` namespace by moving content under `@lens-protocol/metadata/legacy` entry point
- 691847a: **Fixed** missing `EncryptionParams.encryptedFields` rules and typedef
- b72c6e4: **Fixed** missing properties in `TransactionMetadata` and `SpaceSchema`

## 0.1.0-alpha.10

### Patch Changes
Expand Down
242 changes: 162 additions & 80 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,27 @@

Schema validation and TS types for [LIP-2](https://github.com/lens-protocol/LIPs/pull/5/) Lens Protocol Metadata Standards.

- [Features](#features)
- [Installation](#installation)
- [Usage](#usage)
- [Publication metadata](#publication-metadata)
- [Profile metadata](#profile-metadata)
- [Extract version number](#extract-version-number)
- [Format validation error](#format-validation-error)
- [Narrowing types](#narrowing-types)
- [`PublicationMetadata`](#publicationmetadata)
- [`AccessCondition`](#accesscondition)
- [`MetadataAttribute`](#metadataattribute)
- [Useful types](#useful-types)
- [Legacy metadata formats](#legacy-metadata-formats)
- [JSON schemas](#json-schemas)
- [Versioning](#versioning)
- [Adding a new schema](#adding-a-new-schema)
- [Contributing](#contributing)
- [Releasing](#releasing)
- [License](#license)
- [Support](#support)

## Features

- [Zod](https://zod.dev/) schema definitions
Expand Down Expand Up @@ -53,25 +74,6 @@ PublicationMetadataSchema.safeParse(invalid);
// => { success: false, error: ZodError }
```

You can also parse legacy Publication Metadata v2 and v1 via:

```typescript
import { legacy } from '@lens-protocol/metadata';

legacy.PublicationMetadataSchema.parse(valid); // => legacy.PublicationMetadata
legacy.PublicationMetadataSchema.parse(invalid); // => throws ZodError

// OR

legacy.PublicationMetadataSchema.safeParse(valid);
// => { success: true, data: legacy.PublicationMetadata }
legacy.PublicationMetadataSchema.safeParse(invalid);
// => { success: false, error: ZodError }
```

> [!WARNING]
> When working with the `legacy` namespace make sure to use enums from tha same namespace, e.g. `legacy.PublicationMainFocus` instead of `PublicationMainFocus` to avoid confusion.
### Profile metadata

```typescript
Expand All @@ -88,22 +90,6 @@ ProfileMetadataSchema.safeParse(invalid);
// => { success: false, error: ZodError }
```

You can also parse legacy Profile Metadata (aka v1) via:

```typescript
import { legacy } from '@lens-protocol/metadata';

legacy.ProfileMetadataSchema.parse(valid); // => legacy.ProfileMetadata
legacy.ProfileMetadataSchema.parse(invalid); // => throws ZodError

// OR

legacy.ProfileMetadataSchema.safeParse(valid);
// => { success: true, data: legacy.ProfileMetadata }
legacy.ProfileMetadataSchema.safeParse(invalid);
// => { success: false, error: ZodError }
```

### Extract version number

A convenience `extractVersion` function is available to extract the version from a parsed `PublicationMetadata` or `ProfileMetadata`.
Expand Down Expand Up @@ -142,7 +128,7 @@ if (!result.success) {

Every time you have a discriminated union, you can use the discriminant to narrow the type. See few examples below.

**`PublicationMetadata`**
#### `PublicationMetadata`

```typescript
import {
Expand Down Expand Up @@ -171,49 +157,7 @@ switch (publicationMetadata.$schema) {
}
```

**`legacy.PublicationMetadata`**

`legacy.PublicationMetadata` is a discriminated union of `legacy.PublicationMetadataV1` and `legacy.PublicationMetadataV2` where the `version` property is the discriminant.

In turn `legacy.PublicationMetadataV2` is a discriminated union of:

- `legacy.PublicationMetadataV2Article`
- `legacy.PublicationMetadataV2Audio`
- `legacy.PublicationMetadataV2Embed`
- `legacy.PublicationMetadataV2Image`
- `legacy.PublicationMetadataV2Link`
- `legacy.PublicationMetadataV2TextOnly`
- `legacy.PublicationMetadataV2Video`

where the `mainContentFocus` property is the discriminant.

```typescript
import { legacy } from '@lens-protocol/metadata';

const publicationMetadata = legacy.PublicationMetadataSchema.parse(valid);

switch (publicationMetadata.version) {
case legacy.PublicationMetadataVersion.V1:
// publicationMetadata is legacy.PublicationMetadataV1
break;
case legacy.PublicationMetadataVersion.V2:
// publicationMetadata is legacy.PublicationMetadataV2

switch (publicationMetadata.mainContentFocus) {
case legacy.PublicationMainFocus.ARTICLE:
// publicationMetadata is legacy.PublicationMetadataV2Article
break;
case legacy.PublicationMainFocus.VIDEO:
// publicationMetadata is legacy.PublicationMetadataV2Video
break;

// ...
}
break;
}
```

**`AccessCondition`**
#### `AccessCondition`

```typescript
import { AccessCondition, ConditionType, PublicationMetadataSchema } from '@lens-protocol/metadata';
Expand All @@ -238,7 +182,7 @@ switch (publicationMetadata.encryptedWith?.accessCondition.type) {
}
```

**`MetadataAttribute`**
#### `MetadataAttribute`

```typescript
import { MetadataAttribute, MetadataAttributeType } from '@lens-protocol/metadata';
Expand Down Expand Up @@ -328,6 +272,144 @@ import {
} from '@lens-protocol/metadata';
```

### Legacy metadata formats

The package also exports parsers for legacy metadata formats via the `@lens-protocol/metadata/legacy` entrypoint.

> [!WARNING]
> DO NOT mix and match legacy and new metadata TS types and enums. Although they share some similarities they are not meant to be interoperable.
> For example if you are checking `mainContentFocus` of `PublicationMetadataV2` use the `PublicationMainFocus` exported from `@lens-protocol/metadata/legacy` and NOT the one from the main `@lens-protocol/metadata` entrypoint.
You can parse legacy Publication Metadata v1 and v2 via:

```typescript
import { PublicationMetadataSchema } from '@lens-protocol/metadata/legacy';

PublicationMetadataSchema.parse(valid); // => PublicationMetadata
PublicationMetadataSchema.parse(invalid); // => throws ZodError

// OR

PublicationMetadataSchema.safeParse(valid);
// => { success: true, data: PublicationMetadata }
PublicationMetadataSchema.safeParse(invalid);
// => { success: false, error: ZodError }
```

Legacy `PublicationMetadata` is a discriminated union of `PublicationMetadataV1` and `PublicationMetadataV2` where the `version` property is the discriminant.

In turn `legacy.PublicationMetadataV2` is a discriminated union of:

- `PublicationMetadataV2Article`
- `PublicationMetadataV2Audio`
- `PublicationMetadataV2Embed`
- `PublicationMetadataV2Image`
- `PublicationMetadataV2Link`
- `PublicationMetadataV2TextOnly`
- `PublicationMetadataV2Video`

where the `mainContentFocus` property is the discriminant.

```typescript
import {
PublicationMetadataSchema,
PublicationMetadataVersion,
PublicationMainFocus,
} from '@lens-protocol/metadata/legacy';

const publicationMetadata = PublicationMetadataSchema.parse(valid);

switch (publicationMetadata.version) {
case PublicationMetadataVersion.V1:
// publicationMetadata is PublicationMetadataV1
break;
case PublicationMetadataVersion.V2:
// publicationMetadata is PublicationMetadataV2

switch (publicationMetadata.mainContentFocus) {
case PublicationMainFocus.ARTICLE:
// publicationMetadata is PublicationMetadataV2Article
break;
case PublicationMainFocus.VIDEO:
// publicationMetadata is PublicationMetadataV2Video
break;

// ...
}
break;
}
```

You can also parse legacy Profile Metadata (aka v1) via:

```typescript
import { ProfileMetadataSchema } from '@lens-protocol/metadata/legacy';

ProfileMetadataSchema.parse(valid); // => ProfileMetadata
ProfileMetadataSchema.parse(invalid); // => throws ZodError

// OR

ProfileMetadataSchema.safeParse(valid);
// => { success: true, data: ProfileMetadata }
ProfileMetadataSchema.safeParse(invalid);
// => { success: false, error: ZodError }
```

Similarly to the main entrypoint the `@lens-protocol/metadata/legacy` entrypoint also exports all the types and enums that you might need to work with the legacy metadata (some examples below).

```typescript
import {
// enums
AudioMimeType,
ImageMimeType,
PublicationMainFocus,
PublicationMetadataVersion,
VideoMimeType,

// main types
ProfileMetadata,
PublicationMetadata,
PublicationMetadataV1,
PublicationMetadataV2,
PublicationMetadataV2Article,
PublicationMetadataV2Audio,
PublicationMetadataV2Embed,
PublicationMetadataV2Image,
PublicationMetadataV2Link,
PublicationMetadataV2TextOnly,
PublicationMetadataV2Video,

// others
AccessCondition,
AndCondition,
CollectCondition,
EncryptedFields,
EncryptedMedia,
EoaOwnership,
Erc20Ownership,
FollowCondition,
MarketplaceMetadata,
MarketplaceMetadataAttribute,
Media,
NftOwnership,
OrCondition,
ProfileMetadataAttribute,
ProfileOwnership,

// branded aliases
Locale,
Markdown,
Signature,
URI,
AppId,
Datetime,
} from '@lens-protocol/metadata/legacy';
```

> [!NOTE]
> If you find yourself in a position of importing from both `@lens-protocol/metadata` and `@lens-protocol/metadata/legacy` entrypoints in the same module. You can you can use ESModule aliasing to avoid conflicts: `import * as legacy from '@lens-protocol/metadata/legacy'` and then use the legacy types, enums, and parsers under `legacy.*`.
## JSON schemas

Importing JSON schema in TypeScript is a simple as:
Expand Down
23 changes: 22 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,32 @@
{
"name": "@lens-protocol/metadata",
"version": "0.1.0-alpha.10",
"version": "0.1.0-alpha.11",
"description": "Lens Protocol Metadata Standards",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./dist/index.js",
"default": "./dist/index.cjs"
},
"./legacy": {
"import": "./dist/legacy/index.js",
"default": "./dist/legacy/index.cjs"
},
"./package.json": "./package.json"
},
"typesVersions": {
"*": {
"*": [
"dist/index.d.ts"
],
"legacy": [
"dist/legacy/index.d.ts"
]
}
},
"sideEffects": false,
"scripts": {
"build": "pnpm build:jsonschemas && pnpm build:dist",
Expand Down
2 changes: 1 addition & 1 deletion src/formatters.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Heavily customized and simplified version of https://www.npmjs.com/package/zod-validation-error
import { z } from 'zod';

import { NonEmptyArray, assertNonEmptyArray, hasAtLeastOne } from './utils';
import { NonEmptyArray, assertNonEmptyArray, hasAtLeastOne } from './utils.js';

const maxIssuesInMessage = 99;
const issueSeparator = '\n';
Expand Down
5 changes: 2 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
export * as legacy from './legacy';
export * from './constants.js';
export * from './formatters.js';
export * from './MetadataAttribute.js';
export * from './primitives.js';
export * from './profile';
export * from './publication';
export * from './profile/index.js';
export * from './publication/index.js';
export type { Brand, TwoAtLeastArray } from './utils.js';
export { extractVersion } from './utils.js';
Loading

0 comments on commit fa9d750

Please sign in to comment.