UNPKG

@digipair/skill-web-editor

Version:

625 lines (622 loc) 31.1 kB
import { _ as _extends } from './index.esm2.js'; function getPinsBlockDefinition(library, methodData, pinsId) { const blockDefinition = { type: pinsId, message0: library.info['x-icon'] + ' ' + methodData.summary, args0: [], message1: '', args1: [], message2: '', args2: [], message3: '', args3: [], colour: '#b3aeee', tooltip: 'library : ' + library.info.title, inputsInline: false, previousStatement: null, nextStatement: null }; const parameters = methodData.parameters; const metadata = methodData.metadata || []; const events = methodData['x-events'] || []; const requiredParamInputs = parameters.filter((param)=>param.required === true); const requiredEventInputs = []; const requiredFields = requiredParamInputs.map((param)=>param.name); if (methodData['x-events']) { methodData['x-events'].forEach((event)=>{ if (event.required) { requiredEventInputs.push(event); requiredFields.push('__EVENT__/' + event.name); } }); } requiredFields.push(''); const mutatorToolbox = [ ...parameters.map((param)=>param.name).filter((name)=>!requiredFields.includes(name)), '__CONDITION__/if', '__CONDITION__/each' ]; if (methodData.tags) { if (methodData.tags.includes('needPins') && !methodData.tags.includes('requirePins')) { mutatorToolbox.push('pins'); } else if (methodData.tags.includes('needPins') && methodData.tags.includes('requirePins')) { blockDefinition['message3'] += '%1 %2 %3'; blockDefinition['args3'].push({ type: 'field_label', name: `NAME_INPUT`, text: 'pins*' }); blockDefinition['args3'].push({ type: 'input_dummy' }); blockDefinition['args3'].push({ type: 'input_statement', name: 'pins' }); requiredFields.push('pins'); } } if (methodData['x-events']) { for (const event of methodData['x-events']){ if (event.required === false || !event.required) { mutatorToolbox.push('__EVENT__/' + event.name); } } } for(let i = 0; i < requiredParamInputs.length; i++){ var _requiredParamInputs_i_schema, _requiredParamInputs_i_schema_items, _requiredParamInputs_i_schema_items_$ref, _requiredParamInputs_i_schema_items1; const position = blockDefinition['args1'].length; blockDefinition['args1'].push({ type: 'field_label', name: `NAME_INPUT`, text: (requiredParamInputs[i].summary || requiredParamInputs[i].name) + '*' }); if (((_requiredParamInputs_i_schema = requiredParamInputs[i].schema) == null ? void 0 : _requiredParamInputs_i_schema.type) === 'array' && (((_requiredParamInputs_i_schema_items = requiredParamInputs[i].schema.items) == null ? void 0 : _requiredParamInputs_i_schema_items.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_requiredParamInputs_i_schema_items1 = requiredParamInputs[i].schema.items) == null ? void 0 : (_requiredParamInputs_i_schema_items_$ref = _requiredParamInputs_i_schema_items1.$ref) == null ? void 0 : _requiredParamInputs_i_schema_items_$ref.includes('#/components/schemas/')))) { blockDefinition['message1'] += ' %' + (position + 1) + ' %' + (position + 2) + ' %' + (position + 3); blockDefinition['args1'].push({ type: 'input_dummy' }); blockDefinition['args1'].push({ type: 'input_statement', name: requiredParamInputs[i].name }); } else { blockDefinition['message1'] += ' %' + (position + 1) + ' %' + (position + 2); blockDefinition['args1'].push({ type: 'input_value', name: requiredParamInputs[i].name }); } } for(let i = 0; i < requiredEventInputs.length; i++){ const position = blockDefinition['args2'].length; blockDefinition['args2'].push({ type: 'field_label', name: `NAME_INPUT`, text: '@' + (requiredEventInputs[i].summary || requiredEventInputs[i].name) + '*' }); blockDefinition['message2'] += ' %' + (position + 1) + ' %' + (position + 2) + ' %' + (position + 3); blockDefinition['args2'].push({ type: 'input_dummy' }); blockDefinition['args2'].push({ type: 'input_statement', name: '__EVENT__/' + requiredEventInputs[i].name }); } if (mutatorToolbox.length > 0) { blockDefinition.mutator = pinsId + '/mutator'; generateMutator(pinsId + '/mutator', mutatorToolbox, requiredFields, [ ...parameters, ...metadata, ...events ]); } return blockDefinition; } function getComponentBlockDefinition(library, componentName, methodData, componentId) { const blockDefinition = { type: componentId, message0: library.info['x-icon'] + ' ' + (methodData.summary || componentName), args0: [], message1: '', args1: [], colour: '#ffca28', tooltip: 'library : ' + library.info.title, inputsInline: false, previousStatement: null, nextStatement: null }; const properties = methodData.properties; const requiredFields = methodData.required || []; requiredFields.push(''); const mutatorToolbox = []; const parameters = Object.keys(properties).map((propertyName)=>({ name: propertyName, summary: properties[propertyName].summary || propertyName, schema: properties[propertyName] })); let messageIndex = 0; parameters.forEach((parameter, _index)=>{ if (!requiredFields.includes(parameter.name)) { mutatorToolbox.push(parameter.name); } else { var _parameter_schema, _parameter_schema_items, _parameter_schema_items1; blockDefinition['args1'].push({ type: 'field_label', name: 'NAME_INPUT', text: parameter.summary + '*' }); if (((_parameter_schema = parameter.schema) == null ? void 0 : _parameter_schema.type) === 'array' && (((_parameter_schema_items = parameter.schema.items) == null ? void 0 : _parameter_schema_items.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_parameter_schema_items1 = parameter.schema.items) == null ? void 0 : _parameter_schema_items1.$ref.includes('#/components/schemas/')))) { blockDefinition['message1'] += ' %' + (messageIndex * 2 + 1) + ' %' + (messageIndex * 2 + 2) + ' %' + (messageIndex * 2 + 3); blockDefinition['args1'].push({ type: 'input_dummy' }); blockDefinition['args1'].push({ type: 'input_statement', name: parameter.name }); } else { blockDefinition['message1'] += ' %' + (messageIndex * 2 + 1) + ' %' + (messageIndex * 2 + 2); blockDefinition['args1'].push({ type: 'input_value', name: parameter.name }); } messageIndex++; } }); if (mutatorToolbox.length > 0) { blockDefinition.mutator = componentId + '/mutator'; generateMutator(componentId + '/mutator', mutatorToolbox, requiredFields, parameters); } return blockDefinition; } function generateToolboxFromLibraries(libraries, tags) { const sortedLibraries = libraries.sort((a, b)=>{ var _a_info_summary; const title1 = (_a_info_summary = a.info.summary) != null ? _a_info_summary : a.info.title; var _b_info_summary; const title2 = (_b_info_summary = b.info.summary) != null ? _b_info_summary : b.info.title; if (title1 < title2) { return -1; } if (title1 > title2) { return 1; } return 0; }); const toolbox = { kind: 'categoryToolbox', contents: [ { kind: 'category', name: '⚙️ Common', contents: [ { kind: 'block', type: 'object' }, { kind: 'block', type: 'member' }, { kind: 'block', type: 'math_number' }, { kind: 'block', type: 'text_multiline' }, { kind: 'block', type: 'logic_boolean' }, { kind: 'block', type: 'logic_null' }, { kind: 'block', type: 'array' }, { kind: 'block', type: 'array-input' } ] }, ...sortedLibraries.map((library)=>{ var _library_components; var _library_info_summary; return { kind: 'category', name: (_library_info_summary = library.info.summary) != null ? _library_info_summary : library.info.title, contents: [ ...library.paths ? Object.entries(library.paths).filter(([_path, pins])=>pins.post.tags.some((tag)=>tags.includes(tag))).sort((a, b)=>a[0].localeCompare(b[0])) // Tri alphabétique par path .map(([path, _pins])=>({ kind: 'block', type: library.info.title + '/__PINS__' + path })) : [], ...((_library_components = library.components) == null ? void 0 : _library_components.schemas) ? Object.entries(library.components.schemas).filter(([_componentName, schema])=>schema.tags.some((tag)=>tags.includes(tag))).sort((a, b)=>a[0].localeCompare(b[0])) // Tri alphabétique par componentName .map(([componentName])=>({ kind: 'block', type: library.info.title + '/__COMPONENTS__/' + componentName })) : [] ] }; }).filter((library)=>library.contents.length > 0) ] }; return toolbox; } function convertPinsLibrariesToBlocklyLibraries(pinsLibraries) { return pinsLibraries.map((schema)=>{ var _schema_paths; return _extends({}, schema, { paths: _extends({}, Object.entries((_schema_paths = schema.paths) != null ? _schema_paths : {}).reduce((acc, [key, path])=>_extends({}, acc, { [key]: _extends({}, path, { post: _extends({}, path.post, { parameters: !path.post.parameters ? [] : [ ...path.post.parameters, ...path.post.parameters.filter((item)=>{ var _item_schema, _item_schema_items, _item_schema_items_$ref, _item_schema_items1; return ((_item_schema = item.schema) == null ? void 0 : _item_schema.type) === 'array' && (((_item_schema_items = item.schema.items) == null ? void 0 : _item_schema_items.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_item_schema_items1 = item.schema.items) == null ? void 0 : (_item_schema_items_$ref = _item_schema_items1.$ref) == null ? void 0 : _item_schema_items_$ref.includes('#/components/schemas/'))); }).map((item)=>_extends({}, item, { name: item.name + '__EVALUATE', summary: (item.summary || item.name) + ' (evaluate)', required: false, schema: { type: 'string' } })) ] }) }) }), {})), components: !schema.components ? {} : _extends({}, schema.components, { schemas: _extends({}, Object.entries(schema.components.schemas || {}).reduce((acc, [key, component])=>_extends({}, acc, { [key]: _extends({}, component, { properties: !component.properties ? {} : _extends({}, component.properties, Object.entries(component.properties).filter(([_propertyKey, propertyValue])=>{ var _propertyValue_items, _propertyValue_items_$ref, _propertyValue_items1; return propertyValue.type === 'array' && (((_propertyValue_items = propertyValue.items) == null ? void 0 : _propertyValue_items.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_propertyValue_items1 = propertyValue.items) == null ? void 0 : (_propertyValue_items_$ref = _propertyValue_items1.$ref) == null ? void 0 : _propertyValue_items_$ref.includes('#/components/schemas/'))); }).reduce((acc, [propertyKey, property])=>_extends({}, acc, { [propertyKey + '__EVALUATE']: _extends({}, property, { summary: (property.summary || propertyKey) + ' (evaluate)', required: false, schema: { type: 'string' } }) }), {})) }) }), {})) }), 'x-scene-blocks': _extends({}, Object.entries(schema['x-scene-blocks'] || {}).reduce((acc, [key, path])=>_extends({}, acc, { [key]: _extends({}, path, { metadata: !path.metadata ? [] : [ ...path.metadata, ...path.metadata.filter((item)=>{ var _item_schema, _item_schema_items, _item_schema_items_$ref, _item_schema_items1; return ((_item_schema = item.schema) == null ? void 0 : _item_schema.type) === 'array' && (((_item_schema_items = item.schema.items) == null ? void 0 : _item_schema_items.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_item_schema_items1 = item.schema.items) == null ? void 0 : (_item_schema_items_$ref = _item_schema_items1.$ref) == null ? void 0 : _item_schema_items_$ref.includes('#/components/schemas/'))); }).map((item)=>_extends({}, item, { name: item.name + '__EVALUATE', summary: (item.summary || item.name) + ' (evaluate)', required: false, schema: { type: 'string' } })) ], parameters: !path.parameters ? [] : [ ...path.parameters, ...path.parameters.filter((item)=>{ var _item_schema, _item_schema_items, _item_schema_items_$ref, _item_schema_items1; return ((_item_schema = item.schema) == null ? void 0 : _item_schema.type) === 'array' && (((_item_schema_items = item.schema.items) == null ? void 0 : _item_schema_items.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_item_schema_items1 = item.schema.items) == null ? void 0 : (_item_schema_items_$ref = _item_schema_items1.$ref) == null ? void 0 : _item_schema_items_$ref.includes('#/components/schemas/'))); }).map((item)=>_extends({}, item, { name: item.name + '__EVALUATE', summary: (item.summary || item.name) + ' (evaluate)', required: false, schema: { type: 'string' } })) ] }) }), {})) }); }); } function generateBlocklyBlockFromLibraries(pinsLibraries, blocksLegacy) { const blocksLibrary = [ ...blocksLegacy ]; const blocklyLibraries = convertPinsLibrariesToBlocklyLibraries(pinsLibraries); for (const pinsLibrary of blocklyLibraries){ //search for pins blocks for(const endpoint in pinsLibrary.paths){ if (Object.hasOwnProperty.call(pinsLibrary.paths, endpoint)) { const endpointData = pinsLibrary.paths[endpoint]; const methodData = endpointData.post; const pinsId = pinsLibrary.info.title + '/__PINS__' + endpoint; blocksLibrary.push(getPinsBlockDefinition(pinsLibrary, methodData, pinsId)); } } } for (const pinsLibrary of blocklyLibraries){ //search for components blocks if (!pinsLibrary.components || !pinsLibrary.components.schemas) { continue; } for(const endpoint in pinsLibrary.components.schemas){ if (Object.hasOwnProperty.call(pinsLibrary.components.schemas, endpoint)) { const endpointData = pinsLibrary.components.schemas[endpoint]; if (!endpointData || !endpointData.properties) { continue; } const componentId = pinsLibrary.info.title + '/__COMPONENTS__/' + endpoint; const blockName = endpoint; blocksLibrary.push(getComponentBlockDefinition(pinsLibrary, blockName, endpointData, componentId)); } } } for (const pinsLibrary of blocklyLibraries){ //search for scene blocks for(const endpoint in pinsLibrary['x-scene-blocks']){ if (Object.hasOwnProperty.call(pinsLibrary['x-scene-blocks'], endpoint)) { const endpointSceneblock = pinsLibrary['x-scene-blocks'][endpoint]; const sceneBlockId = pinsLibrary.info.title + '/__SCENEBLOCK__' + endpoint; const block = getSceneBlockDefinition(pinsLibrary, endpointSceneblock, sceneBlockId); blocksLibrary.push(block); } } } return blocksLibrary; } function initializeMutator() { Blockly.Blocks['mutator_container'] = { init: function() { this.appendDummyInput().appendField('Inputs'); this.appendStatementInput('STACK'); this.setColour(230); this.setTooltip(''); this.workspace.addChangeListener((event)=>{ if (event.type === Blockly.Events.BLOCK_MOVE) { let currentBlock = this.workspace.getBlockById(event.newParentId); while(currentBlock){ if (currentBlock.id === this.id) { let firstBlock = this.getInputTargetBlock('STACK'); const seenTypes = {}; while(firstBlock){ if (seenTypes[firstBlock.type]) { firstBlock.unplug(true); } else { seenTypes[firstBlock.type] = true; } firstBlock = firstBlock.getNextBlock(); } break; } currentBlock = currentBlock.getSurroundParent(); } } }); } }; } function generateMutator(mutatorName, toolboxItem, requiredFields, originParameters) { const parameters = [ ...originParameters, { name: '__CONDITION__/if', schema: { type: 'boolean' } }, { name: '__CONDITION__/each', schema: { type: 'array', items: { type: 'object' } } } ]; const toolboxList = []; for (const item of toolboxItem){ Blockly.Blocks[mutatorName + '/' + item] = { init: function() { this.appendDummyInput(item).appendField(item.includes('__EVENT__/') ? item.replace('__EVENT__/', '@') : item.includes('__CONDITION__/') ? item.replace('__CONDITION__/', '#') : item); this.setPreviousStatement(true); this.setNextStatement(true); this.setColour(0); } }; toolboxList.push(mutatorName + '/' + item); } toolboxList.sort((a, b)=>a.localeCompare(b)); Blockly.Extensions.registerMutator(mutatorName, { saveExtraState: function() { return { itemList: this.itemList_ || [] }; }, loadExtraState: function(state) { this.itemList_ = state['itemList']; this.updateShape_(); }, decompose: function(workspace) { const containerBlock = workspace.newBlock('mutator_container'); containerBlock.initSvg(); let connection = containerBlock.getInput('STACK').connection; for(let i = 0; i < this.inputList.length; i++){ if (requiredFields.includes(this.inputList[i].name) || /__INPUT$/g.test(this.inputList[i].name)) { continue; } const inputBlock = workspace.newBlock(mutatorName + '/' + this.inputList[i].name); inputBlock.initSvg(); connection.connect(inputBlock.previousConnection); connection = inputBlock.nextConnection; } return containerBlock; }, compose: function(containerBlock) { const inputConnectedArray = []; let childBlock = containerBlock.getInputTargetBlock('STACK'); while(childBlock){ const inputName = childBlock.inputList[0].name; let fieldName = ''; if (childBlock.inputList[0]) { const fieldRow = childBlock.inputList[0].fieldRow; if (fieldRow.length > 0) { fieldName = fieldRow[0].getText(); } } inputConnectedArray.push({ id: inputName, name: fieldName }); childBlock = childBlock.nextConnection && childBlock.nextConnection.targetBlock(); } this.itemList_ = inputConnectedArray; this.updateShape_(); }, updateShape_: function() { const inputToEnable = this.itemList_; const inputLoaded = this.inputList.map((input)=>input.name); const inputToEnableIds = inputToEnable.map((input)=>input.id); for (const input of inputLoaded){ if (requiredFields.includes(input)) continue; if (!inputToEnableIds.includes(input.replace(/__INPUT$/g, ''))) { this.removeInput(input); } } for (const input of inputToEnable){ if (requiredFields.includes(input)) { continue; } if (!inputLoaded.includes(input.id)) { var _parameter_schema, _parameter_schema_items, _parameter_schema_items_$ref, _parameter_schema_items1; const id = input.id.indexOf('/') < 0 ? input.id : input.id.split('/')[1]; var _parameters_find; const parameter = (_parameters_find = parameters.find((param)=>param.name === id)) != null ? _parameters_find : {}; if (((_parameter_schema = parameter.schema) == null ? void 0 : _parameter_schema.type) === 'array' && (((_parameter_schema_items = parameter.schema.items) == null ? void 0 : _parameter_schema_items.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_parameter_schema_items1 = parameter.schema.items) == null ? void 0 : (_parameter_schema_items_$ref = _parameter_schema_items1.$ref) == null ? void 0 : _parameter_schema_items_$ref.includes('#/components/schemas/')))) { this.appendDummyInput(input.id + '__INPUT').appendField(input.name); this.appendStatementInput(input.id); } else if (input.id === 'pins') { this.appendDummyInput(input.id + '__INPUT').appendField(input.name); this.appendStatementInput(input.id); } else { this.appendValueInput(input.id).appendField(input.name); } } } } }, null, toolboxList); } function getSceneBlockDefinition(library, methodData, sceneBlockId) { const blockDefinition = { type: sceneBlockId, message0: library.info['x-icon'] + ' ' + methodData.summary, args0: [], message1: '', args1: [], message2: '', args2: [], message3: '', args3: [], colour: '#212e3c', tooltip: 'library : ' + library.info.title }; const metadata = methodData.metadata || []; const parameters = methodData.parameters || []; if (methodData.tags && methodData.tags.includes('needPins')) { const parameter = { required: methodData.tags.includes('requirePins'), name: 'EXECUTE_PINS', summary: 'pins', schema: { type: 'array', items: { $ref: 'https://schemas.digipair.ai/pinsSettings' } } }; parameters.push(parameter); } const requiredParamInputs = parameters.filter((param)=>param.required === true); const requiredFields = [ ...requiredParamInputs.map((param)=>param.name), ...metadata.map((param)=>'metadata--' + param.name) ]; requiredFields.push(''); // metadata for(let i = 0; i < (metadata == null ? void 0 : metadata.length); i++){ var _parameter_schema, _parameter_schema_items, _parameter_schema_items_$ref, _parameter_schema_items1; var _metadata_find; const parameter = (_metadata_find = metadata.find((param)=>param.name === metadata[i].name)) != null ? _metadata_find : {}; const position = blockDefinition['args1'].length; blockDefinition['args1'].push({ type: 'field_label', name: `NAME_INPUT_METADATA`, text: (parameter.summary || parameter.name) + '*' }); if (((_parameter_schema = parameter.schema) == null ? void 0 : _parameter_schema.type) === 'array' && (((_parameter_schema_items = parameter.schema.items) == null ? void 0 : _parameter_schema_items.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_parameter_schema_items1 = parameter.schema.items) == null ? void 0 : (_parameter_schema_items_$ref = _parameter_schema_items1.$ref) == null ? void 0 : _parameter_schema_items_$ref.includes('#/components/schemas/')))) { blockDefinition['message1'] += ' %' + (position + 1) + ' %' + (position + 2) + ' %' + (position + 3); blockDefinition['args1'].push({ type: 'input_dummy' }); blockDefinition['args1'].push({ type: 'input_statement', name: 'metadata--' + parameter.name }); } else { blockDefinition['message1'] += ' %' + (position + 1) + ' %' + (position + 2); blockDefinition['args1'].push({ type: 'input_value', name: 'metadata--' + parameter.name }); } } // mutator toolbox const mutatorToolbox = parameters.map((param)=>param.name).filter((name)=>!requiredFields.includes(name)); // parameters for(let i = 0; i < requiredParamInputs.length; i++){ var _parameter_schema1, _parameter_schema_items2, _parameter_schema_items_$ref1, _parameter_schema_items3; var _parameters_find; const parameter = (_parameters_find = parameters.find((param)=>param.name === requiredParamInputs[i].name)) != null ? _parameters_find : {}; const position = blockDefinition['args3'].length; blockDefinition['args3'].push({ type: 'field_label', name: `NAME_INPUT`, text: (parameter.summary || parameter.name) + '*' }); if (((_parameter_schema1 = parameter.schema) == null ? void 0 : _parameter_schema1.type) === 'array' && (((_parameter_schema_items2 = parameter.schema.items) == null ? void 0 : _parameter_schema_items2.$ref) === 'https://schemas.digipair.ai/pinsSettings' || ((_parameter_schema_items3 = parameter.schema.items) == null ? void 0 : (_parameter_schema_items_$ref1 = _parameter_schema_items3.$ref) == null ? void 0 : _parameter_schema_items_$ref1.includes('#/components/schemas/')))) { blockDefinition['message3'] += ' %' + (position + 1) + ' %' + (position + 2) + ' %' + (position + 3); blockDefinition['args3'].push({ type: 'input_dummy' }); blockDefinition['args3'].push({ type: 'input_statement', name: parameter.name }); } else { blockDefinition['message3'] += ' %' + (position + 1) + ' %' + (position + 2); blockDefinition['args3'].push({ type: 'input_value', name: parameter.name }); } } if (mutatorToolbox.length > 0) { blockDefinition.mutator = sceneBlockId + '/mutator'; generateMutator(sceneBlockId + '/mutator', mutatorToolbox, requiredFields, [ ...parameters, ...metadata || [] ]); } return blockDefinition; } export { generateBlocklyBlockFromLibraries, generateToolboxFromLibraries, initializeMutator };