@notum-cz/strapi-plugin-tiptap-editor 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -55
- package/dist/_chunks/{RichTextInput-BZQ2iVqa.mjs → RichTextInput-COGVRWOW.mjs} +786 -596
- package/dist/_chunks/RichTextInput-COGVRWOW.mjs.map +1 -0
- package/dist/_chunks/{RichTextInput-BlxoJMa2.js → RichTextInput-Wc2q__HY.js} +785 -595
- package/dist/_chunks/RichTextInput-Wc2q__HY.js.map +1 -0
- package/dist/admin/index.js +23 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +23 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/components/BaseTiptapInput.d.ts +1 -0
- package/dist/admin/src/components/EditorErrorBoundary.d.ts +23 -0
- package/dist/admin/src/components/FeatureGuard.d.ts +15 -0
- package/dist/admin/src/components/PresetSelect.d.ts +7 -0
- package/dist/admin/src/extensions/Heading.d.ts +1 -0
- package/dist/admin/src/fields/richTextField.d.ts +18 -0
- package/dist/admin/src/hooks/usePresetConfig.d.ts +6 -0
- package/dist/admin/src/utils/buildExtensions.d.ts +3 -0
- package/dist/server/index.js +154 -6
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +153 -6
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/config/index.d.ts +7 -4
- package/dist/server/src/controllers/index.d.ts +8 -1
- package/dist/server/src/controllers/preset.d.ts +8 -0
- package/dist/server/src/index.d.ts +43 -5
- package/dist/server/src/routes/index.d.ts +15 -1
- package/dist/server/src/services/index.d.ts +9 -1
- package/dist/server/src/services/preset.d.ts +10 -0
- package/dist/shared/types.d.ts +54 -0
- package/package.json +11 -3
- package/dist/_chunks/AccentCursive-CpAPpH9C.mjs +0 -3383
- package/dist/_chunks/AccentCursive-CpAPpH9C.mjs.map +0 -1
- package/dist/_chunks/AccentCursive-D6sTlhub.js +0 -3384
- package/dist/_chunks/AccentCursive-D6sTlhub.js.map +0 -1
- package/dist/_chunks/FormattedHeadingInput-DycgfIze.mjs +0 -101
- package/dist/_chunks/FormattedHeadingInput-DycgfIze.mjs.map +0 -1
- package/dist/_chunks/FormattedHeadingInput-FFjiRSEJ.js +0 -101
- package/dist/_chunks/FormattedHeadingInput-FFjiRSEJ.js.map +0 -1
- package/dist/_chunks/RichTextInput-BZQ2iVqa.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-BbbQxPc-.js +0 -4414
- package/dist/_chunks/RichTextInput-BbbQxPc-.js.map +0 -1
- package/dist/_chunks/RichTextInput-BjLR2pi0.js +0 -4416
- package/dist/_chunks/RichTextInput-BjLR2pi0.js.map +0 -1
- package/dist/_chunks/RichTextInput-BlxoJMa2.js.map +0 -1
- package/dist/_chunks/RichTextInput-Bm3X8fR2.mjs +0 -4400
- package/dist/_chunks/RichTextInput-Bm3X8fR2.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-Bms-gSvK.js +0 -4407
- package/dist/_chunks/RichTextInput-Bms-gSvK.js.map +0 -1
- package/dist/_chunks/RichTextInput-BtNjPJRN.mjs +0 -4400
- package/dist/_chunks/RichTextInput-BtNjPJRN.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-Bw3tcXfp.js +0 -4407
- package/dist/_chunks/RichTextInput-Bw3tcXfp.js.map +0 -1
- package/dist/_chunks/RichTextInput-CsgNpoxq.mjs +0 -4409
- package/dist/_chunks/RichTextInput-CsgNpoxq.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-CwTvEMda.js +0 -4407
- package/dist/_chunks/RichTextInput-CwTvEMda.js.map +0 -1
- package/dist/_chunks/RichTextInput-DG-36krM.js +0 -1181
- package/dist/_chunks/RichTextInput-DG-36krM.js.map +0 -1
- package/dist/_chunks/RichTextInput-DLac-zNQ.mjs +0 -4400
- package/dist/_chunks/RichTextInput-DLac-zNQ.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-DSXttrvi.js +0 -4407
- package/dist/_chunks/RichTextInput-DSXttrvi.js.map +0 -1
- package/dist/_chunks/RichTextInput-DeJ6Exto.mjs +0 -4400
- package/dist/_chunks/RichTextInput-DeJ6Exto.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-DgT88AkO.mjs +0 -1175
- package/dist/_chunks/RichTextInput-DgT88AkO.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-DlMaDJQF.mjs +0 -4400
- package/dist/_chunks/RichTextInput-DlMaDJQF.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-DtaYdjCs.mjs +0 -4400
- package/dist/_chunks/RichTextInput-DtaYdjCs.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-YTKXo5oq.js +0 -4407
- package/dist/_chunks/RichTextInput-YTKXo5oq.js.map +0 -1
- package/dist/_chunks/RichTextInput-tmg-oMJk.mjs +0 -4407
- package/dist/_chunks/RichTextInput-tmg-oMJk.mjs.map +0 -1
- package/dist/_chunks/RichTextInput-umhMsI5o.js +0 -4407
- package/dist/_chunks/RichTextInput-umhMsI5o.js.map +0 -1
- package/dist/admin/src/components/FormattedHeadingInput.d.ts +0 -4
- package/dist/admin/src/extensions/AccentCursive.d.ts +0 -18
- package/dist/admin/src/fields/formattedHeadingField.d.ts +0 -20
- package/dist/admin/src/pluginId.d.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../server/src/bootstrap.ts","../../server/src/destroy.ts","../../shared/pluginId.ts","../../shared/fields.ts","../../server/src/fields/richTextField.ts","../../server/src/register.ts","../../server/src/config/index.ts","../../server/src/content-types/index.ts","../../server/src/controllers/index.ts","../../server/src/middlewares/index.ts","../../server/src/policies/index.ts","../../server/src/routes/index.ts","../../server/src/services/index.ts","../../server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/strapi';\n\nconst bootstrap = ({ strapi }: { strapi: Core.Strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","import type { Core } from '@strapi/strapi';\n\nconst destroy = ({ strapi }: { strapi: Core.Strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","export const PLUGIN_ID = 'tiptap-editor';\n","export const RICH_TEXT_FIELD_NAME = 'RichText';\n","import { PLUGIN_ID } from '../../../shared/pluginId';\nimport { RICH_TEXT_FIELD_NAME } from '../../../shared/fields';\nimport { CustomFieldServerOptions } from '@strapi/types/dist/modules/custom-fields';\n\nexport const richTextField: CustomFieldServerOptions = {\n name: RICH_TEXT_FIELD_NAME,\n plugin: PLUGIN_ID,\n type: 'text',\n inputSize: {\n default: 12,\n isResizable: true,\n },\n};\n","import type { Core } from '@strapi/strapi';\n\nimport { richTextField } from './fields/richTextField';\n\nconst register = ({ strapi }: { strapi: Core.Strapi }) => {\n strapi.customFields.register(richTextField);\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","export default {};\n","export default {};\n","export default {};\n","export default {};\n","export default {};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n register,\n bootstrap,\n destroy,\n config,\n controllers,\n routes,\n services,\n contentTypes,\n policies,\n middlewares,\n} as const; // Type Assertion necessary due to the error below\n\n/**\n * [ERROR] server/src/index.ts:19:1 - TS2742: The inferred type of 'default' cannot be named without a reference to '@strapi/core/node_modules/@strapi/types/dist/core'. This is likely not portable. A type annotation is necessary.\n */\n"],"names":[],"mappings":"AAEA,MAAM,YAAY,CAAC,EAAE,aAAsC;AAE3D;ACFA,MAAM,UAAU,CAAC,EAAE,aAAsC;AAEzD;ACJO,MAAM,YAAY;ACAlB,MAAM,uBAAuB;ACI7B,MAAM,gBAA0C;AAAA,EACrD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAEjB;ACRA,MAAM,WAAW,CAAC,EAAE,aAAsC;AACxD,SAAO,aAAa,SAAS,aAAa;AAC5C;ACNA,MAAA,SAAe;AAAA,EACb,SAAS,CAAA;AAAA,EACT,YAAY;AAAA,EAAC;AACf;ACHA,MAAA,eAAe,CAAA;ACAf,MAAA,cAAe,CAAA;ACAf,MAAA,cAAe,CAAA;ACAf,MAAA,WAAe,CAAA;ACAf,MAAA,SAAe,CAAA;ACAf,MAAA,WAAe,CAAA;ACkBf,MAAA,QAAe;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../server/src/bootstrap.ts","../../server/src/destroy.ts","../../shared/pluginId.ts","../../shared/fields.ts","../../server/src/fields/richTextField.ts","../../server/src/register.ts","../../shared/types.ts","../../server/src/config/index.ts","../../server/src/content-types/index.ts","../../server/src/controllers/preset.ts","../../server/src/controllers/index.ts","../../server/src/middlewares/index.ts","../../server/src/policies/index.ts","../../server/src/routes/index.ts","../../server/src/services/preset.ts","../../server/src/services/index.ts","../../server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/strapi';\n\nconst bootstrap = ({ strapi }: { strapi: Core.Strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","import type { Core } from '@strapi/strapi';\n\nconst destroy = ({ strapi }: { strapi: Core.Strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","export const PLUGIN_ID = 'tiptap-editor';\n","export const RICH_TEXT_FIELD_NAME = 'RichText';\n","import { PLUGIN_ID } from '../../../shared/pluginId';\nimport { RICH_TEXT_FIELD_NAME } from '../../../shared/fields';\nimport { CustomFieldServerOptions } from '@strapi/types/dist/modules/custom-fields';\n\nexport const richTextField: CustomFieldServerOptions = {\n name: RICH_TEXT_FIELD_NAME,\n plugin: PLUGIN_ID,\n type: 'text',\n inputSize: {\n default: 12,\n isResizable: true,\n },\n};\n","import type { Core } from '@strapi/strapi';\n\nimport { richTextField } from './fields/richTextField';\n\nconst register = ({ strapi }: { strapi: Core.Strapi }) => {\n strapi.customFields.register(richTextField);\n};\n\nexport default register;\n","// shared/types.ts\n\n// ─── Option types ───────────────────────────────────────────────────────────\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport type LinkConfig = {\n openOnClick?: boolean;\n HTMLAttributes?: Record<string, string>;\n};\n\nexport type TableConfig = {\n resizable?: boolean;\n};\n\nexport type TextAlignConfig = {\n types?: string[];\n alignments?: Array<'left' | 'center' | 'right' | 'justify'>;\n};\n\nexport type HeadingConfig = {\n levels?: HeadingLevel[];\n};\n\n// ─── Core types ──────────────────────────────────────────────────────────────\n\nexport interface TiptapPresetConfig {\n bold?: boolean | Record<string, unknown>;\n italic?: boolean | Record<string, unknown>;\n strike?: boolean | Record<string, unknown>;\n code?: boolean | Record<string, unknown>;\n codeBlock?: boolean | Record<string, unknown>;\n blockquote?: boolean | Record<string, unknown>;\n bulletList?: boolean | Record<string, unknown>;\n orderedList?: boolean | Record<string, unknown>;\n hardBreak?: boolean | Record<string, unknown>;\n horizontalRule?: boolean | Record<string, unknown>;\n history?: boolean | Record<string, unknown>;\n heading?: boolean | HeadingConfig;\n link?: boolean | LinkConfig;\n table?: boolean | TableConfig;\n textAlign?: boolean | TextAlignConfig;\n superscript?: boolean | Record<string, unknown>;\n subscript?: boolean | Record<string, unknown>;\n}\n\nexport interface TiptapPluginConfig {\n presets: Record<string, TiptapPresetConfig>;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nexport const PRESET_FEATURE_KEYS: Array<keyof TiptapPresetConfig> = [\n 'bold', 'italic', 'strike', 'code', 'codeBlock', 'blockquote',\n 'bulletList', 'orderedList', 'hardBreak', 'horizontalRule', 'history',\n 'heading', 'link', 'table', 'textAlign', 'superscript', 'subscript',\n];\n\n// Fallback for unconfigured fields — deliberately minimal to prompt developers to configure\nexport const MINIMAL_PRESET_CONFIG: TiptapPresetConfig = {\n bold: true,\n italic: true,\n};\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\n// ─── Utility functions ───────────────────────────────────────────────────────\n\n/**\n * Returns true when a preset feature value is enabled.\n * NOTE: undefined (absent key) returns true — absent key = feature enabled by default.\n * This DIVERGES from dist where undefined returns false.\n */\nexport const isFeatureEnabled = (\n value: TiptapPresetConfig[keyof TiptapPresetConfig]\n): boolean => {\n if (value === undefined) {\n return true; // TYPES-04: absent key = enabled\n }\n if (typeof value === 'boolean') {\n return value;\n }\n if (!isPlainObject(value)) {\n return false;\n }\n const obj = value as Record<string, unknown>;\n if (typeof obj.enabled === 'boolean') {\n return obj.enabled;\n }\n if (typeof obj.disabled === 'boolean') {\n return !obj.disabled;\n }\n return true;\n};\n\n/**\n * Returns the effective options for a feature.\n * - false → null (feature explicitly disabled, no options)\n * - true | undefined → defaults (feature enabled with default options)\n * - object → merged with defaults (feature enabled with custom options)\n *\n * NOTE: false returns null — DIVERGES from dist where false returns defaults.\n */\nexport const getFeatureOptions = <T extends Record<string, unknown>>(\n value: boolean | T | undefined,\n defaults: T\n): T | null => {\n if (value === false) {\n return null; // TYPES-05: explicitly disabled\n }\n if (!isPlainObject(value)) {\n return defaults; // true or undefined: return defaults\n }\n const { enabled: _e, disabled: _d, ...rest } = value as Record<string, unknown>;\n return { ...defaults, ...rest } as T;\n};\n","import {\n PRESET_FEATURE_KEYS,\n TiptapPluginConfig,\n TiptapPresetConfig,\n} from '../../../shared/types';\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst FEATURE_KEYS = new Set(PRESET_FEATURE_KEYS);\n\nconst getInvalidKeys = (presetConfig: unknown): string[] => {\n if (!isPlainObject(presetConfig)) return [];\n return Object.keys(presetConfig).filter(\n (key) => !FEATURE_KEYS.has(key as keyof TiptapPresetConfig)\n );\n};\n\nconst config = {\n default: {\n presets: {} as Record<string, TiptapPresetConfig>,\n },\n validator(pluginConfig: unknown): void {\n if (!isPlainObject(pluginConfig)) {\n throw new Error('tiptap-editor plugin config must be a plain object');\n }\n\n const typedConfig = pluginConfig as { presets?: unknown };\n const { presets } = typedConfig;\n\n if (presets === undefined) {\n return; // presets key is optional\n }\n\n if (!isPlainObject(presets)) {\n throw new Error('tiptap-editor config.presets must be a plain object');\n }\n\n const allInvalidKeys: string[] = [];\n for (const [presetName, presetConfig] of Object.entries(\n presets as Record<string, unknown>\n )) {\n const invalidKeys = getInvalidKeys(presetConfig);\n if (invalidKeys.length > 0) {\n allInvalidKeys.push(...invalidKeys);\n }\n }\n\n if (allInvalidKeys.length > 0) {\n throw new Error(\n `tiptap-editor config.presets contains invalid feature keys: ${allInvalidKeys.join(', ')}. ` +\n `Allowed keys: ${PRESET_FEATURE_KEYS.join(', ')}`\n );\n }\n },\n} satisfies { default: TiptapPluginConfig; validator: (config: unknown) => void };\n\nexport default config;\n","export default {};\n","import type { Core } from '@strapi/strapi';\nimport { MINIMAL_PRESET_CONFIG } from '../../../shared/types';\n\nconst createPresetController = ({ strapi }: { strapi: Core.Strapi }) => ({\n async find(ctx: any): Promise<void> {\n const presetService = strapi.plugin('tiptap-editor').service('preset') as any;\n ctx.body = { presets: presetService.listPresetNames() };\n },\n\n async findOne(ctx: any): Promise<void> {\n const presetService = strapi.plugin('tiptap-editor').service('preset') as any;\n const presetName: string = ctx.params?.name;\n const preset = presetService.getPreset(presetName);\n // Return MINIMAL_PRESET_CONFIG for unknown presets (never 404) — SERVER-03\n ctx.body = preset ?? MINIMAL_PRESET_CONFIG;\n },\n});\n\nexport default createPresetController;\n","import createPresetController from './preset';\n\nexport default {\n preset: createPresetController,\n};\n","export default {};\n","export default {};\n","export default {\n 'preset-routes': {\n type: 'admin' as const,\n routes: [\n {\n method: 'GET',\n path: '/presets',\n handler: 'preset.find',\n config: { auth: false, policies: [], middlewares: [] },\n },\n {\n method: 'GET',\n path: '/presets/:name',\n handler: 'preset.findOne',\n config: { auth: false, policies: [], middlewares: [] },\n },\n ],\n },\n};\n","import type { Core } from '@strapi/strapi';\nimport {\n TiptapPluginConfig,\n TiptapPresetConfig,\n} from '../../../shared/types';\n\nconst DEFAULT_CONFIG: TiptapPluginConfig = { presets: {} };\n\nconst createPresetService = ({ strapi }: { strapi: Core.Strapi }) => ({\n getConfig(): TiptapPluginConfig {\n return strapi.config.get('plugin::tiptap-editor', DEFAULT_CONFIG) as TiptapPluginConfig;\n },\n\n listPresetNames(): string[] {\n return Object.keys(this.getConfig().presets || {});\n },\n\n getPreset(name: string): TiptapPresetConfig | null {\n const presets = this.getConfig().presets || {};\n return presets[name] ?? null;\n },\n});\n\nexport default createPresetService;\n","import createPresetService from './preset';\n\nexport default {\n preset: createPresetService,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n register,\n bootstrap,\n destroy,\n config,\n controllers,\n routes,\n services,\n contentTypes,\n policies,\n middlewares,\n} as const; // Type Assertion necessary due to the error below\n\n/**\n * [ERROR] server/src/index.ts:19:1 - TS2742: The inferred type of 'default' cannot be named without a reference to '@strapi/core/node_modules/@strapi/types/dist/core'. This is likely not portable. A type annotation is necessary.\n */\n\n// Re-export shared types for host app developer access via the ./strapi-server entry point\nexport type { TiptapPresetConfig, TiptapPluginConfig } from '../../shared/types';\nexport {\n PRESET_FEATURE_KEYS,\n MINIMAL_PRESET_CONFIG,\n isFeatureEnabled,\n getFeatureOptions,\n} from '../../shared/types';\n"],"names":["isPlainObject"],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { TiptapPresetConfig } from '../../../shared/types';
|
|
2
|
+
declare const config: {
|
|
3
|
+
default: {
|
|
4
|
+
presets: Record<string, TiptapPresetConfig>;
|
|
5
|
+
};
|
|
6
|
+
validator(pluginConfig: unknown): void;
|
|
4
7
|
};
|
|
5
|
-
export default
|
|
8
|
+
export default config;
|
|
@@ -9,12 +9,48 @@ declare const _default: {
|
|
|
9
9
|
strapi: import("@strapi/types/dist/core").Strapi;
|
|
10
10
|
}) => void;
|
|
11
11
|
readonly config: {
|
|
12
|
-
default: {
|
|
13
|
-
|
|
12
|
+
default: {
|
|
13
|
+
presets: Record<string, import("../../shared/types").TiptapPresetConfig>;
|
|
14
|
+
};
|
|
15
|
+
validator(pluginConfig: unknown): void;
|
|
16
|
+
};
|
|
17
|
+
readonly controllers: {
|
|
18
|
+
preset: ({ strapi }: {
|
|
19
|
+
strapi: import("@strapi/types/dist/core").Strapi;
|
|
20
|
+
}) => {
|
|
21
|
+
find(ctx: any): Promise<void>;
|
|
22
|
+
findOne(ctx: any): Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
readonly routes: {
|
|
26
|
+
'preset-routes': {
|
|
27
|
+
type: "admin";
|
|
28
|
+
routes: {
|
|
29
|
+
method: string;
|
|
30
|
+
path: string;
|
|
31
|
+
/**
|
|
32
|
+
* Plugin server methods
|
|
33
|
+
*/
|
|
34
|
+
handler: string;
|
|
35
|
+
config: {
|
|
36
|
+
auth: boolean;
|
|
37
|
+
policies: any[];
|
|
38
|
+
middlewares: any[];
|
|
39
|
+
};
|
|
40
|
+
}[];
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
readonly services: {
|
|
44
|
+
preset: ({ strapi }: {
|
|
45
|
+
strapi: import("@strapi/types/dist/core").Strapi;
|
|
46
|
+
}) => {
|
|
47
|
+
getConfig(): import("../../shared/types").TiptapPluginConfig;
|
|
48
|
+
listPresetNames(): string[];
|
|
49
|
+
getPreset(name: string): import("../../shared/types").TiptapPresetConfig; /**
|
|
50
|
+
* [ERROR] server/src/index.ts:19:1 - TS2742: The inferred type of 'default' cannot be named without a reference to '@strapi/core/node_modules/@strapi/types/dist/core'. This is likely not portable. A type annotation is necessary.
|
|
51
|
+
*/
|
|
52
|
+
};
|
|
14
53
|
};
|
|
15
|
-
readonly controllers: {};
|
|
16
|
-
readonly routes: {};
|
|
17
|
-
readonly services: {};
|
|
18
54
|
readonly contentTypes: {};
|
|
19
55
|
readonly policies: {};
|
|
20
56
|
readonly middlewares: {};
|
|
@@ -23,3 +59,5 @@ export default _default;
|
|
|
23
59
|
/**
|
|
24
60
|
* [ERROR] server/src/index.ts:19:1 - TS2742: The inferred type of 'default' cannot be named without a reference to '@strapi/core/node_modules/@strapi/types/dist/core'. This is likely not portable. A type annotation is necessary.
|
|
25
61
|
*/
|
|
62
|
+
export type { TiptapPresetConfig, TiptapPluginConfig } from '../../shared/types';
|
|
63
|
+
export { PRESET_FEATURE_KEYS, MINIMAL_PRESET_CONFIG, isFeatureEnabled, getFeatureOptions, } from '../../shared/types';
|
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
declare const _default: {
|
|
1
|
+
declare const _default: {
|
|
2
|
+
'preset-routes': {
|
|
3
|
+
type: "admin";
|
|
4
|
+
routes: {
|
|
5
|
+
method: string;
|
|
6
|
+
path: string;
|
|
7
|
+
handler: string;
|
|
8
|
+
config: {
|
|
9
|
+
auth: boolean;
|
|
10
|
+
policies: any[];
|
|
11
|
+
middlewares: any[];
|
|
12
|
+
};
|
|
13
|
+
}[];
|
|
14
|
+
};
|
|
15
|
+
};
|
|
2
16
|
export default _default;
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
declare const _default: {
|
|
1
|
+
declare const _default: {
|
|
2
|
+
preset: ({ strapi }: {
|
|
3
|
+
strapi: import("@strapi/types/dist/core").Strapi;
|
|
4
|
+
}) => {
|
|
5
|
+
getConfig(): import("..").TiptapPluginConfig;
|
|
6
|
+
listPresetNames(): string[];
|
|
7
|
+
getPreset(name: string): import("..").TiptapPresetConfig;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
2
10
|
export default _default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Core } from '@strapi/strapi';
|
|
2
|
+
import { TiptapPluginConfig, TiptapPresetConfig } from '../../../shared/types';
|
|
3
|
+
declare const createPresetService: ({ strapi }: {
|
|
4
|
+
strapi: Core.Strapi;
|
|
5
|
+
}) => {
|
|
6
|
+
getConfig(): TiptapPluginConfig;
|
|
7
|
+
listPresetNames(): string[];
|
|
8
|
+
getPreset(name: string): TiptapPresetConfig | null;
|
|
9
|
+
};
|
|
10
|
+
export default createPresetService;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
2
|
+
export type LinkConfig = {
|
|
3
|
+
openOnClick?: boolean;
|
|
4
|
+
HTMLAttributes?: Record<string, string>;
|
|
5
|
+
};
|
|
6
|
+
export type TableConfig = {
|
|
7
|
+
resizable?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type TextAlignConfig = {
|
|
10
|
+
types?: string[];
|
|
11
|
+
alignments?: Array<'left' | 'center' | 'right' | 'justify'>;
|
|
12
|
+
};
|
|
13
|
+
export type HeadingConfig = {
|
|
14
|
+
levels?: HeadingLevel[];
|
|
15
|
+
};
|
|
16
|
+
export interface TiptapPresetConfig {
|
|
17
|
+
bold?: boolean | Record<string, unknown>;
|
|
18
|
+
italic?: boolean | Record<string, unknown>;
|
|
19
|
+
strike?: boolean | Record<string, unknown>;
|
|
20
|
+
code?: boolean | Record<string, unknown>;
|
|
21
|
+
codeBlock?: boolean | Record<string, unknown>;
|
|
22
|
+
blockquote?: boolean | Record<string, unknown>;
|
|
23
|
+
bulletList?: boolean | Record<string, unknown>;
|
|
24
|
+
orderedList?: boolean | Record<string, unknown>;
|
|
25
|
+
hardBreak?: boolean | Record<string, unknown>;
|
|
26
|
+
horizontalRule?: boolean | Record<string, unknown>;
|
|
27
|
+
history?: boolean | Record<string, unknown>;
|
|
28
|
+
heading?: boolean | HeadingConfig;
|
|
29
|
+
link?: boolean | LinkConfig;
|
|
30
|
+
table?: boolean | TableConfig;
|
|
31
|
+
textAlign?: boolean | TextAlignConfig;
|
|
32
|
+
superscript?: boolean | Record<string, unknown>;
|
|
33
|
+
subscript?: boolean | Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
export interface TiptapPluginConfig {
|
|
36
|
+
presets: Record<string, TiptapPresetConfig>;
|
|
37
|
+
}
|
|
38
|
+
export declare const PRESET_FEATURE_KEYS: Array<keyof TiptapPresetConfig>;
|
|
39
|
+
export declare const MINIMAL_PRESET_CONFIG: TiptapPresetConfig;
|
|
40
|
+
/**
|
|
41
|
+
* Returns true when a preset feature value is enabled.
|
|
42
|
+
* NOTE: undefined (absent key) returns true — absent key = feature enabled by default.
|
|
43
|
+
* This DIVERGES from dist where undefined returns false.
|
|
44
|
+
*/
|
|
45
|
+
export declare const isFeatureEnabled: (value: TiptapPresetConfig[keyof TiptapPresetConfig]) => boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Returns the effective options for a feature.
|
|
48
|
+
* - false → null (feature explicitly disabled, no options)
|
|
49
|
+
* - true | undefined → defaults (feature enabled with default options)
|
|
50
|
+
* - object → merged with defaults (feature enabled with custom options)
|
|
51
|
+
*
|
|
52
|
+
* NOTE: false returns null — DIVERGES from dist where false returns defaults.
|
|
53
|
+
*/
|
|
54
|
+
export declare const getFeatureOptions: <T extends Record<string, unknown>>(value: boolean | T | undefined, defaults: T) => T | null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.0.
|
|
3
|
-
"keywords": [],
|
|
2
|
+
"version": "1.0.2",
|
|
3
|
+
"keywords": ["strapi", "plugin", "tiptap", "editor", "rich-text", "wysiwyg"],
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package.json": "./package.json",
|
|
@@ -76,5 +76,13 @@
|
|
|
76
76
|
"maintainers": [
|
|
77
77
|
"Notum Technologies s.r.o. <sales@notum.cz>",
|
|
78
78
|
"Dominik Juriga <dominik.juriga@notum.cz>"
|
|
79
|
-
]
|
|
79
|
+
],
|
|
80
|
+
"repository": {
|
|
81
|
+
"type": "git",
|
|
82
|
+
"url": "git+https://github.com/notum-cz/strapi-plugin-tiptap-editor.git"
|
|
83
|
+
},
|
|
84
|
+
"bugs": {
|
|
85
|
+
"url": "https://github.com/notum-cz/strapi-plugin-tiptap-editor/issues"
|
|
86
|
+
},
|
|
87
|
+
"homepage": "https://github.com/notum-cz/strapi-plugin-tiptap-editor#readme"
|
|
80
88
|
}
|