Skip to content

Commit

Permalink
pass config to the conversionConfig.import method
Browse files Browse the repository at this point in the history
- Now `convertStringToBlockData` method passes target tool config the import method
- Fixed types in convesion config file (somehow imprort could return function that returns string, but import should return method that would return ToolData) this caused just type error that never been reached because types were actually ignored
- Added test that checks, that import method actualy gets passed config
  • Loading branch information
e11sy committed Oct 16, 2024
1 parent eb7ffcb commit ed581aa
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/components/modules/blockManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -863,7 +863,7 @@ export default class BlockManager extends Module {
/**
* Now using Conversion Config "import" we compose a new Block data
*/
let newBlockData = convertStringToBlockData(cleanData, replacingTool.conversionConfig);
let newBlockData = convertStringToBlockData(cleanData, replacingTool.conversionConfig, replacingTool.settings);

/**
* Optional data overrides.
Expand Down
6 changes: 3 additions & 3 deletions src/components/utils/blocks.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { BlockAPI } from '../../../types';
import type { BlockAPI, ToolConfig } from '../../../types';
import type { ConversionConfig } from '../../../types/configs/conversion-config';
import type { SavedData } from '../../../types/data-formats';
import type { BlockToolData } from '../../../types/tools/block-tool-data';
Expand Down Expand Up @@ -175,11 +175,11 @@ export function convertBlockDataToString(blockData: BlockToolData, conversionCon
* @param stringToImport - string to convert
* @param conversionConfig - tool's conversion config
*/
export function convertStringToBlockData(stringToImport: string, conversionConfig?: ConversionConfig): BlockToolData {
export function convertStringToBlockData(stringToImport: string, conversionConfig?: ConversionConfig, config?: ToolConfig): BlockToolData {
const importProp = conversionConfig?.import;

if (isFunction(importProp)) {
return importProp(stringToImport);
return importProp(stringToImport, config);
} else if (isString(importProp)) {
return {
[importProp]: stringToImport,
Expand Down
2 changes: 1 addition & 1 deletion test/cypress/fixtures/tools/ToolMock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { BlockTool, BlockToolConstructorOptions } from '../../../../types';
/**
* Simple structure for Tool data
*/
interface MockToolData {
export interface MockToolData {
text: string;
}

Expand Down
83 changes: 81 additions & 2 deletions test/cypress/tests/api/blocks.cy.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type EditorJS from '../../../../types/index';
import type { ConversionConfig, ToolboxConfig } from '../../../../types';
import ToolMock from '../../fixtures/tools/ToolMock';
import type { ConversionConfig, ToolboxConfig, ToolConfig } from '../../../../types';
import ToolMock, { MockToolData } from '../../fixtures/tools/ToolMock';
import { nanoid } from 'nanoid';

/**
Expand Down Expand Up @@ -444,5 +444,84 @@ describe('api.blocks', () => {
});
});
});

it.only('should get target tool config', function () {
const existingBlock = {
id: 'test-id-123',
type: 'paragraph',
data: {
text: 'Some text',
},
};

const conversionTargetToolConfig = {
defaultStyle: 'defaultStyle',
};

/**
* Mock of Tool with conversionConfig
*/
class ToolWithConversionConfig extends ToolMock {
/**
* Specify conversion config of the tool
*/
public static get conversionConfig(): {
/**
* Method that is responsible for conversion from data to string
*/
export: (data: string) => string;

/**
* Method that is responsible for conversion from string to data
* Should return stringified config to see, if Editor actually passed tool config to it
*/
import: (content: string, config: ToolConfig) => MockToolData;
} {
return {
export: (data) => data,
/**
* Passed config should be returned
*/
import: (_content, config) => {
return { text: JSON.stringify(config) };
},
};
}
}

cy.createEditor({
tools: {
conversionTargetTool: {
class: ToolWithConversionConfig,
config: conversionTargetToolConfig,
},
},
data: {
blocks: [
existingBlock,
],
},
}).then(async (editor) => {
const { convert } = editor.blocks;

const returnValue = await convert(existingBlock.id, 'conversionTargetTool');

// wait for block to be converted
cy.wait(100).then(async () => {
/**
* Check that block was converted
*/
const { blocks } = await editor.save();

expect(blocks.length).to.eq(1);
expect(blocks[0].type).to.eq('conversionTargetTool');

/**
* Check that tool converted returned config as a result of import
*/
expect(blocks[0].data.text).to.eq(JSON.stringify(conversionTargetToolConfig));
});
})
})
});
});
4 changes: 2 additions & 2 deletions types/configs/conversion-config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { BlockToolData } from '../tools';
import type { BlockToolData, ToolConfig } from '../tools';

/**
* Config allows Tool to specify how it can be converted into/from another Tool
Expand All @@ -12,7 +12,7 @@ export interface ConversionConfig {
* 1. String — the key of Tool data object to fill it with imported string on render.
* 2. Function — method that accepts importing string and composes Tool data to render.
*/
import?: ((data: string) => string) | string;
import?: ((data: string, config: ToolConfig) => BlockToolData) | string;

/**
* How to export this Tool to make other Block.
Expand Down

0 comments on commit ed581aa

Please sign in to comment.