Skip to content

Commit

Permalink
Make TabConfigName also be a zod type.
Browse files Browse the repository at this point in the history
Part of #673.
  • Loading branch information
jkomoros committed Nov 12, 2023
1 parent 24c3056 commit 5e0316d
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 93 deletions.
16 changes: 8 additions & 8 deletions .vscode/config_schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@
],
"type": "string"
},
"{\"working-notes\"?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;recent?:TabConfigItemInput;random?:TabConfigItemInput;default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;}": {
"{default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;recent?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;\"working-notes\"?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;random?:TabConfigItemInput;}": {
"additionalProperties": false,
"properties": {
"concepts": {
Expand Down Expand Up @@ -220,7 +220,7 @@
},
"type": "object"
},
"{\"working-notes\"?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;recent?:TabConfigItemInput;random?:TabConfigItemInput;default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;}_1": {
"{default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;recent?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;\"working-notes\"?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;random?:TabConfigItemInput;}_1": {
"additionalProperties": false,
"properties": {
"concepts": {
Expand Down Expand Up @@ -538,10 +538,10 @@
"additionalProperties": false,
"properties": {
"after": {
"$ref": "#/definitions/{\"working-notes\"?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;recent?:TabConfigItemInput;random?:TabConfigItemInput;default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;}_1"
"$ref": "#/definitions/{default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;recent?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;\"working-notes\"?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;random?:TabConfigItemInput;}_1"
},
"before": {
"$ref": "#/definitions/{\"working-notes\"?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;recent?:TabConfigItemInput;random?:TabConfigItemInput;default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;}"
"$ref": "#/definitions/{default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;recent?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;\"working-notes\"?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;random?:TabConfigItemInput;}"
}
},
"type": "object"
Expand Down Expand Up @@ -871,10 +871,10 @@
"additionalProperties": false,
"properties": {
"after": {
"$ref": "#/definitions/{\"working-notes\"?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;recent?:TabConfigItemInput;random?:TabConfigItemInput;default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;}_1"
"$ref": "#/definitions/{default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;recent?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;\"working-notes\"?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;random?:TabConfigItemInput;}_1"
},
"before": {
"$ref": "#/definitions/{\"working-notes\"?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;recent?:TabConfigItemInput;random?:TabConfigItemInput;default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;}"
"$ref": "#/definitions/{default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;recent?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;\"working-notes\"?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;random?:TabConfigItemInput;}"
}
},
"type": "object"
Expand Down Expand Up @@ -1204,10 +1204,10 @@
"additionalProperties": false,
"properties": {
"after": {
"$ref": "#/definitions/{\"working-notes\"?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;recent?:TabConfigItemInput;random?:TabConfigItemInput;default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;}_1"
"$ref": "#/definitions/{default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;recent?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;\"working-notes\"?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;random?:TabConfigItemInput;}_1"
},
"before": {
"$ref": "#/definitions/{\"working-notes\"?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;recent?:TabConfigItemInput;random?:TabConfigItemInput;default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;}"
"$ref": "#/definitions/{default_tabs?:TabConfigItemInput;default_end_tabs?:TabConfigItemInput;sections?:TabConfigItemInput;hidden_sections?:TabConfigItemInput;tags?:TabConfigItemInput;hidden_tags?:TabConfigItemInput;popular?:TabConfigItemInput;recent?:TabConfigItemInput;\"reading-list\"?:TabConfigItemInput;starred?:TabConfigItemInput;unread?:TabConfigItemInput;\"working-notes\"?:TabConfigItemInput;concepts?:TabConfigItemInput;twitter?:TabConfigItemInput;random?:TabConfigItemInput;}"
}
},
"type": "object"
Expand Down
82 changes: 34 additions & 48 deletions src/tabs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,6 @@ import {

import * as icons from './components/my-icons.js';

import {
TAB_CONFIG_DEFAULT_TABS,
TAB_CONFIG_DEFAULT_END_TABS,
TAB_CONFIG_SECTIONS,
TAB_CONFIG_HIDDEN_SECTIONS,
TAB_CONFIG_TAGS,
TAB_CONFIG_HIDDEN_TAGS,
TAB_CONFIG_POPULAR,
TAB_CONFIG_RECENT,
TAB_CONFIG_READING_LIST,
TAB_CONFIG_STARRED,
TAB_CONFIG_UNREAD,
TAB_CONFIG_WORKING_NOTES,
TAB_CONFIG_CONCEPTS,
TAB_CONFIG_TWITTER,
TAB_CONFIG_RANDOM
} from './type_constants.js';

import {
TWITTER_HANDLE
} from './config.GENERATED.SECRET.js';
Expand Down Expand Up @@ -114,52 +96,52 @@ const inflateCollectionsAndIcons = (config : TabConfig) : ExpandedTabConfig => {

const DEFAULT_CONFIG : TabConfig = [
{
expand: TAB_CONFIG_DEFAULT_TABS
expand: 'default_tabs'
}
];

const EXPANSION_ITEMS : {[name in TabConfigName]+?: TabConfig} = {
[TAB_CONFIG_DEFAULT_TABS]: [
const EXPANSION_ITEMS : {[name in Exclude<TabConfigName, 'sections' | 'hidden_sections' | 'tags' | 'hidden_tags'>]: TabConfig} = {
'default_tabs': [
{
expand: TAB_CONFIG_SECTIONS,
expand: 'sections',
},
{
expand: TAB_CONFIG_HIDDEN_TAGS,
expand: 'hidden_tags',
},
{
expand: TAB_CONFIG_DEFAULT_END_TABS,
expand: 'default_end_tabs',
}
],
[TAB_CONFIG_DEFAULT_END_TABS]: [
'default_end_tabs': [
{
expand: TAB_CONFIG_POPULAR,
expand: 'popular',
},
{
expand: TAB_CONFIG_RECENT,
expand: 'recent',
},
{
expand: TAB_CONFIG_READING_LIST,
expand: 'reading-list',
},
{
expand: TAB_CONFIG_STARRED,
expand: 'starred',
},
{
expand: TAB_CONFIG_UNREAD,
expand: 'unread',
},
{
expand: TAB_CONFIG_WORKING_NOTES,
expand: 'working-notes',
},
{
expand: TAB_CONFIG_CONCEPTS,
expand: 'concepts',
},
{
expand: TAB_CONFIG_RANDOM,
expand: 'random',
},
{
expand: TAB_CONFIG_TWITTER,
expand: 'twitter',
}
],
[TAB_CONFIG_POPULAR]: [
'popular': [
{
icon: icons.INSIGHTS_ICON,
display_name: 'Popular',
Expand All @@ -169,14 +151,14 @@ const EXPANSION_ITEMS : {[name in TabConfigName]+?: TabConfig} = {
default:true,
}
],
[TAB_CONFIG_RECENT]: [
'recent': [
{
icon: icons.SCHEDULE_ICON,
display_name: 'Recent',
collection: new CollectionDescription('everything', ['has-content'], 'recent', false),
}
],
[TAB_CONFIG_READING_LIST]: [
'reading-list': [
{
icon: icons.PLAYLIST_PLAY_ICON,
display_name: 'Your reading list',
Expand All @@ -185,7 +167,7 @@ const EXPANSION_ITEMS : {[name in TabConfigName]+?: TabConfig} = {
fallback_cards: [READING_LIST_FALLBACK_CARD],
}
],
[TAB_CONFIG_STARRED]: [
'starred': [
{
icon: icons.STAR_ICON,
display_name: 'Your starred cards',
Expand All @@ -194,15 +176,15 @@ const EXPANSION_ITEMS : {[name in TabConfigName]+?: TabConfig} = {
fallback_cards: [STARS_FALLBACK_CARD],
}
],
[TAB_CONFIG_UNREAD]: [
'unread': [
{
icon: icons.VISIBILITY_ICON,
display_name: 'Cards you haven\'t read yet',
collection: new CollectionDescription('main', ['unread']),
count: true,
}
],
[TAB_CONFIG_WORKING_NOTES]: [
'working-notes': [
{
icon: icons.INSERT_DRIVE_FILE_ICON,
display_name: 'Working note cards',
Expand All @@ -211,7 +193,7 @@ const EXPANSION_ITEMS : {[name in TabConfigName]+?: TabConfig} = {
hideIfEmpty: true,
}
],
[TAB_CONFIG_CONCEPTS]: [
'concepts': [
{
icon: icons.MENU_BOOK_ICON,
display_name: 'Concept cards',
Expand All @@ -220,7 +202,7 @@ const EXPANSION_ITEMS : {[name in TabConfigName]+?: TabConfig} = {
hideIfEmpty: true,
}
],
[TAB_CONFIG_TWITTER]: [
'twitter': [
{
icon: icons.TWITTER_ICON,
display_name: '@' + TWITTER_HANDLE + ' tweets multiple times a day with cards from this collection. It\'s a great way to dip your toe in the content.',
Expand All @@ -229,7 +211,7 @@ const EXPANSION_ITEMS : {[name in TabConfigName]+?: TabConfig} = {
hide: !TWITTER_HANDLE,
}
],
[TAB_CONFIG_RANDOM]: [
'random': [
{
icon: icons.CASINO_ICON,
display_name: 'Random card (⌘⌥⇧R)',
Expand Down Expand Up @@ -275,18 +257,22 @@ const expandTabConfigItem = (configItem : TabConfigItem, sections : Sections, ta
//expansion item (once each for each item in the expansion). That means you
//can set non-default properties, e.g. {expand:'concept', default:true} and
//have the default:true still exist after expansion.
if (EXPANSION_ITEMS[configItem.expand]) return [[...EXPANSION_ITEMS[configItem.expand].map(item => ({...configItemWithoutExpand, ...tabConfigItem(item)}))], true];
if (configItem.expand in EXPANSION_ITEMS) {
//eslint-disable-next-line @typescript-eslint/no-explicit-any
const items = (EXPANSION_ITEMS as any)[configItem.expand] as TabConfig;
return [[...items.map(item => ({...configItemWithoutExpand, ...tabConfigItem(item)}))], true];
}

if (configItem.expand == TAB_CONFIG_SECTIONS) {
if (configItem.expand == 'sections') {
return [tabsForSections(sections, false), true];
}
if (configItem.expand == TAB_CONFIG_HIDDEN_SECTIONS) {
if (configItem.expand == 'hidden_sections') {
return [tabsForSections(sections, true), true];
}
if (configItem.expand == TAB_CONFIG_TAGS) {
if (configItem.expand == 'tags') {
return [tabsForSections(tags), true];
}
if (configItem.expand == TAB_CONFIG_HIDDEN_TAGS) {
if (configItem.expand == 'hidden_tags') {
return [tabsForSections(tags, true), true];
}

Expand Down
34 changes: 0 additions & 34 deletions src/type_constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,40 +117,6 @@ export const EDITOR_CONTENT_TAB_TYPES = {
[EDITOR_TAB_TODO]: true,
};

export const TAB_CONFIG_DEFAULT_TABS = 'default_tabs';
export const TAB_CONFIG_DEFAULT_END_TABS = 'default_end_tabs';
export const TAB_CONFIG_SECTIONS = 'sections';
export const TAB_CONFIG_HIDDEN_SECTIONS = 'hidden_sections';
export const TAB_CONFIG_TAGS = 'tags';
export const TAB_CONFIG_HIDDEN_TAGS = 'hidden_tags';
export const TAB_CONFIG_POPULAR = 'popular';
export const TAB_CONFIG_RECENT = 'recent';
export const TAB_CONFIG_READING_LIST = 'reading-list';
export const TAB_CONFIG_STARRED = 'starred';
export const TAB_CONFIG_UNREAD = 'unread';
export const TAB_CONFIG_WORKING_NOTES = 'working-notes';
export const TAB_CONFIG_CONCEPTS = 'concepts';
export const TAB_CONFIG_TWITTER = 'twitter';
export const TAB_CONFIG_RANDOM = 'random';

export const TAB_CONFIG_TYPES = {
[TAB_CONFIG_DEFAULT_TABS]: true,
[TAB_CONFIG_DEFAULT_END_TABS]: true,
[TAB_CONFIG_SECTIONS]: true,
[TAB_CONFIG_HIDDEN_SECTIONS]: true,
[TAB_CONFIG_TAGS]: true,
[TAB_CONFIG_HIDDEN_TAGS]: true,
[TAB_CONFIG_POPULAR]: true,
[TAB_CONFIG_RECENT]: true,
[TAB_CONFIG_READING_LIST]: true,
[TAB_CONFIG_STARRED]: true,
[TAB_CONFIG_UNREAD]: true,
[TAB_CONFIG_WORKING_NOTES]: true,
[TAB_CONFIG_CONCEPTS]: true,
[TAB_CONFIG_TWITTER]: true,
[TAB_CONFIG_RANDOM]: true
};

export const CARDS_COLLECTION = 'cards';
export const CARD_UPDATES_COLLECTION = 'updates';
export const SECTION_UPDATES_COLLECTION = 'updates';
Expand Down
24 changes: 21 additions & 3 deletions src/types_simple.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
//generate:schema doens't have to import the whole project.

import {
TAB_CONFIG_TYPES
} from './type_constants.js';
z
} from 'zod';

//Ugh doesn't this import kind of ruin the point?
import * as icons from './components/my-icons.js';
Expand All @@ -12,7 +12,25 @@ export type CardID = string;
export type Slug = string;
export type CardIdentifier = CardID | Slug;

export type TabConfigName = keyof(typeof TAB_CONFIG_TYPES);
const tabConfigName = z.enum([
'default_tabs',
'default_end_tabs',
'sections',
'hidden_sections',
'tags',
'hidden_tags',
'popular',
'recent',
'reading-list',
'starred',
'unread',
'working-notes',
'concepts',
'twitter',
'random'
]);

export type TabConfigName = z.infer<typeof tabConfigName>;

export type IconName = keyof(typeof icons);

Expand Down

0 comments on commit 5e0316d

Please sign in to comment.