diff --git a/apps/cms/src/api/.gitkeep b/apps/cms/src/api/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/cms/src/api/bookshelf-entry/content-types/bookshelf-entry/schema.json b/apps/cms/src/api/bookshelf-entry/content-types/bookshelf-entry/schema.json new file mode 100644 index 0000000..5ff135a --- /dev/null +++ b/apps/cms/src/api/bookshelf-entry/content-types/bookshelf-entry/schema.json @@ -0,0 +1,71 @@ +{ + "kind": "collectionType", + "collectionName": "bookshelf_entries", + "info": { + "singularName": "bookshelf-entry", + "pluralName": "bookshelf-entries", + "displayName": "Bookshelf Entry", + "description": "Books and papers, synced to content/bookshelf/. `kind` selects which identifier fields apply." + }, + "options": { + "draftAndPublish": false + }, + "attributes": { + "title": { + "type": "string", + "required": true + }, + "kind": { + "type": "enumeration", + "enum": ["book", "paper"], + "required": true + }, + "authors": { + "type": "json", + "description": "Array of author name strings" + }, + "isbn": { + "type": "string", + "description": "Books only" + }, + "doi": { + "type": "string", + "description": "Papers only" + }, + "arxiv_id": { + "type": "string", + "description": "Papers only, optional" + }, + "url": { + "type": "string", + "description": "Papers only: landing page / source link" + }, + "cover_image": { + "type": "string", + "description": "Path to the locally cached cover, e.g. /covers/slug.jpg" + }, + "rating": { + "type": "integer", + "min": 1, + "max": 5 + }, + "status": { + "type": "enumeration", + "enum": ["reading", "read", "abandoned"] + }, + "date_started": { + "type": "date" + }, + "date_finished": { + "type": "date" + }, + "tags": { + "type": "json", + "description": "Array of tag strings, maps to [taxonomies].tags" + }, + "body": { + "type": "richtext", + "description": "Personal review/notes below the frontmatter" + } + } +} diff --git a/apps/cms/src/api/bookshelf-entry/controllers/bookshelf-entry.ts b/apps/cms/src/api/bookshelf-entry/controllers/bookshelf-entry.ts new file mode 100644 index 0000000..16fd704 --- /dev/null +++ b/apps/cms/src/api/bookshelf-entry/controllers/bookshelf-entry.ts @@ -0,0 +1,5 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreController( + "api::bookshelf-entry.bookshelf-entry", +); diff --git a/apps/cms/src/api/bookshelf-entry/routes/bookshelf-entry.ts b/apps/cms/src/api/bookshelf-entry/routes/bookshelf-entry.ts new file mode 100644 index 0000000..64e6058 --- /dev/null +++ b/apps/cms/src/api/bookshelf-entry/routes/bookshelf-entry.ts @@ -0,0 +1,5 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreRouter( + "api::bookshelf-entry.bookshelf-entry", +); diff --git a/apps/cms/src/api/bookshelf-entry/services/bookshelf-entry.ts b/apps/cms/src/api/bookshelf-entry/services/bookshelf-entry.ts new file mode 100644 index 0000000..a0e78be --- /dev/null +++ b/apps/cms/src/api/bookshelf-entry/services/bookshelf-entry.ts @@ -0,0 +1,5 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreService( + "api::bookshelf-entry.bookshelf-entry", +); diff --git a/apps/cms/src/api/curated-blog/content-types/curated-blog/schema.json b/apps/cms/src/api/curated-blog/content-types/curated-blog/schema.json new file mode 100644 index 0000000..50e6359 --- /dev/null +++ b/apps/cms/src/api/curated-blog/content-types/curated-blog/schema.json @@ -0,0 +1,30 @@ +{ + "kind": "collectionType", + "collectionName": "curated_blogs", + "info": { + "singularName": "curated-blog", + "pluralName": "curated-blogs", + "displayName": "Curated Blog", + "description": "Hand-picked external blogs, synced to content/blogs/. No live feed fetching." + }, + "options": { + "draftAndPublish": false + }, + "attributes": { + "title": { + "type": "string", + "required": true + }, + "url": { + "type": "string", + "required": true + }, + "feed_url": { + "type": "string" + }, + "body": { + "type": "richtext", + "description": "One-to-two sentence blurb below the frontmatter" + } + } +} diff --git a/apps/cms/src/api/curated-blog/controllers/curated-blog.ts b/apps/cms/src/api/curated-blog/controllers/curated-blog.ts new file mode 100644 index 0000000..952144e --- /dev/null +++ b/apps/cms/src/api/curated-blog/controllers/curated-blog.ts @@ -0,0 +1,3 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreController("api::curated-blog.curated-blog"); diff --git a/apps/cms/src/api/curated-blog/routes/curated-blog.ts b/apps/cms/src/api/curated-blog/routes/curated-blog.ts new file mode 100644 index 0000000..499db48 --- /dev/null +++ b/apps/cms/src/api/curated-blog/routes/curated-blog.ts @@ -0,0 +1,3 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreRouter("api::curated-blog.curated-blog"); diff --git a/apps/cms/src/api/curated-blog/services/curated-blog.ts b/apps/cms/src/api/curated-blog/services/curated-blog.ts new file mode 100644 index 0000000..6cab85b --- /dev/null +++ b/apps/cms/src/api/curated-blog/services/curated-blog.ts @@ -0,0 +1,3 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreService("api::curated-blog.curated-blog"); diff --git a/apps/cms/src/api/portfolio-entry/content-types/portfolio-entry/schema.json b/apps/cms/src/api/portfolio-entry/content-types/portfolio-entry/schema.json new file mode 100644 index 0000000..8518d91 --- /dev/null +++ b/apps/cms/src/api/portfolio-entry/content-types/portfolio-entry/schema.json @@ -0,0 +1,50 @@ +{ + "kind": "collectionType", + "collectionName": "portfolio_entries", + "info": { + "singularName": "portfolio-entry", + "pluralName": "portfolio-entries", + "displayName": "Portfolio Entry", + "description": "Projects and professional work, synced to content/portfolio/." + }, + "options": { + "draftAndPublish": false + }, + "attributes": { + "title": { + "type": "string", + "required": true + }, + "description": { + "type": "text" + }, + "role": { + "type": "string" + }, + "date_start": { + "type": "date" + }, + "date_end": { + "type": "date" + }, + "outcome": { + "type": "string" + }, + "draft": { + "type": "boolean", + "default": false + }, + "links": { + "type": "json", + "description": "Array of { label, url }, maps to [[links]]" + }, + "tags": { + "type": "json", + "description": "Array of tag strings, maps to [taxonomies].tags" + }, + "body": { + "type": "richtext", + "description": "Markdown case-study body below the frontmatter" + } + } +} diff --git a/apps/cms/src/api/portfolio-entry/controllers/portfolio-entry.ts b/apps/cms/src/api/portfolio-entry/controllers/portfolio-entry.ts new file mode 100644 index 0000000..f6bb0e3 --- /dev/null +++ b/apps/cms/src/api/portfolio-entry/controllers/portfolio-entry.ts @@ -0,0 +1,5 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreController( + "api::portfolio-entry.portfolio-entry", +); diff --git a/apps/cms/src/api/portfolio-entry/routes/portfolio-entry.ts b/apps/cms/src/api/portfolio-entry/routes/portfolio-entry.ts new file mode 100644 index 0000000..6c1fa5c --- /dev/null +++ b/apps/cms/src/api/portfolio-entry/routes/portfolio-entry.ts @@ -0,0 +1,5 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreRouter( + "api::portfolio-entry.portfolio-entry", +); diff --git a/apps/cms/src/api/portfolio-entry/services/portfolio-entry.ts b/apps/cms/src/api/portfolio-entry/services/portfolio-entry.ts new file mode 100644 index 0000000..52e584e --- /dev/null +++ b/apps/cms/src/api/portfolio-entry/services/portfolio-entry.ts @@ -0,0 +1,5 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreService( + "api::portfolio-entry.portfolio-entry", +); diff --git a/apps/cms/src/api/writing/content-types/writing/schema.json b/apps/cms/src/api/writing/content-types/writing/schema.json new file mode 100644 index 0000000..aa3b19f --- /dev/null +++ b/apps/cms/src/api/writing/content-types/writing/schema.json @@ -0,0 +1,59 @@ +{ + "kind": "collectionType", + "collectionName": "writings", + "info": { + "singularName": "writing", + "pluralName": "writings", + "displayName": "Writing", + "description": "Long-form essays and technical posts, synced to content/writings/." + }, + "options": { + "draftAndPublish": false + }, + "attributes": { + "title": { + "type": "string", + "required": true + }, + "description": { + "type": "text" + }, + "author": { + "type": "string" + }, + "date": { + "type": "date", + "required": true + }, + "updated": { + "type": "date" + }, + "draft": { + "type": "boolean", + "default": false + }, + "canonical_url": { + "type": "string" + }, + "tags": { + "type": "json", + "description": "Array of tag strings, maps to [taxonomies].tags" + }, + "series": { + "type": "string", + "description": "Maps to [extra].series" + }, + "series_index": { + "type": "integer", + "description": "Maps to [extra].series_index" + }, + "llms_description": { + "type": "text", + "description": "Maps to [extra].llms_description" + }, + "body": { + "type": "richtext", + "description": "Markdown body below the frontmatter" + } + } +} diff --git a/apps/cms/src/api/writing/controllers/writing.ts b/apps/cms/src/api/writing/controllers/writing.ts new file mode 100644 index 0000000..f473567 --- /dev/null +++ b/apps/cms/src/api/writing/controllers/writing.ts @@ -0,0 +1,3 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreController("api::writing.writing"); diff --git a/apps/cms/src/api/writing/routes/writing.ts b/apps/cms/src/api/writing/routes/writing.ts new file mode 100644 index 0000000..243fe48 --- /dev/null +++ b/apps/cms/src/api/writing/routes/writing.ts @@ -0,0 +1,3 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreRouter("api::writing.writing"); diff --git a/apps/cms/src/api/writing/services/writing.ts b/apps/cms/src/api/writing/services/writing.ts new file mode 100644 index 0000000..43c2301 --- /dev/null +++ b/apps/cms/src/api/writing/services/writing.ts @@ -0,0 +1,3 @@ +import { factories } from "@strapi/strapi"; + +export default factories.createCoreService("api::writing.writing"); diff --git a/apps/cms/types/generated/components.d.ts b/apps/cms/types/generated/components.d.ts new file mode 100644 index 0000000..41aa563 --- /dev/null +++ b/apps/cms/types/generated/components.d.ts @@ -0,0 +1,3 @@ +/* + * The app doesn't have any components yet. + */ diff --git a/apps/cms/types/generated/contentTypes.d.ts b/apps/cms/types/generated/contentTypes.d.ts new file mode 100644 index 0000000..9398e23 --- /dev/null +++ b/apps/cms/types/generated/contentTypes.d.ts @@ -0,0 +1,1135 @@ +import type { Schema, Struct } from "@strapi/strapi"; + +export interface AdminApiToken extends Struct.CollectionTypeSchema { + collectionName: "strapi_api_tokens"; + info: { + description: ""; + displayName: "Api Token"; + name: "Api Token"; + pluralName: "api-tokens"; + singularName: "api-token"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + accessKey: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + adminPermissions: Schema.Attribute.Relation< + "oneToMany", + "admin::permission" + >; + adminUserOwner: Schema.Attribute.Relation<"manyToOne", "admin::user">; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + description: Schema.Attribute.String & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }> & + Schema.Attribute.DefaultTo<"">; + encryptedKey: Schema.Attribute.Text & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + expiresAt: Schema.Attribute.DateTime; + kind: Schema.Attribute.Enumeration<["content-api", "admin"]> & + Schema.Attribute.Required & + Schema.Attribute.DefaultTo<"content-api">; + lastUsedAt: Schema.Attribute.DateTime; + lifespan: Schema.Attribute.BigInteger; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation<"oneToMany", "admin::api-token"> & + Schema.Attribute.Private; + name: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Unique & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + permissions: Schema.Attribute.Relation< + "oneToMany", + "admin::api-token-permission" + >; + publishedAt: Schema.Attribute.DateTime; + type: Schema.Attribute.Enumeration<["read-only", "full-access", "custom"]> & + Schema.Attribute.DefaultTo<"read-only">; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface AdminApiTokenPermission extends Struct.CollectionTypeSchema { + collectionName: "strapi_api_token_permissions"; + info: { + description: ""; + displayName: "API Token Permission"; + name: "API Token Permission"; + pluralName: "api-token-permissions"; + singularName: "api-token-permission"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + action: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "admin::api-token-permission" + > & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + token: Schema.Attribute.Relation<"manyToOne", "admin::api-token">; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface AdminPermission extends Struct.CollectionTypeSchema { + collectionName: "admin_permissions"; + info: { + description: ""; + displayName: "Permission"; + name: "Permission"; + pluralName: "permissions"; + singularName: "permission"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + action: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + actionParameters: Schema.Attribute.JSON & Schema.Attribute.DefaultTo<{}>; + apiToken: Schema.Attribute.Relation<"manyToOne", "admin::api-token">; + conditions: Schema.Attribute.JSON & Schema.Attribute.DefaultTo<[]>; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation<"oneToMany", "admin::permission"> & + Schema.Attribute.Private; + properties: Schema.Attribute.JSON & Schema.Attribute.DefaultTo<{}>; + publishedAt: Schema.Attribute.DateTime; + role: Schema.Attribute.Relation<"manyToOne", "admin::role">; + subject: Schema.Attribute.String & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface AdminRole extends Struct.CollectionTypeSchema { + collectionName: "admin_roles"; + info: { + description: ""; + displayName: "Role"; + name: "Role"; + pluralName: "roles"; + singularName: "role"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + code: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Unique & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + description: Schema.Attribute.String; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation<"oneToMany", "admin::role"> & + Schema.Attribute.Private; + name: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Unique & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + permissions: Schema.Attribute.Relation<"oneToMany", "admin::permission">; + publishedAt: Schema.Attribute.DateTime; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + users: Schema.Attribute.Relation<"manyToMany", "admin::user">; + }; +} + +export interface AdminSession extends Struct.CollectionTypeSchema { + collectionName: "strapi_sessions"; + info: { + description: "Session Manager storage"; + displayName: "Session"; + name: "Session"; + pluralName: "sessions"; + singularName: "session"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + i18n: { + localized: false; + }; + }; + attributes: { + absoluteExpiresAt: Schema.Attribute.DateTime & Schema.Attribute.Private; + childId: Schema.Attribute.String & Schema.Attribute.Private; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + deviceId: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Private; + expiresAt: Schema.Attribute.DateTime & + Schema.Attribute.Required & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation<"oneToMany", "admin::session"> & + Schema.Attribute.Private; + metadata: Schema.Attribute.JSON & Schema.Attribute.Private; + origin: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + sessionId: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Private & + Schema.Attribute.Unique; + status: Schema.Attribute.String & Schema.Attribute.Private; + type: Schema.Attribute.String & Schema.Attribute.Private; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + userId: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Private; + }; +} + +export interface AdminTransferToken extends Struct.CollectionTypeSchema { + collectionName: "strapi_transfer_tokens"; + info: { + description: ""; + displayName: "Transfer Token"; + name: "Transfer Token"; + pluralName: "transfer-tokens"; + singularName: "transfer-token"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + accessKey: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + description: Schema.Attribute.String & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }> & + Schema.Attribute.DefaultTo<"">; + expiresAt: Schema.Attribute.DateTime; + lastUsedAt: Schema.Attribute.DateTime; + lifespan: Schema.Attribute.BigInteger; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "admin::transfer-token" + > & + Schema.Attribute.Private; + name: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Unique & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + permissions: Schema.Attribute.Relation< + "oneToMany", + "admin::transfer-token-permission" + >; + publishedAt: Schema.Attribute.DateTime; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface AdminTransferTokenPermission + extends Struct.CollectionTypeSchema { + collectionName: "strapi_transfer_token_permissions"; + info: { + description: ""; + displayName: "Transfer Token Permission"; + name: "Transfer Token Permission"; + pluralName: "transfer-token-permissions"; + singularName: "transfer-token-permission"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + action: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "admin::transfer-token-permission" + > & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + token: Schema.Attribute.Relation<"manyToOne", "admin::transfer-token">; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface AdminUser extends Struct.CollectionTypeSchema { + collectionName: "admin_users"; + info: { + description: ""; + displayName: "User"; + name: "User"; + pluralName: "users"; + singularName: "user"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + apiTokens: Schema.Attribute.Relation<"oneToMany", "admin::api-token"> & + Schema.Attribute.Private; + blocked: Schema.Attribute.Boolean & + Schema.Attribute.Private & + Schema.Attribute.DefaultTo; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + email: Schema.Attribute.Email & + Schema.Attribute.Required & + Schema.Attribute.Private & + Schema.Attribute.Unique & + Schema.Attribute.SetMinMaxLength<{ + minLength: 6; + }>; + firstname: Schema.Attribute.String & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + isActive: Schema.Attribute.Boolean & + Schema.Attribute.Private & + Schema.Attribute.DefaultTo; + lastname: Schema.Attribute.String & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation<"oneToMany", "admin::user"> & + Schema.Attribute.Private; + password: Schema.Attribute.Password & + Schema.Attribute.Private & + Schema.Attribute.SetMinMaxLength<{ + minLength: 6; + }>; + preferedLanguage: Schema.Attribute.String; + publishedAt: Schema.Attribute.DateTime; + registrationToken: Schema.Attribute.String & Schema.Attribute.Private; + resetPasswordToken: Schema.Attribute.String & Schema.Attribute.Private; + resetPasswordTokenExpiresAt: Schema.Attribute.DateTime & + Schema.Attribute.Private; + roles: Schema.Attribute.Relation<"manyToMany", "admin::role"> & + Schema.Attribute.Private; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + username: Schema.Attribute.String; + }; +} + +export interface ApiBookshelfEntryBookshelfEntry + extends Struct.CollectionTypeSchema { + collectionName: "bookshelf_entries"; + info: { + description: "Books and papers, synced to content/bookshelf/. `kind` selects which identifier fields apply."; + displayName: "Bookshelf Entry"; + pluralName: "bookshelf-entries"; + singularName: "bookshelf-entry"; + }; + options: { + draftAndPublish: false; + }; + attributes: { + arxiv_id: Schema.Attribute.String; + authors: Schema.Attribute.JSON; + body: Schema.Attribute.RichText; + cover_image: Schema.Attribute.String; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + date_finished: Schema.Attribute.Date; + date_started: Schema.Attribute.Date; + doi: Schema.Attribute.String; + isbn: Schema.Attribute.String; + kind: Schema.Attribute.Enumeration<["book", "paper"]> & + Schema.Attribute.Required; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "api::bookshelf-entry.bookshelf-entry" + > & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + rating: Schema.Attribute.Integer & + Schema.Attribute.SetMinMax< + { + max: 5; + min: 1; + }, + number + >; + status: Schema.Attribute.Enumeration<["reading", "read", "abandoned"]>; + tags: Schema.Attribute.JSON; + title: Schema.Attribute.String & Schema.Attribute.Required; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + url: Schema.Attribute.String; + }; +} + +export interface ApiCuratedBlogCuratedBlog extends Struct.CollectionTypeSchema { + collectionName: "curated_blogs"; + info: { + description: "Hand-picked external blogs, synced to content/blogs/. No live feed fetching."; + displayName: "Curated Blog"; + pluralName: "curated-blogs"; + singularName: "curated-blog"; + }; + options: { + draftAndPublish: false; + }; + attributes: { + body: Schema.Attribute.RichText; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + feed_url: Schema.Attribute.String; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "api::curated-blog.curated-blog" + > & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + title: Schema.Attribute.String & Schema.Attribute.Required; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + url: Schema.Attribute.String & Schema.Attribute.Required; + }; +} + +export interface ApiPortfolioEntryPortfolioEntry + extends Struct.CollectionTypeSchema { + collectionName: "portfolio_entries"; + info: { + description: "Projects and professional work, synced to content/portfolio/."; + displayName: "Portfolio Entry"; + pluralName: "portfolio-entries"; + singularName: "portfolio-entry"; + }; + options: { + draftAndPublish: false; + }; + attributes: { + body: Schema.Attribute.RichText; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + date_end: Schema.Attribute.Date; + date_start: Schema.Attribute.Date; + description: Schema.Attribute.Text; + draft: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo; + links: Schema.Attribute.JSON; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "api::portfolio-entry.portfolio-entry" + > & + Schema.Attribute.Private; + outcome: Schema.Attribute.String; + publishedAt: Schema.Attribute.DateTime; + role: Schema.Attribute.String; + tags: Schema.Attribute.JSON; + title: Schema.Attribute.String & Schema.Attribute.Required; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface ApiWritingWriting extends Struct.CollectionTypeSchema { + collectionName: "writings"; + info: { + description: "Long-form essays and technical posts, synced to content/writings/."; + displayName: "Writing"; + pluralName: "writings"; + singularName: "writing"; + }; + options: { + draftAndPublish: false; + }; + attributes: { + author: Schema.Attribute.String; + body: Schema.Attribute.RichText; + canonical_url: Schema.Attribute.String; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + date: Schema.Attribute.Date & Schema.Attribute.Required; + description: Schema.Attribute.Text; + draft: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo; + llms_description: Schema.Attribute.Text; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "api::writing.writing" + > & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + series: Schema.Attribute.String; + series_index: Schema.Attribute.Integer; + tags: Schema.Attribute.JSON; + title: Schema.Attribute.String & Schema.Attribute.Required; + updated: Schema.Attribute.Date; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface PluginContentReleasesRelease + extends Struct.CollectionTypeSchema { + collectionName: "strapi_releases"; + info: { + displayName: "Release"; + pluralName: "releases"; + singularName: "release"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + actions: Schema.Attribute.Relation< + "oneToMany", + "plugin::content-releases.release-action" + >; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::content-releases.release" + > & + Schema.Attribute.Private; + name: Schema.Attribute.String & Schema.Attribute.Required; + publishedAt: Schema.Attribute.DateTime; + releasedAt: Schema.Attribute.DateTime; + scheduledAt: Schema.Attribute.DateTime; + status: Schema.Attribute.Enumeration< + ["ready", "blocked", "failed", "done", "empty"] + > & + Schema.Attribute.Required; + timezone: Schema.Attribute.String; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface PluginContentReleasesReleaseAction + extends Struct.CollectionTypeSchema { + collectionName: "strapi_release_actions"; + info: { + displayName: "Release Action"; + pluralName: "release-actions"; + singularName: "release-action"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + contentType: Schema.Attribute.String & Schema.Attribute.Required; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + entryDocumentId: Schema.Attribute.String; + isEntryValid: Schema.Attribute.Boolean; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::content-releases.release-action" + > & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + release: Schema.Attribute.Relation< + "manyToOne", + "plugin::content-releases.release" + >; + type: Schema.Attribute.Enumeration<["publish", "unpublish"]> & + Schema.Attribute.Required; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface PluginI18NLocale extends Struct.CollectionTypeSchema { + collectionName: "i18n_locale"; + info: { + collectionName: "locales"; + description: ""; + displayName: "Locale"; + pluralName: "locales"; + singularName: "locale"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + code: Schema.Attribute.String & Schema.Attribute.Unique; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::i18n.locale" + > & + Schema.Attribute.Private; + name: Schema.Attribute.String & + Schema.Attribute.SetMinMax< + { + max: 50; + min: 1; + }, + number + >; + publishedAt: Schema.Attribute.DateTime; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface PluginReviewWorkflowsWorkflow + extends Struct.CollectionTypeSchema { + collectionName: "strapi_workflows"; + info: { + description: ""; + displayName: "Workflow"; + name: "Workflow"; + pluralName: "workflows"; + singularName: "workflow"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + contentTypes: Schema.Attribute.JSON & + Schema.Attribute.Required & + Schema.Attribute.DefaultTo<"[]">; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::review-workflows.workflow" + > & + Schema.Attribute.Private; + name: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Unique; + publishedAt: Schema.Attribute.DateTime; + stageRequiredToPublish: Schema.Attribute.Relation< + "oneToOne", + "plugin::review-workflows.workflow-stage" + >; + stages: Schema.Attribute.Relation< + "oneToMany", + "plugin::review-workflows.workflow-stage" + >; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface PluginReviewWorkflowsWorkflowStage + extends Struct.CollectionTypeSchema { + collectionName: "strapi_workflows_stages"; + info: { + description: ""; + displayName: "Stages"; + name: "Workflow Stage"; + pluralName: "workflow-stages"; + singularName: "workflow-stage"; + }; + options: { + draftAndPublish: false; + version: "1.1.0"; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + color: Schema.Attribute.String & Schema.Attribute.DefaultTo<"#4945FF">; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::review-workflows.workflow-stage" + > & + Schema.Attribute.Private; + name: Schema.Attribute.String; + permissions: Schema.Attribute.Relation<"manyToMany", "admin::permission">; + publishedAt: Schema.Attribute.DateTime; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + workflow: Schema.Attribute.Relation< + "manyToOne", + "plugin::review-workflows.workflow" + >; + }; +} + +export interface PluginUploadFile extends Struct.CollectionTypeSchema { + collectionName: "files"; + info: { + description: ""; + displayName: "File"; + pluralName: "files"; + singularName: "file"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + alternativeText: Schema.Attribute.Text; + caption: Schema.Attribute.Text; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + ext: Schema.Attribute.String; + focalPoint: Schema.Attribute.JSON; + folder: Schema.Attribute.Relation<"manyToOne", "plugin::upload.folder"> & + Schema.Attribute.Private; + folderPath: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Private & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + formats: Schema.Attribute.JSON; + hash: Schema.Attribute.String & Schema.Attribute.Required; + height: Schema.Attribute.Integer; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::upload.file" + > & + Schema.Attribute.Private; + mime: Schema.Attribute.String & Schema.Attribute.Required; + name: Schema.Attribute.String & Schema.Attribute.Required; + previewUrl: Schema.Attribute.Text; + provider: Schema.Attribute.String & Schema.Attribute.Required; + provider_metadata: Schema.Attribute.JSON; + publishedAt: Schema.Attribute.DateTime; + related: Schema.Attribute.Relation<"morphToMany">; + size: Schema.Attribute.Decimal & Schema.Attribute.Required; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + url: Schema.Attribute.Text & Schema.Attribute.Required; + width: Schema.Attribute.Integer; + }; +} + +export interface PluginUploadFolder extends Struct.CollectionTypeSchema { + collectionName: "upload_folders"; + info: { + displayName: "Folder"; + pluralName: "folders"; + singularName: "folder"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + children: Schema.Attribute.Relation<"oneToMany", "plugin::upload.folder">; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + files: Schema.Attribute.Relation<"oneToMany", "plugin::upload.file">; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::upload.folder" + > & + Schema.Attribute.Private; + name: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + parent: Schema.Attribute.Relation<"manyToOne", "plugin::upload.folder">; + path: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 1; + }>; + pathId: Schema.Attribute.Integer & + Schema.Attribute.Required & + Schema.Attribute.Unique; + publishedAt: Schema.Attribute.DateTime; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface PluginUsersPermissionsPermission + extends Struct.CollectionTypeSchema { + collectionName: "up_permissions"; + info: { + description: ""; + displayName: "Permission"; + name: "permission"; + pluralName: "permissions"; + singularName: "permission"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + action: Schema.Attribute.String & Schema.Attribute.Required; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.permission" + > & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + role: Schema.Attribute.Relation< + "manyToOne", + "plugin::users-permissions.role" + >; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface PluginUsersPermissionsRole + extends Struct.CollectionTypeSchema { + collectionName: "up_roles"; + info: { + description: ""; + displayName: "Role"; + name: "role"; + pluralName: "roles"; + singularName: "role"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + description: Schema.Attribute.String; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.role" + > & + Schema.Attribute.Private; + name: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 3; + }>; + permissions: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.permission" + >; + publishedAt: Schema.Attribute.DateTime; + type: Schema.Attribute.String & Schema.Attribute.Unique; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + users: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.user" + >; + }; +} + +export interface PluginUsersPermissionsUser + extends Struct.CollectionTypeSchema { + collectionName: "up_users"; + info: { + description: ""; + displayName: "User"; + name: "user"; + pluralName: "users"; + singularName: "user"; + }; + options: { + draftAndPublish: false; + timestamps: true; + }; + attributes: { + blocked: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo; + confirmationToken: Schema.Attribute.String & Schema.Attribute.Private; + confirmed: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + email: Schema.Attribute.Email & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 6; + }>; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.user" + > & + Schema.Attribute.Private; + password: Schema.Attribute.Password & + Schema.Attribute.Private & + Schema.Attribute.SetMinMaxLength<{ + minLength: 6; + }>; + provider: Schema.Attribute.String; + publishedAt: Schema.Attribute.DateTime; + resetPasswordToken: Schema.Attribute.String & Schema.Attribute.Private; + role: Schema.Attribute.Relation< + "manyToOne", + "plugin::users-permissions.role" + >; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + username: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Unique & + Schema.Attribute.SetMinMaxLength<{ + minLength: 3; + }>; + }; +} + +declare module "@strapi/strapi" { + export namespace Public { + export interface ContentTypeSchemas { + "admin::api-token": AdminApiToken; + "admin::api-token-permission": AdminApiTokenPermission; + "admin::permission": AdminPermission; + "admin::role": AdminRole; + "admin::session": AdminSession; + "admin::transfer-token": AdminTransferToken; + "admin::transfer-token-permission": AdminTransferTokenPermission; + "admin::user": AdminUser; + "api::bookshelf-entry.bookshelf-entry": ApiBookshelfEntryBookshelfEntry; + "api::curated-blog.curated-blog": ApiCuratedBlogCuratedBlog; + "api::portfolio-entry.portfolio-entry": ApiPortfolioEntryPortfolioEntry; + "api::writing.writing": ApiWritingWriting; + "plugin::content-releases.release": PluginContentReleasesRelease; + "plugin::content-releases.release-action": PluginContentReleasesReleaseAction; + "plugin::i18n.locale": PluginI18NLocale; + "plugin::review-workflows.workflow": PluginReviewWorkflowsWorkflow; + "plugin::review-workflows.workflow-stage": PluginReviewWorkflowsWorkflowStage; + "plugin::upload.file": PluginUploadFile; + "plugin::upload.folder": PluginUploadFolder; + "plugin::users-permissions.permission": PluginUsersPermissionsPermission; + "plugin::users-permissions.role": PluginUsersPermissionsRole; + "plugin::users-permissions.user": PluginUsersPermissionsUser; + } + } +} diff --git a/biome.json b/biome.json index f9a9ee2..fa8a217 100644 --- a/biome.json +++ b/biome.json @@ -12,7 +12,8 @@ "scripts/**", "!apps/**/dist", "!apps/**/.strapi", - "!apps/**/public" + "!apps/**/public", + "!apps/**/types/generated" ] }, "formatter": {