@imgly/codesign-mcp 0.1.5 → 0.1.6
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 +51 -1
- package/assets/docs/guide/SKILL.md +45 -53
- package/assets/docs/guide/animation/create/base.md +234 -243
- package/assets/docs/guide/animation/create/text.md +250 -231
- package/assets/docs/guide/animation/create.md +197 -231
- package/assets/docs/guide/animation/edit.md +196 -271
- package/assets/docs/guide/animation/types.md +182 -185
- package/assets/docs/guide/animation.md +9 -6
- package/assets/docs/guide/api/AssetAPI.md +7 -53
- package/assets/docs/guide/api/BlockAPI.md +725 -648
- package/assets/docs/guide/api/CreativeEngine.md +7 -16
- package/assets/docs/guide/api/EditorAPI.md +32 -93
- package/assets/docs/guide/api/EventAPI.md +1 -2
- package/assets/docs/guide/api/SceneAPI.md +47 -98
- package/assets/docs/guide/api/VariableAPI.md +1 -4
- package/assets/docs/guide/api/node/classes/assetapi.md +1090 -0
- package/assets/docs/guide/api/node/classes/blockapi.md +12965 -0
- package/assets/docs/guide/api/node/classes/creativeengine.md +319 -0
- package/assets/docs/guide/api/node/classes/editorapi.md +3417 -0
- package/assets/docs/guide/api/node/classes/engineactions.md +319 -0
- package/assets/docs/guide/api/node/classes/eventapi.md +56 -0
- package/assets/docs/guide/api/node/classes/sceneapi.md +1370 -0
- package/assets/docs/guide/api/node/classes/variableapi.md +143 -0
- package/assets/docs/guide/api/node/enumerations/compressionformat.md +23 -0
- package/assets/docs/guide/api/node/enumerations/compressionlevel.md +24 -0
- package/assets/docs/guide/api/node/functions/iscmykcolor.md +30 -0
- package/assets/docs/guide/api/node/functions/isrgbacolor.md +30 -0
- package/assets/docs/guide/api/node/functions/isspotcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/addvideooptions.md +31 -0
- package/assets/docs/guide/api/node/interfaces/applyassetoptions.md +31 -0
- package/assets/docs/guide/api/node/interfaces/asset.md +30 -0
- package/assets/docs/guide/api/node/interfaces/assetbooleanproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetcmykcolor.md +26 -0
- package/assets/docs/guide/api/node/interfaces/assetcolorproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetcontentaspectratio.md +23 -0
- package/assets/docs/guide/api/node/interfaces/assetdefinition.md +31 -0
- package/assets/docs/guide/api/node/interfaces/assetenumproperty.md +26 -0
- package/assets/docs/guide/api/node/interfaces/assetfixedaspectratio.md +24 -0
- package/assets/docs/guide/api/node/interfaces/assetfixedsize.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetfreeaspectratio.md +22 -0
- package/assets/docs/guide/api/node/interfaces/assetnumberproperty.md +28 -0
- package/assets/docs/guide/api/node/interfaces/assetpayload.md +27 -0
- package/assets/docs/guide/api/node/interfaces/assetquerydata.md +32 -0
- package/assets/docs/guide/api/node/interfaces/assetresult.md +46 -0
- package/assets/docs/guide/api/node/interfaces/assetrgbcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetsource.md +111 -0
- package/assets/docs/guide/api/node/interfaces/assetspotcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetsqueryresult.md +31 -0
- package/assets/docs/guide/api/node/interfaces/assetstringproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetstylepreset.md +39 -0
- package/assets/docs/guide/api/node/interfaces/assetstylepresetanimation.md +23 -0
- package/assets/docs/guide/api/node/interfaces/audiotrackinfo.md +32 -0
- package/assets/docs/guide/api/node/interfaces/blockevent.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstateerror.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstatepending.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstateready.md +25 -0
- package/assets/docs/guide/api/node/interfaces/buffer.md +26 -0
- package/assets/docs/guide/api/node/interfaces/characterinkbox.md +29 -0
- package/assets/docs/guide/api/node/interfaces/cmykcolor.md +34 -0
- package/assets/docs/guide/api/node/interfaces/completeassetresult.md +46 -0
- package/assets/docs/guide/api/node/interfaces/configuration.md +38 -0
- package/assets/docs/guide/api/node/interfaces/dominantcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/dominantcolorsoptions.md +23 -0
- package/assets/docs/guide/api/node/interfaces/engineactioninfo.md +24 -0
- package/assets/docs/guide/api/node/interfaces/engineactionsregistry.md +18 -0
- package/assets/docs/guide/api/node/interfaces/engineplugin.md +30 -0
- package/assets/docs/guide/api/node/interfaces/font.md +27 -0
- package/assets/docs/guide/api/node/interfaces/fontmetrics.md +32 -0
- package/assets/docs/guide/api/node/interfaces/gradientcolorstop.md +28 -0
- package/assets/docs/guide/api/node/interfaces/logger.md +39 -0
- package/assets/docs/guide/api/node/interfaces/pageduration.md +23 -0
- package/assets/docs/guide/api/node/interfaces/range.md +23 -0
- package/assets/docs/guide/api/node/interfaces/rgbacolor.md +32 -0
- package/assets/docs/guide/api/node/interfaces/rgbcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/settings.md +126 -0
- package/assets/docs/guide/api/node/interfaces/size2.md +21 -0
- package/assets/docs/guide/api/node/interfaces/source.md +24 -0
- package/assets/docs/guide/api/node/interfaces/spotcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/textdecorationconfig.md +31 -0
- package/assets/docs/guide/api/node/interfaces/textfontsizeoptions.md +24 -0
- package/assets/docs/guide/api/node/interfaces/textruninfo.md +33 -0
- package/assets/docs/guide/api/node/interfaces/transientresource.md +26 -0
- package/assets/docs/guide/api/node/interfaces/typeface.md +23 -0
- package/assets/docs/guide/api/node/interfaces/vec2.md +21 -0
- package/assets/docs/guide/api/node/interfaces/vec3.md +22 -0
- package/assets/docs/guide/api/node/type-aliases/addimageoptions.md +36 -0
- package/assets/docs/guide/api/node/type-aliases/animationbaselinedirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationblockswipetextdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationeasing.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationentry.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/animationgrowdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationjumploopdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationkenburnsdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationmergetextdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationoptions.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/animationspindirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationspinloopdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationtype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypewritertextwritingstyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationwipedirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/applicationmimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/assetcolor.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/assetfilter.md +47 -0
- package/assets/docs/guide/api/node/type-aliases/assetgroups.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/assetmetadata.md +42 -0
- package/assets/docs/guide/api/node/type-aliases/assetproperty.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/assetpropertyfilter.md +41 -0
- package/assets/docs/guide/api/node/type-aliases/assetpropertypath.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetanimationproperties.md +34 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetproperties.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetpropertyvalue.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetscalableproperty.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/assettransformpreset.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/asyncuriresolver.md +36 -0
- package/assets/docs/guide/api/node/type-aliases/audioexportoptions.md +43 -0
- package/assets/docs/guide/api/node/type-aliases/audiofromvideooptions.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/audiomimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/blendmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/blockenumtype.md +63 -0
- package/assets/docs/guide/api/node/type-aliases/blockstate.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/blurtype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/blurtypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/blurtypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/booleanoperation.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/boolpropertyname.md +79 -0
- package/assets/docs/guide/api/node/type-aliases/cameraclampingovershootmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/captionhorizontalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/captionverticalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/cmyk.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/color.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/colorpickercolormode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/colorpropertyname.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/colorspace.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/contentfillmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmomovehandlevisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmoresizehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmorotatehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmoscalehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/createsceneoptions.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/cutoutoperation.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/cutouttype.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/defaultassetsourceid.md +37 -0
- package/assets/docs/guide/api/node/type-aliases/demoassetsourceid.md +33 -0
- package/assets/docs/guide/api/node/type-aliases/designblockid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/designunit.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/doubleclickselectionmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/doublepropertyname.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/dropshadowoptions.md +32 -0
- package/assets/docs/guide/api/node/type-aliases/editmode.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/effecttype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/effecttypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/effecttypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/engineactionid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/enginecustomactionfunction.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/engineplugincontext.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/enumpropertyname.md +59 -0
- package/assets/docs/guide/api/node/type-aliases/enumvalues.md +59 -0
- package/assets/docs/guide/api/node/type-aliases/exportoptions.md +57 -0
- package/assets/docs/guide/api/node/type-aliases/fillpixelstreamorientation.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/filltype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/filltypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/filltypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/floatpropertyname.md +184 -0
- package/assets/docs/guide/api/node/type-aliases/fontsizeunit.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/fontstyle.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/fontweight.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/gradientstoprgba.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/heightmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/hexcolorstring.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/historyid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/historyupdate.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/horizontalblockalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/horizontalcontentfillalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/horizontaltextalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/imagemimetype.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/intpropertyname.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/liststyle.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/locale.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/loglevel.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/mimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/objecttype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/objecttypelonghand.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/objecttypeshorthand.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/optionalprefix.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/pageguidessource.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/palettecolor.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/positionmode.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/positionxmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/positionymode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/propertytype.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/rgba.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/rolestring.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/scenefontsizeunit.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scenelayout.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scenemode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scope.md +50 -0
- package/assets/docs/guide/api/node/type-aliases/settingboolpropertyname.md +62 -0
- package/assets/docs/guide/api/node/type-aliases/settingcolorpropertyname.md +38 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumpropertyname.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumtype.md +33 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumvalues.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/settingfloatpropertyname.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/settingintpropertyname.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingkey.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingsbool.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingscolor.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingscolorrgba.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/settingsenum.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsfloat.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsint.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsstring.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingstringpropertyname.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/settingtype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingvaluetype.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/shapetype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/shapetypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/shapetypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/shapevectorpathfillrule.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/sizemode.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/sortingorder.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/sourcesetpropertyname.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/splitoptions.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/stringpropertyname.md +43 -0
- package/assets/docs/guide/api/node/type-aliases/strokecap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokecornergeometry.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokedashendcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokedashstartcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokeendcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokeposition.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokestartcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokestyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/syncuriresolver.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/textanimationwritingstyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/textcase.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/textdecorationline.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/textdecorationstyle.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/textverticalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/timelinetrackvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/touchpinchaction.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/touchrotateaction.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/typefacedefinition.md +41 -0
- package/assets/docs/guide/api/node/type-aliases/verticalblockalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/verticalcontentfillalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/videoexportoptions.md +54 -0
- package/assets/docs/guide/api/node/type-aliases/videomimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/widthmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/xywh.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/zoomautofitaxis.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/zoomoptions.md +27 -0
- package/assets/docs/guide/api/node/variables/animation_types.md +21 -0
- package/assets/docs/guide/api/node/variables/animationbaselinedirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationblockswipetextdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationeasingvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationgrowdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationjumploopdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationkenburnsdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationmergetextdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationspindirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationspinloopdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationtypewritertextwritingstylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationwipedirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/blendmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/blur_types.md +21 -0
- package/assets/docs/guide/api/node/variables/cameraclampingovershootmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/captionhorizontalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/captionverticalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/colorpickercolormodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/contentfillmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmomovehandlevisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmoresizehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmorotatehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmoscalehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/cutouttypevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/design_block_types.md +21 -0
- package/assets/docs/guide/api/node/variables/doubleclickselectionmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/effect_types.md +21 -0
- package/assets/docs/guide/api/node/variables/fill_types.md +21 -0
- package/assets/docs/guide/api/node/variables/fillpixelstreamorientationvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/heightmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/horizontalcontentfillalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/loglevel.md +37 -0
- package/assets/docs/guide/api/node/variables/mimetype.md +41 -0
- package/assets/docs/guide/api/node/variables/pageguidessourcevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/positionxmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/positionymodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenedesignunitvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenefontsizeunitvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenelayoutvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenemodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/shape_types.md +21 -0
- package/assets/docs/guide/api/node/variables/shapevectorpathfillrulevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokecapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokecornergeometryvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokedashendcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokedashstartcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokeendcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokepositionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokestartcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokestylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/textanimationwritingstylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/texthorizontalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/textverticalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/timelinetrackvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/touchpinchactionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/touchrotateactionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/verticalcontentfillalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/widthmodevalues.md +18 -0
- package/assets/docs/guide/api/types.md +5 -9
- package/assets/docs/guide/api-reference/overview.md +7 -7
- package/assets/docs/guide/automation/auto-resize.md +263 -300
- package/assets/docs/guide/automation/data-merge.md +246 -275
- package/assets/docs/guide/automation/design-generation.md +102 -31
- package/assets/docs/guide/automation/multi-image-generation.md +758 -0
- package/assets/docs/guide/automation/overview.md +21 -4
- package/assets/docs/guide/automation.md +10 -5
- package/assets/docs/guide/capabilities.md +6 -4
- package/assets/docs/guide/colors/adjust.md +247 -249
- package/assets/docs/guide/colors/apply.md +127 -138
- package/assets/docs/guide/colors/basics.md +126 -150
- package/assets/docs/guide/colors/conversion.md +171 -177
- package/assets/docs/guide/colors/create-color-palette.md +244 -245
- package/assets/docs/guide/colors/extract-colors.md +144 -0
- package/assets/docs/guide/colors/for-print/cmyk.md +292 -352
- package/assets/docs/guide/colors/for-print/spot.md +521 -578
- package/assets/docs/guide/colors/for-print.md +9 -4
- package/assets/docs/guide/colors/for-screen/p3.md +12 -10
- package/assets/docs/guide/colors/for-screen/srgb.md +107 -133
- package/assets/docs/guide/colors/for-screen.md +9 -4
- package/assets/docs/guide/colors/overview.md +6 -4
- package/assets/docs/guide/colors/replace.md +381 -419
- package/assets/docs/guide/colors.md +9 -4
- package/assets/docs/guide/compatibility.md +7 -5
- package/assets/docs/guide/concepts/architecture.md +17 -15
- package/assets/docs/guide/concepts/assets.md +152 -140
- package/assets/docs/guide/concepts/blocks.md +227 -323
- package/assets/docs/guide/concepts/buffers.md +147 -276
- package/assets/docs/guide/concepts/design-units.md +95 -145
- package/assets/docs/guide/concepts/editing-workflow.md +69 -183
- package/assets/docs/guide/concepts/events.md +80 -122
- package/assets/docs/guide/concepts/headless-mode.md +237 -0
- package/assets/docs/guide/concepts/pages.md +137 -127
- package/assets/docs/guide/concepts/resources.md +156 -217
- package/assets/docs/guide/concepts/scenes.md +191 -210
- package/assets/docs/guide/concepts/templating.md +118 -74
- package/assets/docs/guide/concepts/terminology.md +49 -47
- package/assets/docs/guide/concepts/undo-and-history.md +229 -303
- package/assets/docs/guide/concepts.md +9 -7
- package/assets/docs/guide/configuration.md +252 -380
- package/assets/docs/guide/conversion/overview.md +33 -4
- package/assets/docs/guide/conversion/to-base64.md +127 -167
- package/assets/docs/guide/conversion/to-pdf.md +24 -474
- package/assets/docs/guide/conversion/to-png.md +168 -211
- package/assets/docs/guide/conversion.md +9 -4
- package/assets/docs/guide/create-audio/audio/add-music.md +301 -327
- package/assets/docs/guide/create-audio/audio/add-sound-effects.md +475 -359
- package/assets/docs/guide/create-audio/audio/loop.md +232 -272
- package/assets/docs/guide/create-composition/add-background.md +237 -239
- package/assets/docs/guide/create-composition/blend-modes.md +118 -209
- package/assets/docs/guide/create-composition/collage.md +538 -320
- package/assets/docs/guide/create-composition/group-and-ungroup.md +216 -261
- package/assets/docs/guide/create-composition/layer-management.md +219 -257
- package/assets/docs/guide/create-composition/layout.md +513 -315
- package/assets/docs/guide/create-composition/lock-design.md +90 -109
- package/assets/docs/guide/create-composition/multi-page.md +133 -113
- package/assets/docs/guide/create-composition/overview.md +16 -4
- package/assets/docs/guide/create-composition/programmatic.md +288 -344
- package/assets/docs/guide/create-composition.md +10 -5
- package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +443 -569
- package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +567 -470
- package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +179 -516
- package/assets/docs/guide/create-templates/add-dynamic-content.md +226 -224
- package/assets/docs/guide/create-templates/add-to-template-library.md +183 -193
- package/assets/docs/guide/create-templates/edit-or-remove.md +297 -303
- package/assets/docs/guide/create-templates/from-scratch.md +207 -268
- package/assets/docs/guide/create-templates/import/from-scene-file.md +158 -236
- package/assets/docs/guide/create-templates/import.md +145 -161
- package/assets/docs/guide/create-templates/lock.md +42 -295
- package/assets/docs/guide/create-templates/overview.md +33 -4
- package/assets/docs/guide/create-templates.md +9 -5
- package/assets/docs/guide/create-video/audio/adjust-speed.md +157 -207
- package/assets/docs/guide/create-video/audio/adjust-volume.md +116 -227
- package/assets/docs/guide/create-video/control.md +352 -193
- package/assets/docs/guide/create-video/limitations.md +175 -280
- package/assets/docs/guide/create-video.md +11 -10
- package/assets/docs/guide/edit-image/add-watermark.md +283 -330
- package/assets/docs/guide/edit-image/overview.md +29 -4
- package/assets/docs/guide/edit-image/remove-bg.md +283 -337
- package/assets/docs/guide/edit-image/replace-colors.md +424 -502
- package/assets/docs/guide/edit-image/transform/crop.md +463 -402
- package/assets/docs/guide/edit-image/transform/flip.md +353 -0
- package/assets/docs/guide/edit-image/transform/move.md +143 -100
- package/assets/docs/guide/edit-image/transform/resize.md +118 -88
- package/assets/docs/guide/edit-image/transform/rotate.md +132 -165
- package/assets/docs/guide/edit-image/transform/scale.md +230 -228
- package/assets/docs/guide/edit-image/transform.md +10 -5
- package/assets/docs/guide/edit-image.md +11 -7
- package/assets/docs/guide/edit-video/add-captions.md +344 -421
- package/assets/docs/guide/edit-video/add-watermark.md +312 -258
- package/assets/docs/guide/edit-video/join-and-arrange.md +237 -371
- package/assets/docs/guide/edit-video/redaction.md +419 -385
- package/assets/docs/guide/edit-video/split.md +243 -493
- package/assets/docs/guide/edit-video/transform/crop.md +21 -352
- package/assets/docs/guide/edit-video/transform/flip.md +102 -76
- package/assets/docs/guide/edit-video/transform/move.md +258 -310
- package/assets/docs/guide/edit-video/transform/resize.md +264 -428
- package/assets/docs/guide/edit-video/transform/rotate.md +265 -228
- package/assets/docs/guide/edit-video/transform/scale.md +320 -417
- package/assets/docs/guide/edit-video/transform.md +10 -6
- package/assets/docs/guide/edit-video/trim.md +448 -494
- package/assets/docs/guide/engine-interface.md +51 -62
- package/assets/docs/guide/export-save-publish/create-thumbnail.md +148 -184
- package/assets/docs/guide/export-save-publish/export/compress.md +161 -559
- package/assets/docs/guide/export-save-publish/export/overview.md +224 -373
- package/assets/docs/guide/export-save-publish/export/partial-export.md +386 -577
- package/assets/docs/guide/export-save-publish/export/size-limits.md +215 -310
- package/assets/docs/guide/export-save-publish/export/to-jpeg.md +132 -213
- package/assets/docs/guide/export-save-publish/export/to-pdf.md +139 -267
- package/assets/docs/guide/export-save-publish/export/to-png.md +121 -165
- package/assets/docs/guide/export-save-publish/export/to-raw-data.md +187 -234
- package/assets/docs/guide/export-save-publish/export/to-webp.md +160 -190
- package/assets/docs/guide/export-save-publish/export/with-color-mask.md +359 -203
- package/assets/docs/guide/export-save-publish/export.md +14 -11
- package/assets/docs/guide/export-save-publish/for-printing.md +141 -237
- package/assets/docs/guide/export-save-publish/for-social-media.md +124 -261
- package/assets/docs/guide/export-save-publish/pre-export-validation.md +436 -522
- package/assets/docs/guide/export-save-publish/save.md +167 -226
- package/assets/docs/guide/export-save-publish/store-custom-metadata.md +97 -162
- package/assets/docs/guide/file-format-support.md +9 -9
- package/assets/docs/guide/fills/color.md +370 -347
- package/assets/docs/guide/fills/image.md +167 -196
- package/assets/docs/guide/fills/overview.md +6 -4
- package/assets/docs/guide/fills/video.md +286 -438
- package/assets/docs/guide/fills.md +12 -8
- package/assets/docs/guide/filters-and-effects/apply.md +598 -664
- package/assets/docs/guide/filters-and-effects/blur.md +261 -159
- package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +194 -293
- package/assets/docs/guide/filters-and-effects/create-custom-filters.md +548 -466
- package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +176 -244
- package/assets/docs/guide/filters-and-effects/distortion.md +317 -384
- package/assets/docs/guide/filters-and-effects/duotone.md +221 -217
- package/assets/docs/guide/filters-and-effects/gradients.md +670 -813
- package/assets/docs/guide/filters-and-effects/overview.md +7 -7
- package/assets/docs/guide/filters-and-effects/support.md +97 -132
- package/assets/docs/guide/filters-and-effects.md +11 -6
- package/assets/docs/guide/get-started/agent-skills.md +20 -18
- package/assets/docs/guide/get-started/build-with-ai.md +7 -4
- package/assets/docs/guide/get-started/bun.md +219 -0
- package/assets/docs/guide/get-started/deno.md +161 -0
- package/assets/docs/guide/get-started/mcp-server.md +6 -4
- package/assets/docs/guide/get-started/overview.md +11 -6
- package/assets/docs/guide/get-started/vanilla-aws-lambda.md +506 -0
- package/assets/docs/guide/get-started/vanilla-clone-github-project.md +124 -0
- package/assets/docs/guide/get-started/vanilla.md +235 -0
- package/assets/docs/guide/guides/export-save-publish/export/audio.md +80 -66
- package/assets/docs/guide/guides.md +10 -9
- package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +259 -288
- package/assets/docs/guide/import-media/concepts.md +20 -38
- package/assets/docs/guide/import-media/content-json-schema.md +145 -125
- package/assets/docs/guide/import-media/default-assets.md +113 -161
- package/assets/docs/guide/import-media/edit-or-remove-assets.md +391 -395
- package/assets/docs/guide/import-media/file-format-support.md +78 -61
- package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +273 -244
- package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +152 -222
- package/assets/docs/guide/import-media/from-remote-source.md +9 -11
- package/assets/docs/guide/import-media/overview.md +5 -5
- package/assets/docs/guide/import-media/retrieve-mimetype.md +216 -108
- package/assets/docs/guide/import-media/size-limits.md +6 -4
- package/assets/docs/guide/import-media/source-sets.md +190 -251
- package/assets/docs/guide/import-media.md +10 -8
- package/assets/docs/guide/insert-media/audio.md +202 -195
- package/assets/docs/guide/insert-media/images.md +190 -188
- package/assets/docs/guide/insert-media/position-and-align.md +284 -551
- package/assets/docs/guide/insert-media/shapes-or-stickers.md +402 -418
- package/assets/docs/guide/insert-media/videos.md +236 -203
- package/assets/docs/guide/insert-media.md +10 -5
- package/assets/docs/guide/key-capabilities.md +36 -4
- package/assets/docs/guide/key-concepts.md +6 -4
- package/assets/docs/guide/licensing.md +6 -4
- package/assets/docs/guide/llms-txt.md +11 -7
- package/assets/docs/guide/open-the-editor/blank-canvas.md +102 -63
- package/assets/docs/guide/open-the-editor/from-image.md +157 -127
- package/assets/docs/guide/open-the-editor/from-template.md +131 -92
- package/assets/docs/guide/open-the-editor/from-video.md +204 -212
- package/assets/docs/guide/open-the-editor/import-design/from-archive.md +310 -360
- package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +716 -513
- package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +667 -695
- package/assets/docs/guide/open-the-editor/import-design.md +228 -266
- package/assets/docs/guide/open-the-editor/load-scene.md +72 -68
- package/assets/docs/guide/open-the-editor/overview.md +6 -4
- package/assets/docs/guide/open-the-editor/uri-resolver.md +160 -251
- package/assets/docs/guide/open-the-editor.md +11 -9
- package/assets/docs/guide/outlines/overview.md +12 -4
- package/assets/docs/guide/outlines/shadows-and-glows.md +105 -410
- package/assets/docs/guide/outlines/strokes.md +218 -166
- package/assets/docs/guide/outlines.md +9 -4
- package/assets/docs/guide/overview.md +14 -6
- package/assets/docs/guide/performance.md +220 -113
- package/assets/docs/guide/plugins/print-ready-pdf.md +273 -368
- package/assets/docs/guide/plugins.md +10 -16
- package/assets/docs/guide/rules/asset-handling.md +7 -18
- package/assets/docs/guide/rules/common-pitfalls.md +25 -42
- package/assets/docs/guide/rules/content-fill-mode.md +4 -4
- package/assets/docs/guide/rules/enforce-brand-guidelines.md +398 -567
- package/assets/docs/guide/rules/lock-content.md +188 -231
- package/assets/docs/guide/rules/moderate-content.md +580 -571
- package/assets/docs/guide/rules/overview.md +345 -380
- package/assets/docs/guide/rules/silent-init-errors.md +4 -1
- package/assets/docs/guide/rules/verify-properties-before-use.md +2 -11
- package/assets/docs/guide/rules.md +10 -5
- package/assets/docs/guide/security.md +7 -5
- package/assets/docs/guide/serve-assets.md +57 -284
- package/assets/docs/guide/settings.md +96 -74
- package/assets/docs/guide/shapes.md +10 -5
- package/assets/docs/guide/stickers-and-shapes/combine.md +397 -583
- package/assets/docs/guide/stickers-and-shapes/create-cutout.md +181 -268
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +418 -431
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +147 -226
- package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +138 -123
- package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +151 -149
- package/assets/docs/guide/stickers.md +9 -4
- package/assets/docs/guide/text/add.md +470 -482
- package/assets/docs/guide/text/adjust-spacing.md +179 -214
- package/assets/docs/guide/text/auto-size.md +210 -271
- package/assets/docs/guide/text/edit.md +294 -309
- package/assets/docs/guide/text/effects.md +154 -190
- package/assets/docs/guide/text/emojis.md +199 -232
- package/assets/docs/guide/text/language-support.md +369 -382
- package/assets/docs/guide/text/overview.md +41 -4
- package/assets/docs/guide/text/styling.md +239 -273
- package/assets/docs/guide/text/text-designs.md +405 -544
- package/assets/docs/guide/text.md +10 -9
- package/assets/docs/guide/to-v1-19.md +12 -10
- package/assets/docs/guide/upgrade.md +8 -9
- package/assets/docs/guide/use-templates/apply-template.md +174 -163
- package/assets/docs/guide/use-templates/generate.md +171 -152
- package/assets/docs/guide/use-templates/overview.md +32 -4
- package/assets/docs/guide/use-templates/programmatic.md +266 -301
- package/assets/docs/guide/use-templates/replace-content.md +181 -171
- package/assets/docs/guide/what-is-cesdk.md +71 -282
- package/assets/docs/handbook/SKILL.md +24 -0
- package/dist/assets/inline.generated.d.ts.map +1 -1
- package/dist/assets/inline.generated.js +544 -406
- package/dist/assets/inline.generated.js.map +1 -1
- package/dist/assets/load-browser.d.ts +1 -1
- package/dist/assets/load-browser.js +1 -1
- package/dist/assets/load-browser.js.map +1 -1
- package/dist/assets/load-node.d.ts +1 -1
- package/dist/assets/load-node.js +1 -1
- package/dist/assets/load-node.js.map +1 -1
- package/dist/cli/http.d.ts.map +1 -1
- package/dist/cli/http.js +4 -28
- package/dist/cli/http.js.map +1 -1
- package/dist/cli/redirect-console.d.ts +1 -1
- package/dist/cli/redirect-console.d.ts.map +1 -1
- package/dist/cli/redirect-console.js +12 -3
- package/dist/cli/redirect-console.js.map +1 -1
- package/dist/cli/resolve-license.d.ts.map +1 -1
- package/dist/cli/resolve-license.js +8 -6
- package/dist/cli/resolve-license.js.map +1 -1
- package/dist/cli/stdio.d.ts +9 -0
- package/dist/cli/stdio.d.ts.map +1 -1
- package/dist/cli/stdio.js +48 -4
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -1
- package/dist/config.js.map +1 -1
- package/dist/diagnostics/bundle.d.ts +10 -0
- package/dist/diagnostics/bundle.d.ts.map +1 -0
- package/dist/diagnostics/bundle.js +148 -0
- package/dist/diagnostics/bundle.js.map +1 -0
- package/dist/diagnostics/compose.d.ts +3 -0
- package/dist/diagnostics/compose.d.ts.map +1 -0
- package/dist/diagnostics/compose.js +15 -0
- package/dist/diagnostics/compose.js.map +1 -0
- package/dist/diagnostics/events.d.ts +34 -0
- package/dist/diagnostics/events.d.ts.map +1 -0
- package/dist/diagnostics/events.js +3 -0
- package/dist/diagnostics/events.js.map +1 -0
- package/dist/diagnostics/file-sink.d.ts +38 -0
- package/dist/diagnostics/file-sink.d.ts.map +1 -0
- package/dist/diagnostics/file-sink.js +157 -0
- package/dist/diagnostics/file-sink.js.map +1 -0
- package/dist/diagnostics/redact.d.ts +7 -0
- package/dist/diagnostics/redact.d.ts.map +1 -0
- package/dist/diagnostics/redact.js +43 -0
- package/dist/diagnostics/redact.js.map +1 -0
- package/dist/diagnostics/tool-call-adapter.d.ts +4 -0
- package/dist/diagnostics/tool-call-adapter.d.ts.map +1 -0
- package/dist/diagnostics/tool-call-adapter.js +21 -0
- package/dist/diagnostics/tool-call-adapter.js.map +1 -0
- package/dist/engine/cesdk-adapter.d.ts +5 -1
- package/dist/engine/cesdk-adapter.d.ts.map +1 -1
- package/dist/engine/cesdk-adapter.js +9 -2
- package/dist/engine/cesdk-adapter.js.map +1 -1
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +4 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/scene-resource-schemes.d.ts +2 -0
- package/dist/engine/scene-resource-schemes.d.ts.map +1 -0
- package/dist/engine/scene-resource-schemes.js +20 -0
- package/dist/engine/scene-resource-schemes.js.map +1 -0
- package/dist/http/server.d.ts +0 -6
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +1 -2
- package/dist/http/server.js.map +1 -1
- package/dist/server.d.ts +0 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -60
- package/dist/server.js.map +1 -1
- package/dist/test/scripts/changelog-add.d.ts +8 -0
- package/dist/test/scripts/changelog-add.d.ts.map +1 -0
- package/dist/test/scripts/changelog-add.js +50 -0
- package/dist/test/scripts/changelog-add.js.map +1 -0
- package/dist/test/scripts/changelog-collate.d.ts +38 -0
- package/dist/test/scripts/changelog-collate.d.ts.map +1 -0
- package/dist/test/scripts/changelog-collate.js +171 -0
- package/dist/test/scripts/changelog-collate.js.map +1 -0
- package/dist/test/test/changelog.test.d.ts +2 -0
- package/dist/test/test/changelog.test.d.ts.map +1 -0
- package/dist/test/test/changelog.test.js +293 -0
- package/dist/test/test/changelog.test.js.map +1 -0
- package/dist/test/test/cli/dispatcher.test.js +10 -3
- package/dist/test/test/cli/dispatcher.test.js.map +1 -1
- package/dist/test/test/cli/redirect-console.test.js +31 -0
- package/dist/test/test/cli/redirect-console.test.js.map +1 -1
- package/dist/test/test/cli/resolve-license.test.js +10 -1
- package/dist/test/test/cli/resolve-license.test.js.map +1 -1
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts +2 -0
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts.map +1 -0
- package/dist/test/test/cli/stdio-diagnostics.test.js +31 -0
- package/dist/test/test/cli/stdio-diagnostics.test.js.map +1 -0
- package/dist/test/test/config.test.js +17 -13
- package/dist/test/test/config.test.js.map +1 -1
- package/dist/test/test/diagnostics/bundle.test.d.ts +2 -0
- package/dist/test/test/diagnostics/bundle.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/bundle.test.js +53 -0
- package/dist/test/test/diagnostics/bundle.test.js.map +1 -0
- package/dist/test/test/diagnostics/compose.test.d.ts +2 -0
- package/dist/test/test/diagnostics/compose.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/compose.test.js +31 -0
- package/dist/test/test/diagnostics/compose.test.js.map +1 -0
- package/dist/test/test/diagnostics/file-sink.test.d.ts +2 -0
- package/dist/test/test/diagnostics/file-sink.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/file-sink.test.js +113 -0
- package/dist/test/test/diagnostics/file-sink.test.js.map +1 -0
- package/dist/test/test/diagnostics/redact.test.d.ts +2 -0
- package/dist/test/test/diagnostics/redact.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/redact.test.js +59 -0
- package/dist/test/test/diagnostics/redact.test.js.map +1 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts +2 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.js +34 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.js.map +1 -0
- package/dist/test/test/engine/cesdk-adapter.test.d.ts +2 -0
- package/dist/test/test/engine/cesdk-adapter.test.d.ts.map +1 -0
- package/dist/test/test/engine/cesdk-adapter.test.js +32 -0
- package/dist/test/test/engine/cesdk-adapter.test.js.map +1 -0
- package/dist/test/test/handbook-contract.test.js +6 -2
- package/dist/test/test/handbook-contract.test.js.map +1 -1
- package/dist/test/test/http/server.test.js +0 -36
- package/dist/test/test/http/server.test.js.map +1 -1
- package/dist/test/test/http/workspace-auth.test.js +0 -1
- package/dist/test/test/http/workspace-auth.test.js.map +1 -1
- package/dist/test/test/server.test.js +0 -40
- package/dist/test/test/server.test.js.map +1 -1
- package/dist/test/test/tools/edit-harness.d.ts +14 -0
- package/dist/test/test/tools/edit-harness.d.ts.map +1 -0
- package/dist/test/test/tools/edit-harness.js +30 -0
- package/dist/test/test/tools/edit-harness.js.map +1 -0
- package/dist/test/test/tools/edit.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/edit.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/edit.telemetry.test.js +46 -0
- package/dist/test/test/tools/edit.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/export-harness.d.ts +13 -0
- package/dist/test/test/tools/export-harness.d.ts.map +1 -0
- package/dist/test/test/tools/export-harness.js +27 -0
- package/dist/test/test/tools/export-harness.js.map +1 -0
- package/dist/test/test/tools/export.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/export.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/export.telemetry.test.js +65 -0
- package/dist/test/test/tools/export.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/import.test.d.ts +2 -0
- package/dist/test/test/tools/import.test.d.ts.map +1 -0
- package/dist/test/test/tools/import.test.js +122 -0
- package/dist/test/test/tools/import.test.js.map +1 -0
- package/dist/test/test/tools/index.test.js +78 -16
- package/dist/test/test/tools/index.test.js.map +1 -1
- package/dist/test/test/tools/load.integration.test.d.ts +2 -0
- package/dist/test/test/tools/load.integration.test.d.ts.map +1 -0
- package/dist/test/test/tools/load.integration.test.js +165 -0
- package/dist/test/test/tools/load.integration.test.js.map +1 -0
- package/dist/test/test/tools/load.test.d.ts +2 -0
- package/dist/test/test/tools/load.test.d.ts.map +1 -0
- package/dist/test/test/tools/load.test.js +387 -0
- package/dist/test/test/tools/load.test.js.map +1 -0
- package/dist/test/test/tools/preview-harness.d.ts +9 -0
- package/dist/test/test/tools/preview-harness.d.ts.map +1 -0
- package/dist/test/test/tools/preview-harness.js +23 -0
- package/dist/test/test/tools/preview-harness.js.map +1 -0
- package/dist/test/test/tools/preview.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/preview.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/preview.telemetry.test.js +36 -0
- package/dist/test/test/tools/preview.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/schema-best-practices.d.ts +13 -0
- package/dist/test/test/tools/schema-best-practices.d.ts.map +1 -0
- package/dist/test/test/tools/schema-best-practices.js +169 -0
- package/dist/test/test/tools/schema-best-practices.js.map +1 -0
- package/dist/test/test/tools/schema-best-practices.test.d.ts +3 -0
- package/dist/test/test/tools/schema-best-practices.test.d.ts.map +1 -0
- package/dist/test/test/tools/schema-best-practices.test.js +194 -0
- package/dist/test/test/tools/schema-best-practices.test.js.map +1 -0
- package/dist/test/test/tools/spans.test.d.ts +2 -0
- package/dist/test/test/tools/spans.test.d.ts.map +1 -0
- package/dist/test/test/tools/spans.test.js +84 -0
- package/dist/test/test/tools/spans.test.js.map +1 -0
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts +2 -0
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts.map +1 -0
- package/dist/test/test/viewer/cesdk-cdn.test.js +19 -0
- package/dist/test/test/viewer/cesdk-cdn.test.js.map +1 -0
- package/dist/test/test/viewer/config-route.test.d.ts +2 -0
- package/dist/test/test/viewer/config-route.test.d.ts.map +1 -0
- package/dist/test/test/viewer/config-route.test.js +28 -0
- package/dist/test/test/viewer/config-route.test.js.map +1 -0
- package/dist/test/test/viewer/spa-version.test.d.ts +2 -0
- package/dist/test/test/viewer/spa-version.test.d.ts.map +1 -0
- package/dist/test/test/viewer/spa-version.test.js +14 -0
- package/dist/test/test/viewer/spa-version.test.js.map +1 -0
- package/dist/test/test/workspace/content-hash.test.d.ts +2 -0
- package/dist/test/test/workspace/content-hash.test.d.ts.map +1 -0
- package/dist/test/test/workspace/content-hash.test.js +17 -0
- package/dist/test/test/workspace/content-hash.test.js.map +1 -0
- package/dist/test/tsconfig.test.tsbuildinfo +1 -1
- package/dist/test/vitest.config.js +1 -1
- package/dist/test/vitest.config.js.map +1 -1
- package/dist/tools/asset-generate.d.ts.map +1 -1
- package/dist/tools/asset-generate.js +1 -8
- package/dist/tools/asset-generate.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +145 -96
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/export.d.ts +3 -0
- package/dist/tools/export.d.ts.map +1 -1
- package/dist/tools/export.js +146 -108
- package/dist/tools/export.js.map +1 -1
- package/dist/tools/import.d.ts +12 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +144 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +44 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/load.d.ts +26 -0
- package/dist/tools/load.d.ts.map +1 -0
- package/dist/tools/load.js +400 -0
- package/dist/tools/load.js.map +1 -0
- package/dist/tools/preview.d.ts +3 -0
- package/dist/tools/preview.d.ts.map +1 -1
- package/dist/tools/preview.js +79 -44
- package/dist/tools/preview.js.map +1 -1
- package/dist/tools/result.d.ts +1 -1
- package/dist/tools/result.js +2 -2
- package/dist/tools/result.js.map +1 -1
- package/dist/tools/spans.d.ts +45 -0
- package/dist/tools/spans.d.ts.map +1 -0
- package/dist/tools/spans.js +77 -0
- package/dist/tools/spans.js.map +1 -0
- package/dist/tools/telemetry-wrapper.d.ts +4 -0
- package/dist/tools/telemetry-wrapper.d.ts.map +1 -0
- package/dist/tools/telemetry-wrapper.js +43 -0
- package/dist/tools/telemetry-wrapper.js.map +1 -0
- package/dist/viewer/cesdk-cdn.d.ts +16 -0
- package/dist/viewer/cesdk-cdn.d.ts.map +1 -0
- package/dist/viewer/cesdk-cdn.js +30 -0
- package/dist/viewer/cesdk-cdn.js.map +1 -0
- package/dist/viewer/router.d.ts +6 -0
- package/dist/viewer/router.d.ts.map +1 -1
- package/dist/viewer/router.js +4 -1
- package/dist/viewer/router.js.map +1 -1
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -1
- package/dist/viewer/spa-assets.generated.js +2 -3
- package/dist/viewer/spa-assets.generated.js.map +1 -1
- package/dist/workspace/content-hash.d.ts +2 -0
- package/dist/workspace/content-hash.d.ts.map +1 -0
- package/dist/workspace/content-hash.js +15 -0
- package/dist/workspace/content-hash.js.map +1 -0
- package/package.json +18 -9
- package/assets/docs/guide/actions.md +0 -1038
- package/assets/docs/guide/animation/overview.md +0 -22
- package/assets/docs/guide/automation/batch-processing.md +0 -474
- package/assets/docs/guide/browser-support.md +0 -38
- package/assets/docs/guide/concepts/edit-modes.md +0 -431
- package/assets/docs/guide/concepts/headless-mode/browser.md +0 -291
- package/assets/docs/guide/create-audio/audio.md +0 -336
- package/assets/docs/guide/create-video/overview.md +0 -224
- package/assets/docs/guide/create-video/timeline-editor.md +0 -622
- package/assets/docs/guide/create-video/update-caption-presets.md +0 -676
- package/assets/docs/guide/edit-image/vectorize.md +0 -204
- package/assets/docs/guide/export-save-publish/export/to-html5.md +0 -474
- package/assets/docs/guide/export-save-publish/export/to-mp4.md +0 -364
- package/assets/docs/guide/get-started/vanilla-js/quickstart.md +0 -175
- package/assets/docs/guide/grid-and-rulers.md +0 -222
- package/assets/docs/guide/guides/text/rendering-internals.md +0 -796
- package/assets/docs/guide/import-media/asset-library.md +0 -23
- package/assets/docs/guide/import-media/asset-panel/basics.md +0 -324
- package/assets/docs/guide/import-media/asset-panel/customize.md +0 -478
- package/assets/docs/guide/import-media/asset-panel/thumbnails.md +0 -633
- package/assets/docs/guide/import-media/capture-from-camera/record-video.md +0 -137
- package/assets/docs/guide/import-media/capture-from-camera.md +0 -20
- package/assets/docs/guide/import-media/from-local-source/user-upload.md +0 -438
- package/assets/docs/guide/import-media/from-local-source.md +0 -20
- package/assets/docs/guide/import-media/from-remote-source/getty-images.md +0 -627
- package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +0 -625
- package/assets/docs/guide/import-media/from-remote-source/pexels.md +0 -692
- package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +0 -497
- package/assets/docs/guide/import-media/from-remote-source/third-party.md +0 -51
- package/assets/docs/guide/import-media/from-remote-source/unsplash.md +0 -914
- package/assets/docs/guide/import-media/from-remote-source/your-server.md +0 -764
- package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +0 -228
- package/assets/docs/guide/open-the-editor/set-zoom-level.md +0 -303
- package/assets/docs/guide/plugins/asset-sources.md +0 -553
- package/assets/docs/guide/starterkits/3d-mockup-editor.md +0 -748
- package/assets/docs/guide/starterkits/advanced-editor.md +0 -698
- package/assets/docs/guide/starterkits/advanced-video-editor.md +0 -696
- package/assets/docs/guide/starterkits/ai-editor.md +0 -749
- package/assets/docs/guide/starterkits/airtable-image-editor.md +0 -672
- package/assets/docs/guide/starterkits/apparel-ui.md +0 -188
- package/assets/docs/guide/starterkits/assets.md +0 -27
- package/assets/docs/guide/starterkits/auto-resize.md +0 -586
- package/assets/docs/guide/starterkits/automated-video-generation.md +0 -692
- package/assets/docs/guide/starterkits/background-removal-editor.md +0 -480
- package/assets/docs/guide/starterkits/content-moderation.md +0 -863
- package/assets/docs/guide/starterkits/creative-automation.md +0 -28
- package/assets/docs/guide/starterkits/custom-built-uis.md +0 -26
- package/assets/docs/guide/starterkits/customization.md +0 -29
- package/assets/docs/guide/starterkits/cutout-lines-editor.md +0 -470
- package/assets/docs/guide/starterkits/data-merge.md +0 -850
- package/assets/docs/guide/starterkits/design-editor.md +0 -698
- package/assets/docs/guide/starterkits/design-generation.md +0 -719
- package/assets/docs/guide/starterkits/design-validation.md +0 -808
- package/assets/docs/guide/starterkits/editor-ui-configurations.md +0 -14
- package/assets/docs/guide/starterkits/export-options.md +0 -724
- package/assets/docs/guide/starterkits/export-using-renderer.md +0 -708
- package/assets/docs/guide/starterkits/extensibility.md +0 -28
- package/assets/docs/guide/starterkits/force-crop-editor.md +0 -675
- package/assets/docs/guide/starterkits/form-based-template-adoption.md +0 -522
- package/assets/docs/guide/starterkits/getty-images-editor.md +0 -700
- package/assets/docs/guide/starterkits/html5-ads-exporter.md +0 -719
- package/assets/docs/guide/starterkits/indesign-template-import.md +0 -580
- package/assets/docs/guide/starterkits/layouts-editor.md +0 -724
- package/assets/docs/guide/starterkits/mobile-ui.md +0 -185
- package/assets/docs/guide/starterkits/mockup-editor.md +0 -745
- package/assets/docs/guide/starterkits/multi-image-generation.md +0 -542
- package/assets/docs/guide/starterkits/page-sizes-editor.md +0 -657
- package/assets/docs/guide/starterkits/pexels-image-editor.md +0 -665
- package/assets/docs/guide/starterkits/photo-editor.md +0 -755
- package/assets/docs/guide/starterkits/photo-ui.md +0 -186
- package/assets/docs/guide/starterkits/photobook-ui.md +0 -188
- package/assets/docs/guide/starterkits/placeholders.md +0 -678
- package/assets/docs/guide/starterkits/player.md +0 -405
- package/assets/docs/guide/starterkits/plugins.md +0 -25
- package/assets/docs/guide/starterkits/postcard-editor.md +0 -202
- package/assets/docs/guide/starterkits/pptx-template-import.md +0 -581
- package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +0 -746
- package/assets/docs/guide/starterkits/product-editor.md +0 -773
- package/assets/docs/guide/starterkits/psd-template-import.md +0 -580
- package/assets/docs/guide/starterkits/qr-code-editor.md +0 -470
- package/assets/docs/guide/starterkits/single-page-editor.md +0 -661
- package/assets/docs/guide/starterkits/start-with-image.md +0 -684
- package/assets/docs/guide/starterkits/start-with-video.md +0 -651
- package/assets/docs/guide/starterkits/t-shirt-designer.md +0 -742
- package/assets/docs/guide/starterkits/templating.md +0 -23
- package/assets/docs/guide/starterkits/theming.md +0 -662
- package/assets/docs/guide/starterkits/translation-internationalization.md +0 -662
- package/assets/docs/guide/starterkits/unsplash-editor.md +0 -839
- package/assets/docs/guide/starterkits/vectorizer-editor.md +0 -466
- package/assets/docs/guide/starterkits/version-history.md +0 -745
- package/assets/docs/guide/starterkits/video-animations.md +0 -853
- package/assets/docs/guide/starterkits/video-captions.md +0 -884
- package/assets/docs/guide/starterkits/video-editing.md +0 -25
- package/assets/docs/guide/starterkits/video-editor.md +0 -696
- package/assets/docs/guide/starterkits/video-export-options.md +0 -676
- package/assets/docs/guide/starterkits/viewer.md +0 -400
- package/assets/docs/guide/starterkits.md +0 -41
- package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +0 -362
- package/assets/docs/guide/text/custom-fonts.md +0 -401
- package/assets/docs/guide/text/decorations.md +0 -330
- package/assets/docs/guide/text/enumerations.md +0 -258
- package/assets/docs/guide/to-v1-10.md +0 -131
- package/assets/docs/guide/to-v1-13.md +0 -165
- package/assets/docs/guide/to-v1-32.md +0 -110
- package/assets/docs/guide/to-v1-69.md +0 -468
- package/assets/docs/guide/to-v1-72.md +0 -193
- package/assets/docs/guide/use-templates/library.md +0 -450
- package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +0 -428
- package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +0 -337
- package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +0 -853
- package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +0 -1045
- package/assets/docs/guide/user-interface/ai-integration/image-generation.md +0 -641
- package/assets/docs/guide/user-interface/ai-integration/integrate.md +0 -966
- package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +0 -99
- package/assets/docs/guide/user-interface/ai-integration/text-generation.md +0 -498
- package/assets/docs/guide/user-interface/ai-integration/video-generation.md +0 -493
- package/assets/docs/guide/user-interface/ai-integration.md +0 -30
- package/assets/docs/guide/user-interface/appearance/change-ui-font.md +0 -316
- package/assets/docs/guide/user-interface/appearance/custom-labels.md +0 -509
- package/assets/docs/guide/user-interface/appearance/icons.md +0 -373
- package/assets/docs/guide/user-interface/appearance/theming.md +0 -665
- package/assets/docs/guide/user-interface/appearance.md +0 -23
- package/assets/docs/guide/user-interface/build-your-own-ui.md +0 -620
- package/assets/docs/guide/user-interface/customization/canvas-menu.md +0 -412
- package/assets/docs/guide/user-interface/customization/canvas.md +0 -281
- package/assets/docs/guide/user-interface/customization/color-palette.md +0 -413
- package/assets/docs/guide/user-interface/customization/crop-presets.md +0 -384
- package/assets/docs/guide/user-interface/customization/disable-or-enable.md +0 -676
- package/assets/docs/guide/user-interface/customization/dock.md +0 -399
- package/assets/docs/guide/user-interface/customization/force-crop.md +0 -289
- package/assets/docs/guide/user-interface/customization/inspector-bar.md +0 -371
- package/assets/docs/guide/user-interface/customization/navigation-bar.md +0 -516
- package/assets/docs/guide/user-interface/customization/page-format.md +0 -436
- package/assets/docs/guide/user-interface/customization/panel.md +0 -605
- package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +0 -531
- package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +0 -358
- package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +0 -374
- package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +0 -323
- package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +0 -294
- package/assets/docs/guide/user-interface/customization/quick-start.md +0 -12
- package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +0 -519
- package/assets/docs/guide/user-interface/customization/reference/component-reference.md +0 -333
- package/assets/docs/guide/user-interface/customization/reference.md +0 -12
- package/assets/docs/guide/user-interface/customization.md +0 -39
- package/assets/docs/guide/user-interface/localization.md +0 -633
- package/assets/docs/guide/user-interface/overview.md +0 -167
- package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +0 -411
- package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +0 -721
- package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +0 -331
- package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +0 -553
- package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +0 -672
- package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +0 -415
- package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +0 -521
- package/assets/docs/guide/user-interface/ui-extensions.md +0 -26
- package/assets/docs/guide/user-interface.md +0 -25
- package/assets/prompts/evals-assetGenerate.md +0 -12
- package/assets/prompts/evals-brutalistCore.md +0 -34
- package/assets/prompts/evals-danskCatalogue.md +0 -31
- package/assets/prompts/evals-exportRoundTrip.md +0 -12
- package/assets/prompts/evals-inspectPriorCode.md +0 -16
- package/assets/prompts/evals-listProjectFiles.md +0 -6
- package/assets/prompts/evals-readAndExplainScript.md +0 -6
- package/assets/prompts/evals-resumeAcrossRestart.md +0 -15
- package/assets/prompts/evals-rewindRecovery.md +0 -10
- package/assets/prompts/evals-searchAcrossFiles.md +0 -6
- package/assets/prompts/evals-weddingCard.md +0 -20
- package/assets/prompts/explain.md +0 -6
- package/assets/prompts/review.md +0 -6
- package/dist/frontmatter.d.ts +0 -15
- package/dist/frontmatter.d.ts.map +0 -1
- package/dist/frontmatter.js +0 -46
- package/dist/frontmatter.js.map +0 -1
- package/dist/test/test/frontmatter.test.d.ts +0 -2
- package/dist/test/test/frontmatter.test.d.ts.map +0 -1
- package/dist/test/test/frontmatter.test.js +0 -55
- package/dist/test/test/frontmatter.test.js.map +0 -1
|
@@ -1,413 +1,346 @@
|
|
|
1
|
-
> This is one page of the CE.SDK
|
|
1
|
+
> This is one page of the CE.SDK Node.js documentation. For a complete overview, see the [Node.js Documentation Index](https://img.ly/docs/cesdk/node.md). For all docs in one file, see [llms-full.txt](./llms-full.txt.md).
|
|
2
2
|
|
|
3
3
|
**Navigation:** [Guides](./guides.md) > [Rules](./rules.md) > [Moderate Content](./rules/moderate-content.md)
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Use CE.SDK's engine APIs to extract images and text from designs, then integrate with third-party moderation services to detect inappropriate content.
|
|
7
|
+
Use CE.SDK's engine APIs to extract images and text from designs in Node.js, then integrate with third-party moderation services to detect inappropriate content.
|
|
8
8
|
|
|
9
9
|
> **Reading time:** 8 minutes
|
|
10
10
|
>
|
|
11
11
|
> **Resources:**
|
|
12
12
|
>
|
|
13
13
|
> - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
|
|
14
|
-
>
|
|
15
|
-
> - [
|
|
16
|
-
>
|
|
17
|
-
|
|
18
|
-

|
|
14
|
+
>
|
|
15
|
+
> - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/release-$UBQ_VERSION$/guides-rules-moderate-content-server-js)
|
|
16
|
+
>
|
|
17
|
+
> - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-rules-moderate-content-server-js)
|
|
19
18
|
|
|
20
19
|
CE.SDK does not provide prebuilt content moderation workflows. Instead, it provides powerful engine APIs that make it straightforward to extract images and text from designs for moderation by third-party services of your choice. This approach is intentional: content moderation requirements are highly specific to each business, including which categories to check, what thresholds to apply, and which services to use. Similarly, when and where to check content (during editing, before export, on upload) varies based on your workflow and user experience goals.
|
|
21
20
|
|
|
22
21
|
Content moderation helps maintain quality standards and comply with content policies. Unlike built-in validation rules that check technical aspects like resolution or layout, content moderation requires integration with external AI-powered services (Sightengine, AWS Rekognition, OpenAI Moderation API) to analyze visual content (images for weapons, drugs, nudity) and textual content (profanity, hate speech, threats).
|
|
23
22
|
|
|
24
|
-
```
|
|
25
|
-
import
|
|
26
|
-
CreativeEngine,
|
|
27
|
-
EditorPlugin,
|
|
28
|
-
EditorPluginContext
|
|
29
|
-
} from '@cesdk/cesdk-js';
|
|
30
|
-
import packageJson from './package.json';
|
|
31
|
-
|
|
32
|
-
import {
|
|
33
|
-
BlurAssetSource,
|
|
34
|
-
ColorPaletteAssetSource,
|
|
35
|
-
CropPresetsAssetSource,
|
|
36
|
-
DemoAssetSources,
|
|
37
|
-
EffectsAssetSource,
|
|
38
|
-
FiltersAssetSource,
|
|
39
|
-
PagePresetsAssetSource,
|
|
40
|
-
StickerAssetSource,
|
|
41
|
-
TextAssetSource,
|
|
42
|
-
TextComponentAssetSource,
|
|
43
|
-
TypefaceAssetSource,
|
|
44
|
-
UploadAssetSources,
|
|
45
|
-
VectorShapeAssetSource
|
|
46
|
-
} from '@cesdk/cesdk-js/plugins';
|
|
47
|
-
import { DesignEditorConfig } from './design-editor/plugin';
|
|
48
|
-
|
|
49
|
-
// Type definitions for content moderation
|
|
50
|
-
interface ImageBlockData {
|
|
51
|
-
blockId: number;
|
|
52
|
-
url: string;
|
|
53
|
-
blockType: string;
|
|
54
|
-
blockName: string;
|
|
55
|
-
}
|
|
23
|
+
```javascript file=@cesdk_web_examples/guides-rules-moderate-content-server-js/index.js reference-only
|
|
24
|
+
import CreativeEngine from '@cesdk/node';
|
|
56
25
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
blockType: string;
|
|
61
|
-
blockName: string;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
interface ContentCategory {
|
|
65
|
-
name: string;
|
|
66
|
-
description: string;
|
|
67
|
-
state: 'success' | 'warning' | 'failed';
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
interface ValidationResult extends ContentCategory {
|
|
71
|
-
blockId: number;
|
|
72
|
-
blockType: string;
|
|
73
|
-
blockName: string;
|
|
74
|
-
id: string;
|
|
75
|
-
url?: string; // For image blocks
|
|
76
|
-
text?: string; // For text blocks
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Mock moderation caches
|
|
80
|
-
const imageCache: Record<string, ContentCategory[]> = {};
|
|
81
|
-
const textCache: Record<string, ContentCategory[]> = {};
|
|
26
|
+
// Mock moderation caches for demonstration
|
|
27
|
+
const imageCache = new Map();
|
|
28
|
+
const textCache = new Map();
|
|
82
29
|
|
|
83
30
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* Demonstrates implementing automated content moderation for both images and text
|
|
31
|
+
* Extracts the image URL from a block's fill property
|
|
87
32
|
*/
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
33
|
+
function getImageUrl(engine, blockId) {
|
|
34
|
+
try {
|
|
35
|
+
const imageFill = engine.block.getFill(blockId);
|
|
91
36
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
await cesdk.addPlugin(new DesignEditorConfig());
|
|
97
|
-
|
|
98
|
-
// Add asset source plugins
|
|
99
|
-
await cesdk.addPlugin(new BlurAssetSource());
|
|
100
|
-
await cesdk.addPlugin(new ColorPaletteAssetSource());
|
|
101
|
-
await cesdk.addPlugin(new CropPresetsAssetSource());
|
|
102
|
-
await cesdk.addPlugin(
|
|
103
|
-
new UploadAssetSources({ include: ['ly.img.image.upload'] })
|
|
104
|
-
);
|
|
105
|
-
await cesdk.addPlugin(
|
|
106
|
-
new DemoAssetSources({
|
|
107
|
-
include: [
|
|
108
|
-
'ly.img.templates.blank.*',
|
|
109
|
-
'ly.img.templates.presentation.*',
|
|
110
|
-
'ly.img.templates.print.*',
|
|
111
|
-
'ly.img.templates.social.*',
|
|
112
|
-
'ly.img.image.*'
|
|
113
|
-
]
|
|
114
|
-
})
|
|
37
|
+
const fillImageURI = engine.block.getString(
|
|
38
|
+
imageFill,
|
|
39
|
+
'fill/image/imageFileURI'
|
|
115
40
|
);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
await cesdk.addPlugin(new StickerAssetSource());
|
|
120
|
-
await cesdk.addPlugin(new TextAssetSource());
|
|
121
|
-
await cesdk.addPlugin(new TextComponentAssetSource());
|
|
122
|
-
await cesdk.addPlugin(new TypefaceAssetSource());
|
|
123
|
-
await cesdk.addPlugin(new VectorShapeAssetSource());
|
|
124
|
-
|
|
125
|
-
await cesdk.actions.run('scene.create', {
|
|
126
|
-
page: { width: 1200, height: 800, unit: 'Pixel' }
|
|
127
|
-
});
|
|
41
|
+
if (fillImageURI) {
|
|
42
|
+
return fillImageURI;
|
|
43
|
+
}
|
|
128
44
|
|
|
129
|
-
const
|
|
130
|
-
|
|
45
|
+
const sourceSet = engine.block.getSourceSet(
|
|
46
|
+
imageFill,
|
|
47
|
+
'fill/image/sourceSet'
|
|
48
|
+
);
|
|
49
|
+
if (sourceSet && sourceSet.length > 0) {
|
|
50
|
+
return sourceSet[0].uri;
|
|
51
|
+
}
|
|
131
52
|
|
|
132
|
-
|
|
53
|
+
return null;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
133
58
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Extracts text content from a text block
|
|
61
|
+
*/
|
|
62
|
+
function getTextContent(engine, blockId) {
|
|
63
|
+
try {
|
|
64
|
+
return engine.block.getString(blockId, 'text/text');
|
|
65
|
+
} catch (error) {
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
138
69
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Simulates an image content moderation API call
|
|
72
|
+
* In production, replace this with your actual moderation service
|
|
73
|
+
*/
|
|
74
|
+
async function checkImageContentAPI(url) {
|
|
75
|
+
if (imageCache.has(url)) {
|
|
76
|
+
return imageCache.get(url);
|
|
77
|
+
}
|
|
142
78
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
79
|
+
// Simulate API delay
|
|
80
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
81
|
+
|
|
82
|
+
const results = [
|
|
83
|
+
{
|
|
84
|
+
name: 'Weapons',
|
|
85
|
+
description: 'Handguns, rifles, machine guns, threatening knives',
|
|
86
|
+
state: percentageToState(Math.random() * 0.3)
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'Alcohol',
|
|
90
|
+
description: 'Wine, beer, cocktails, champagne',
|
|
91
|
+
state: percentageToState(Math.random() * 0.4)
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'Drugs',
|
|
95
|
+
description: 'Cannabis, syringes, glass pipes, bongs, pills',
|
|
96
|
+
state: percentageToState(Math.random() * 0.2)
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Nudity',
|
|
100
|
+
description: 'Raw or partial nudity',
|
|
101
|
+
state: percentageToState(Math.random() * 0.3)
|
|
102
|
+
}
|
|
103
|
+
];
|
|
146
104
|
|
|
147
|
-
|
|
105
|
+
imageCache.set(url, results);
|
|
106
|
+
return results;
|
|
107
|
+
}
|
|
148
108
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
109
|
+
/**
|
|
110
|
+
* Simulates a text content moderation API call
|
|
111
|
+
* In production, replace this with your actual moderation service
|
|
112
|
+
*/
|
|
113
|
+
async function checkTextContentAPI(text) {
|
|
114
|
+
if (textCache.has(text)) {
|
|
115
|
+
return textCache.get(text);
|
|
116
|
+
}
|
|
155
117
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
118
|
+
// Simulate API delay
|
|
119
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
120
|
+
|
|
121
|
+
const results = [
|
|
122
|
+
{
|
|
123
|
+
name: 'Profanity',
|
|
124
|
+
description: 'Offensive or vulgar language',
|
|
125
|
+
state: percentageToState(Math.random() * 0.3)
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'Hate Speech',
|
|
129
|
+
description: 'Content promoting hatred or discrimination',
|
|
130
|
+
state: percentageToState(Math.random() * 0.2)
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: 'Threats',
|
|
134
|
+
description: 'Threatening or violent language',
|
|
135
|
+
state: percentageToState(Math.random() * 0.1)
|
|
136
|
+
}
|
|
137
|
+
];
|
|
161
138
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
139
|
+
textCache.set(text, results);
|
|
140
|
+
return results;
|
|
141
|
+
}
|
|
165
142
|
|
|
166
|
-
|
|
143
|
+
/**
|
|
144
|
+
* Maps confidence scores to validation states
|
|
145
|
+
*/
|
|
146
|
+
function percentageToState(percentage) {
|
|
147
|
+
if (percentage > 0.8) {
|
|
148
|
+
return 'failed';
|
|
149
|
+
} else if (percentage > 0.4) {
|
|
150
|
+
return 'warning';
|
|
151
|
+
} else {
|
|
152
|
+
return 'success';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
167
155
|
|
|
168
|
-
|
|
156
|
+
/**
|
|
157
|
+
* Checks all images in the design for inappropriate content
|
|
158
|
+
*/
|
|
159
|
+
async function checkImageContent(engine) {
|
|
160
|
+
const imageBlockIds = engine.block.findByKind('image');
|
|
161
|
+
const imageBlocksData = imageBlockIds
|
|
162
|
+
.map((blockId) => ({
|
|
163
|
+
blockId,
|
|
164
|
+
url: getImageUrl(engine, blockId),
|
|
165
|
+
blockType: engine.block.getType(blockId),
|
|
166
|
+
blockName: engine.block.getName(blockId)
|
|
167
|
+
}))
|
|
168
|
+
.filter((data) => data.url !== null);
|
|
169
|
+
|
|
170
|
+
const imagesWithValidity = await Promise.all(
|
|
171
|
+
imageBlocksData.map(async (imageBlockData) => {
|
|
172
|
+
const categories = await checkImageContentAPI(imageBlockData.url);
|
|
173
|
+
|
|
174
|
+
return categories.map((checkResult) => ({
|
|
175
|
+
...checkResult,
|
|
176
|
+
blockId: imageBlockData.blockId,
|
|
177
|
+
blockType: imageBlockData.blockType,
|
|
178
|
+
blockName: imageBlockData.blockName,
|
|
179
|
+
url: imageBlockData.url,
|
|
180
|
+
id: `${imageBlockData.blockId}-${checkResult.name}`
|
|
181
|
+
}));
|
|
182
|
+
})
|
|
183
|
+
);
|
|
169
184
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
padding: {
|
|
173
|
-
left: 40,
|
|
174
|
-
top: 40,
|
|
175
|
-
right: 40,
|
|
176
|
-
bottom: 40
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
}
|
|
185
|
+
return imagesWithValidity.flat();
|
|
186
|
+
}
|
|
180
187
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
.forEach((id) => engine.block.setSelected(id, false));
|
|
210
|
-
engine.block.setSelected(blockToSelect, true);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
188
|
+
/**
|
|
189
|
+
* Checks all text blocks in the design for inappropriate content
|
|
190
|
+
*/
|
|
191
|
+
async function checkTextContent(engine) {
|
|
192
|
+
const textBlockIds = engine.block.findByType('//ly.img.ubq/text');
|
|
193
|
+
const textBlocksData = textBlockIds
|
|
194
|
+
.map((blockId) => ({
|
|
195
|
+
blockId,
|
|
196
|
+
text: getTextContent(engine, blockId),
|
|
197
|
+
blockType: engine.block.getType(blockId),
|
|
198
|
+
blockName: engine.block.getName(blockId)
|
|
199
|
+
}))
|
|
200
|
+
.filter((data) => data.text.trim().length > 0);
|
|
201
|
+
|
|
202
|
+
const textsWithValidity = await Promise.all(
|
|
203
|
+
textBlocksData.map(async (textBlockData) => {
|
|
204
|
+
const categories = await checkTextContentAPI(textBlockData.text);
|
|
205
|
+
|
|
206
|
+
return categories.map((checkResult) => ({
|
|
207
|
+
...checkResult,
|
|
208
|
+
blockId: textBlockData.blockId,
|
|
209
|
+
blockType: textBlockData.blockType,
|
|
210
|
+
blockName: textBlockData.blockName,
|
|
211
|
+
text: textBlockData.text,
|
|
212
|
+
id: `${textBlockData.blockId}-${checkResult.name}`
|
|
213
|
+
}));
|
|
214
|
+
})
|
|
215
|
+
);
|
|
213
216
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
*/
|
|
217
|
-
private getImageUrl(engine: CreativeEngine, blockId: number): string | null {
|
|
218
|
-
try {
|
|
219
|
-
const imageFill = engine.block.getFill(blockId);
|
|
217
|
+
return textsWithValidity.flat();
|
|
218
|
+
}
|
|
220
219
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
220
|
+
/**
|
|
221
|
+
* Displays validation results grouped by severity
|
|
222
|
+
*/
|
|
223
|
+
function displayResults(results) {
|
|
224
|
+
const failed = results.filter((r) => r.state === 'failed');
|
|
225
|
+
const warnings = results.filter((r) => r.state === 'warning');
|
|
226
|
+
const passed = results.filter((r) => r.state === 'success');
|
|
227
|
+
|
|
228
|
+
console.log('\n=== Content Moderation Results ===\n');
|
|
229
|
+
console.log(`Total checks: ${results.length}`);
|
|
230
|
+
console.log(` Violations: ${failed.length}`);
|
|
231
|
+
console.log(` Warnings: ${warnings.length}`);
|
|
232
|
+
console.log(` Passed: ${passed.length}\n`);
|
|
233
|
+
|
|
234
|
+
if (failed.length > 0) {
|
|
235
|
+
console.log('❌ VIOLATIONS:');
|
|
236
|
+
failed.forEach((result) => {
|
|
237
|
+
const content = result.url || result.text?.substring(0, 50) + '...';
|
|
238
|
+
console.log(
|
|
239
|
+
` - ${result.name}: Block ${result.blockId} (${result.blockType})`
|
|
224
240
|
);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
241
|
+
console.log(` ${result.description}`);
|
|
242
|
+
console.log(` Content: ${content}\n`);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
228
245
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
246
|
+
if (warnings.length > 0) {
|
|
247
|
+
console.log('⚠️ WARNINGS:');
|
|
248
|
+
warnings.forEach((result) => {
|
|
249
|
+
const content = result.url || result.text?.substring(0, 50) + '...';
|
|
250
|
+
console.log(
|
|
251
|
+
` - ${result.name}: Block ${result.blockId} (${result.blockType})`
|
|
232
252
|
);
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
return null;
|
|
238
|
-
} catch (error) {
|
|
239
|
-
return null;
|
|
240
|
-
}
|
|
253
|
+
console.log(` ${result.description}`);
|
|
254
|
+
console.log(` Content: ${content}\n`);
|
|
255
|
+
});
|
|
241
256
|
}
|
|
242
257
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
*/
|
|
246
|
-
private getTextContent(engine: CreativeEngine, blockId: number): string {
|
|
247
|
-
try {
|
|
248
|
-
return engine.block.getString(blockId, 'text/text');
|
|
249
|
-
} catch (error) {
|
|
250
|
-
return '';
|
|
251
|
-
}
|
|
252
|
-
}
|
|
258
|
+
return { failed, warnings, passed };
|
|
259
|
+
}
|
|
253
260
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
): Promise<ValidationResult[]> {
|
|
260
|
-
const imageBlockIds = engine.block.findByKind('image');
|
|
261
|
-
const imageBlocksData: ImageBlockData[] = imageBlockIds
|
|
262
|
-
.map((blockId) => ({
|
|
263
|
-
blockId,
|
|
264
|
-
url: this.getImageUrl(engine, blockId),
|
|
265
|
-
blockType: engine.block.getType(blockId),
|
|
266
|
-
blockName: engine.block.getName(blockId)
|
|
267
|
-
}))
|
|
268
|
-
.filter((data) => data.url !== null) as ImageBlockData[];
|
|
269
|
-
|
|
270
|
-
const imagesWithValidity = await Promise.all(
|
|
271
|
-
imageBlocksData.map(async (imageBlockData) => {
|
|
272
|
-
const categories = await this.checkImageContentAPI(imageBlockData.url);
|
|
273
|
-
|
|
274
|
-
return categories.map((checkResult) => ({
|
|
275
|
-
...checkResult,
|
|
276
|
-
blockId: imageBlockData.blockId,
|
|
277
|
-
blockType: imageBlockData.blockType,
|
|
278
|
-
blockName: imageBlockData.blockName,
|
|
279
|
-
url: imageBlockData.url,
|
|
280
|
-
id: `${imageBlockData.blockId}-${checkResult.name}`
|
|
281
|
-
}));
|
|
282
|
-
})
|
|
283
|
-
);
|
|
261
|
+
/**
|
|
262
|
+
* Validates content before allowing export
|
|
263
|
+
*/
|
|
264
|
+
async function validateForExport(engine) {
|
|
265
|
+
console.log('Validating design before export...');
|
|
284
266
|
|
|
285
|
-
|
|
286
|
-
|
|
267
|
+
const imageResults = await checkImageContent(engine);
|
|
268
|
+
const textResults = await checkTextContent(engine);
|
|
269
|
+
const allResults = [...imageResults, ...textResults];
|
|
287
270
|
|
|
288
|
-
|
|
289
|
-
* Checks all text blocks in the design for inappropriate content
|
|
290
|
-
*/
|
|
291
|
-
private async checkTextContent(
|
|
292
|
-
engine: CreativeEngine
|
|
293
|
-
): Promise<ValidationResult[]> {
|
|
294
|
-
const textBlockIds = engine.block.findByType('//ly.img.ubq/text');
|
|
295
|
-
const textBlocksData: TextBlockData[] = textBlockIds
|
|
296
|
-
.map((blockId) => ({
|
|
297
|
-
blockId,
|
|
298
|
-
text: this.getTextContent(engine, blockId),
|
|
299
|
-
blockType: engine.block.getType(blockId),
|
|
300
|
-
blockName: engine.block.getName(blockId)
|
|
301
|
-
}))
|
|
302
|
-
.filter((data) => data.text.trim().length > 0);
|
|
303
|
-
|
|
304
|
-
const textsWithValidity = await Promise.all(
|
|
305
|
-
textBlocksData.map(async (textBlockData) => {
|
|
306
|
-
const categories = await this.checkTextContentAPI(textBlockData.text);
|
|
307
|
-
|
|
308
|
-
return categories.map((checkResult) => ({
|
|
309
|
-
...checkResult,
|
|
310
|
-
blockId: textBlockData.blockId,
|
|
311
|
-
blockType: textBlockData.blockType,
|
|
312
|
-
blockName: textBlockData.blockName,
|
|
313
|
-
text: textBlockData.text,
|
|
314
|
-
id: `${textBlockData.blockId}-${checkResult.name}`
|
|
315
|
-
}));
|
|
316
|
-
})
|
|
317
|
-
);
|
|
271
|
+
const { failed } = displayResults(allResults);
|
|
318
272
|
|
|
319
|
-
|
|
273
|
+
if (failed.length > 0) {
|
|
274
|
+
console.error(
|
|
275
|
+
`\n❌ Export blocked: ${failed.length} policy violation(s) detected.\n`
|
|
276
|
+
);
|
|
277
|
+
return false;
|
|
320
278
|
}
|
|
321
279
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
private async checkImageContentAPI(url: string): Promise<ContentCategory[]> {
|
|
326
|
-
if (imageCache[url]) {
|
|
327
|
-
return imageCache[url];
|
|
328
|
-
}
|
|
280
|
+
console.log('\n✅ Content validation passed. Export allowed.\n');
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
329
283
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
{
|
|
344
|
-
name: 'Drugs',
|
|
345
|
-
description: 'Cannabis, syringes, glass pipes, bongs, pills',
|
|
346
|
-
state: this.percentageToState(Math.random() * 0.2)
|
|
347
|
-
},
|
|
348
|
-
{
|
|
349
|
-
name: 'Nudity',
|
|
350
|
-
description: 'Raw or partial nudity',
|
|
351
|
-
state: this.percentageToState(Math.random() * 0.3)
|
|
284
|
+
/**
|
|
285
|
+
* Main demonstration function
|
|
286
|
+
*/
|
|
287
|
+
async function main() {
|
|
288
|
+
console.log('🚀 Starting CE.SDK Content Moderation Demo...\n');
|
|
289
|
+
|
|
290
|
+
// Initialize the engine
|
|
291
|
+
const config = {
|
|
292
|
+
baseURL: process.env.IMGLY_LOCAL_ASSETS_URL,
|
|
293
|
+
license: process.env.CESDK_LICENSE || '',
|
|
294
|
+
logger: (level, ...args) => {
|
|
295
|
+
if (level === 'error' || level === 'warn') {
|
|
296
|
+
console.log(`[${level}]`, ...args);
|
|
352
297
|
}
|
|
353
|
-
];
|
|
354
|
-
|
|
355
|
-
imageCache[url] = results;
|
|
356
|
-
return results;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* Simulates a text content moderation API call
|
|
361
|
-
*/
|
|
362
|
-
private async checkTextContentAPI(text: string): Promise<ContentCategory[]> {
|
|
363
|
-
if (textCache[text]) {
|
|
364
|
-
return textCache[text];
|
|
365
298
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
const engine = await CreativeEngine.init(config);
|
|
302
|
+
console.log('✓ Engine initialized\n');
|
|
303
|
+
|
|
304
|
+
// Load a sample scene/template
|
|
305
|
+
// In production, use your actual scene URL or template
|
|
306
|
+
const templateURL =
|
|
307
|
+
'https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_1.scene';
|
|
308
|
+
await engine.scene.loadFromURL(templateURL);
|
|
309
|
+
const page = engine.block.findByType('page')[0];
|
|
310
|
+
console.log('✓ Scene loaded\n');
|
|
311
|
+
|
|
312
|
+
// The loaded scene already contains images and text
|
|
313
|
+
// In production, you would modify the scene content as needed
|
|
314
|
+
console.log('✓ Scene contains sample content for moderation\n');
|
|
315
|
+
|
|
316
|
+
// Validate content before export
|
|
317
|
+
const canExport = await validateForExport(engine);
|
|
318
|
+
|
|
319
|
+
if (canExport) {
|
|
320
|
+
// Export the design
|
|
321
|
+
const blob = await engine.block.export(page, 'image/png');
|
|
322
|
+
const buffer = Buffer.from(await blob.arrayBuffer());
|
|
323
|
+
|
|
324
|
+
// Save to file (optional)
|
|
325
|
+
const fs = await import('fs/promises');
|
|
326
|
+
await fs.writeFile('output.png', buffer);
|
|
327
|
+
console.log('✓ Design exported to output.png\n');
|
|
389
328
|
}
|
|
390
329
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
percentage: number
|
|
396
|
-
): 'success' | 'warning' | 'failed' {
|
|
397
|
-
if (percentage > 0.8) {
|
|
398
|
-
return 'failed';
|
|
399
|
-
} else if (percentage > 0.4) {
|
|
400
|
-
return 'warning';
|
|
401
|
-
} else {
|
|
402
|
-
return 'success';
|
|
403
|
-
}
|
|
404
|
-
}
|
|
330
|
+
// Clean up
|
|
331
|
+
engine.dispose();
|
|
332
|
+
console.log('✓ Engine disposed\n');
|
|
333
|
+
console.log('Demo complete! 🎉');
|
|
405
334
|
}
|
|
406
335
|
|
|
407
|
-
|
|
336
|
+
// Run the demo
|
|
337
|
+
main().catch((error) => {
|
|
338
|
+
console.error('Error:', error);
|
|
339
|
+
process.exit(1);
|
|
340
|
+
});
|
|
408
341
|
```
|
|
409
342
|
|
|
410
|
-
This guide demonstrates how to use CE.SDK's engine APIs to find and extract content from designs, send it to moderation APIs, and
|
|
343
|
+
This guide demonstrates how to use CE.SDK's engine APIs to find and extract content from designs in Node.js, send it to moderation APIs, and validate before export in server environments.
|
|
411
344
|
|
|
412
345
|
## Finding Content in Designs
|
|
413
346
|
|
|
@@ -415,82 +348,80 @@ Locate all images and text blocks, then extract the data needed for moderation.
|
|
|
415
348
|
|
|
416
349
|
**Images**: Use `findByKind('image')` to find image blocks, then extract URLs from fill properties:
|
|
417
350
|
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
const fillImageURI = engine.block.getString(
|
|
427
|
-
imageFill,
|
|
428
|
-
'fill/image/imageFileURI'
|
|
429
|
-
);
|
|
430
|
-
if (fillImageURI) {
|
|
431
|
-
return fillImageURI;
|
|
432
|
-
}
|
|
351
|
+
```javascript highlight-get-image-url
|
|
352
|
+
/**
|
|
353
|
+
* Extracts the image URL from a block's fill property
|
|
354
|
+
*/
|
|
355
|
+
function getImageUrl(engine, blockId) {
|
|
356
|
+
try {
|
|
357
|
+
const imageFill = engine.block.getFill(blockId);
|
|
433
358
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
359
|
+
const fillImageURI = engine.block.getString(
|
|
360
|
+
imageFill,
|
|
361
|
+
'fill/image/imageFileURI'
|
|
362
|
+
);
|
|
363
|
+
if (fillImageURI) {
|
|
364
|
+
return fillImageURI;
|
|
365
|
+
}
|
|
441
366
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
367
|
+
const sourceSet = engine.block.getSourceSet(
|
|
368
|
+
imageFill,
|
|
369
|
+
'fill/image/sourceSet'
|
|
370
|
+
);
|
|
371
|
+
if (sourceSet && sourceSet.length > 0) {
|
|
372
|
+
return sourceSet[0].uri;
|
|
445
373
|
}
|
|
374
|
+
|
|
375
|
+
return null;
|
|
376
|
+
} catch (error) {
|
|
377
|
+
return null;
|
|
446
378
|
}
|
|
379
|
+
}
|
|
447
380
|
```
|
|
448
381
|
|
|
449
382
|
Process all images by checking each URL against the moderation API:
|
|
450
383
|
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
})
|
|
481
|
-
);
|
|
384
|
+
```javascript highlight-check-all-images
|
|
385
|
+
/**
|
|
386
|
+
* Checks all images in the design for inappropriate content
|
|
387
|
+
*/
|
|
388
|
+
async function checkImageContent(engine) {
|
|
389
|
+
const imageBlockIds = engine.block.findByKind('image');
|
|
390
|
+
const imageBlocksData = imageBlockIds
|
|
391
|
+
.map((blockId) => ({
|
|
392
|
+
blockId,
|
|
393
|
+
url: getImageUrl(engine, blockId),
|
|
394
|
+
blockType: engine.block.getType(blockId),
|
|
395
|
+
blockName: engine.block.getName(blockId)
|
|
396
|
+
}))
|
|
397
|
+
.filter((data) => data.url !== null);
|
|
398
|
+
|
|
399
|
+
const imagesWithValidity = await Promise.all(
|
|
400
|
+
imageBlocksData.map(async (imageBlockData) => {
|
|
401
|
+
const categories = await checkImageContentAPI(imageBlockData.url);
|
|
402
|
+
|
|
403
|
+
return categories.map((checkResult) => ({
|
|
404
|
+
...checkResult,
|
|
405
|
+
blockId: imageBlockData.blockId,
|
|
406
|
+
blockType: imageBlockData.blockType,
|
|
407
|
+
blockName: imageBlockData.blockName,
|
|
408
|
+
url: imageBlockData.url,
|
|
409
|
+
id: `${imageBlockData.blockId}-${checkResult.name}`
|
|
410
|
+
}));
|
|
411
|
+
})
|
|
412
|
+
);
|
|
482
413
|
|
|
483
|
-
|
|
484
|
-
|
|
414
|
+
return imagesWithValidity.flat();
|
|
415
|
+
}
|
|
485
416
|
```
|
|
486
417
|
|
|
487
418
|
**Text**: Use `findByType('//ly.img.ubq/text')` to find text blocks, then extract content using `getString()`:
|
|
488
419
|
|
|
489
|
-
```
|
|
420
|
+
```javascript highlight-get-text-content
|
|
490
421
|
/**
|
|
491
422
|
* Extracts text content from a text block
|
|
492
423
|
*/
|
|
493
|
-
|
|
424
|
+
function getTextContent(engine, blockId) {
|
|
494
425
|
try {
|
|
495
426
|
return engine.block.getString(blockId, 'text/text');
|
|
496
427
|
} catch (error) {
|
|
@@ -501,138 +432,138 @@ private getTextContent(engine: CreativeEngine, blockId: number): string {
|
|
|
501
432
|
|
|
502
433
|
Process all text blocks by checking each text string against the moderation API:
|
|
503
434
|
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
})
|
|
534
|
-
);
|
|
435
|
+
```javascript highlight-check-all-text
|
|
436
|
+
/**
|
|
437
|
+
* Checks all text blocks in the design for inappropriate content
|
|
438
|
+
*/
|
|
439
|
+
async function checkTextContent(engine) {
|
|
440
|
+
const textBlockIds = engine.block.findByType('//ly.img.ubq/text');
|
|
441
|
+
const textBlocksData = textBlockIds
|
|
442
|
+
.map((blockId) => ({
|
|
443
|
+
blockId,
|
|
444
|
+
text: getTextContent(engine, blockId),
|
|
445
|
+
blockType: engine.block.getType(blockId),
|
|
446
|
+
blockName: engine.block.getName(blockId)
|
|
447
|
+
}))
|
|
448
|
+
.filter((data) => data.text.trim().length > 0);
|
|
449
|
+
|
|
450
|
+
const textsWithValidity = await Promise.all(
|
|
451
|
+
textBlocksData.map(async (textBlockData) => {
|
|
452
|
+
const categories = await checkTextContentAPI(textBlockData.text);
|
|
453
|
+
|
|
454
|
+
return categories.map((checkResult) => ({
|
|
455
|
+
...checkResult,
|
|
456
|
+
blockId: textBlockData.blockId,
|
|
457
|
+
blockType: textBlockData.blockType,
|
|
458
|
+
blockName: textBlockData.blockName,
|
|
459
|
+
text: textBlockData.text,
|
|
460
|
+
id: `${textBlockData.blockId}-${checkResult.name}`
|
|
461
|
+
}));
|
|
462
|
+
})
|
|
463
|
+
);
|
|
535
464
|
|
|
536
|
-
|
|
537
|
-
|
|
465
|
+
return textsWithValidity.flat();
|
|
466
|
+
}
|
|
538
467
|
```
|
|
539
468
|
|
|
540
469
|
Both processes use `Promise.all()` to handle multiple items concurrently.
|
|
541
470
|
|
|
542
471
|
## Integrating Moderation APIs
|
|
543
472
|
|
|
544
|
-
Integrate external AI services (Sightengine, AWS Rekognition, OpenAI Moderation API) to analyze content.
|
|
473
|
+
Integrate external AI services (Sightengine, AWS Rekognition, OpenAI Moderation API) to analyze content. In server environments, you can call moderation APIs directly or proxy through your backend for better security.
|
|
545
474
|
|
|
546
475
|
**Image Moderation** — This example shows a simulated API call that you'll replace with your actual moderation service. The function returns content categories with confidence scores:
|
|
547
476
|
|
|
548
|
-
```
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
477
|
+
```javascript highlight-image-moderation-api
|
|
478
|
+
/**
|
|
479
|
+
* Simulates an image content moderation API call
|
|
480
|
+
* In production, replace this with your actual moderation service
|
|
481
|
+
*/
|
|
482
|
+
async function checkImageContentAPI(url) {
|
|
483
|
+
if (imageCache.has(url)) {
|
|
484
|
+
return imageCache.get(url);
|
|
485
|
+
}
|
|
556
486
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
487
|
+
// Simulate API delay
|
|
488
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
489
|
+
|
|
490
|
+
const results = [
|
|
491
|
+
{
|
|
492
|
+
name: 'Weapons',
|
|
493
|
+
description: 'Handguns, rifles, machine guns, threatening knives',
|
|
494
|
+
state: percentageToState(Math.random() * 0.3)
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
name: 'Alcohol',
|
|
498
|
+
description: 'Wine, beer, cocktails, champagne',
|
|
499
|
+
state: percentageToState(Math.random() * 0.4)
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
name: 'Drugs',
|
|
503
|
+
description: 'Cannabis, syringes, glass pipes, bongs, pills',
|
|
504
|
+
state: percentageToState(Math.random() * 0.2)
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
name: 'Nudity',
|
|
508
|
+
description: 'Raw or partial nudity',
|
|
509
|
+
state: percentageToState(Math.random() * 0.3)
|
|
510
|
+
}
|
|
511
|
+
];
|
|
581
512
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
513
|
+
imageCache.set(url, results);
|
|
514
|
+
return results;
|
|
515
|
+
}
|
|
585
516
|
```
|
|
586
517
|
|
|
587
|
-
In production, replace the simulated logic with a real API call to
|
|
518
|
+
In production, replace the simulated logic with a real API call to services like Sightengine or AWS Rekognition. Store API keys securely using environment variables.
|
|
588
519
|
|
|
589
520
|
**Text Moderation** — Similar to image moderation, this simulates an API call that checks text content. Replace this with your actual text moderation service:
|
|
590
521
|
|
|
591
|
-
```
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
522
|
+
```javascript highlight-text-moderation-api
|
|
523
|
+
/**
|
|
524
|
+
* Simulates a text content moderation API call
|
|
525
|
+
* In production, replace this with your actual moderation service
|
|
526
|
+
*/
|
|
527
|
+
async function checkTextContentAPI(text) {
|
|
528
|
+
if (textCache.has(text)) {
|
|
529
|
+
return textCache.get(text);
|
|
530
|
+
}
|
|
599
531
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
532
|
+
// Simulate API delay
|
|
533
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
534
|
+
|
|
535
|
+
const results = [
|
|
536
|
+
{
|
|
537
|
+
name: 'Profanity',
|
|
538
|
+
description: 'Offensive or vulgar language',
|
|
539
|
+
state: percentageToState(Math.random() * 0.3)
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
name: 'Hate Speech',
|
|
543
|
+
description: 'Content promoting hatred or discrimination',
|
|
544
|
+
state: percentageToState(Math.random() * 0.2)
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
name: 'Threats',
|
|
548
|
+
description: 'Threatening or violent language',
|
|
549
|
+
state: percentageToState(Math.random() * 0.1)
|
|
550
|
+
}
|
|
551
|
+
];
|
|
619
552
|
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
553
|
+
textCache.set(text, results);
|
|
554
|
+
return results;
|
|
555
|
+
}
|
|
623
556
|
```
|
|
624
557
|
|
|
625
|
-
In production, replace the simulation with calls to services like OpenAI Moderation API or Perspective API
|
|
558
|
+
In production, replace the simulation with calls to services like OpenAI Moderation API or Perspective API.
|
|
626
559
|
|
|
627
560
|
**Processing Results**: Map confidence scores to severity levels (failed > 0.8, warning > 0.4, success ≤ 0.4):
|
|
628
561
|
|
|
629
|
-
```
|
|
562
|
+
```javascript highlight-threshold-mapping
|
|
630
563
|
/**
|
|
631
564
|
* Maps confidence scores to validation states
|
|
632
565
|
*/
|
|
633
|
-
|
|
634
|
-
percentage: number
|
|
635
|
-
): 'success' | 'warning' | 'failed' {
|
|
566
|
+
function percentageToState(percentage) {
|
|
636
567
|
if (percentage > 0.8) {
|
|
637
568
|
return 'failed';
|
|
638
569
|
} else if (percentage > 0.4) {
|
|
@@ -643,76 +574,153 @@ private percentageToState(
|
|
|
643
574
|
}
|
|
644
575
|
```
|
|
645
576
|
|
|
646
|
-
Implement caching to avoid redundant API calls for the same content.
|
|
577
|
+
Implement caching using Map or Redis to avoid redundant API calls for the same content.
|
|
647
578
|
|
|
648
579
|
## Displaying Validation Results
|
|
649
580
|
|
|
650
|
-
Group results by severity (failed, warning, success) and display them in the
|
|
651
|
-
|
|
652
|
-
```
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
console.log(`
|
|
663
|
-
|
|
664
|
-
console.log(`
|
|
665
|
-
|
|
581
|
+
Group results by severity (failed, warning, success) and display them in the console:
|
|
582
|
+
|
|
583
|
+
```javascript highlight-display-results
|
|
584
|
+
/**
|
|
585
|
+
* Displays validation results grouped by severity
|
|
586
|
+
*/
|
|
587
|
+
function displayResults(results) {
|
|
588
|
+
const failed = results.filter((r) => r.state === 'failed');
|
|
589
|
+
const warnings = results.filter((r) => r.state === 'warning');
|
|
590
|
+
const passed = results.filter((r) => r.state === 'success');
|
|
591
|
+
|
|
592
|
+
console.log('\n=== Content Moderation Results ===\n');
|
|
593
|
+
console.log(`Total checks: ${results.length}`);
|
|
594
|
+
console.log(` Violations: ${failed.length}`);
|
|
595
|
+
console.log(` Warnings: ${warnings.length}`);
|
|
596
|
+
console.log(` Passed: ${passed.length}\n`);
|
|
597
|
+
|
|
598
|
+
if (failed.length > 0) {
|
|
599
|
+
console.log('❌ VIOLATIONS:');
|
|
600
|
+
failed.forEach((result) => {
|
|
601
|
+
const content = result.url || result.text?.substring(0, 50) + '...';
|
|
602
|
+
console.log(
|
|
603
|
+
` - ${result.name}: Block ${result.blockId} (${result.blockType})`
|
|
604
|
+
);
|
|
605
|
+
console.log(` ${result.description}`);
|
|
606
|
+
console.log(` Content: ${content}\n`);
|
|
607
|
+
});
|
|
608
|
+
}
|
|
666
609
|
|
|
667
|
-
|
|
610
|
+
if (warnings.length > 0) {
|
|
611
|
+
console.log('⚠️ WARNINGS:');
|
|
612
|
+
warnings.forEach((result) => {
|
|
613
|
+
const content = result.url || result.text?.substring(0, 50) + '...';
|
|
614
|
+
console.log(
|
|
615
|
+
` - ${result.name}: Block ${result.blockId} (${result.blockType})`
|
|
616
|
+
);
|
|
617
|
+
console.log(` ${result.description}`);
|
|
618
|
+
console.log(` Content: ${content}\n`);
|
|
619
|
+
});
|
|
620
|
+
}
|
|
668
621
|
|
|
669
|
-
|
|
670
|
-
if (failed.length > 0) {
|
|
671
|
-
const blockToSelect = failed[0].blockId;
|
|
672
|
-
engine.block
|
|
673
|
-
.findAllSelected()
|
|
674
|
-
.forEach((id) => engine.block.setSelected(id, false));
|
|
675
|
-
engine.block.setSelected(blockToSelect, true);
|
|
622
|
+
return { failed, warnings, passed };
|
|
676
623
|
}
|
|
677
624
|
```
|
|
678
625
|
|
|
679
|
-
##
|
|
626
|
+
## Export Validation
|
|
680
627
|
|
|
681
|
-
|
|
628
|
+
Validate content before allowing export in server workflows:
|
|
682
629
|
|
|
683
|
-
|
|
630
|
+
```javascript highlight-export-validation
|
|
631
|
+
/**
|
|
632
|
+
* Validates content before allowing export
|
|
633
|
+
*/
|
|
634
|
+
async function validateForExport(engine) {
|
|
635
|
+
console.log('Validating design before export...');
|
|
684
636
|
|
|
685
|
-
```typescript
|
|
686
|
-
cesdk.ui.registerAction('ly.img.export', async (engine) => {
|
|
687
637
|
const imageResults = await checkImageContent(engine);
|
|
688
638
|
const textResults = await checkTextContent(engine);
|
|
689
|
-
const
|
|
690
|
-
|
|
691
|
-
);
|
|
639
|
+
const allResults = [...imageResults, ...textResults];
|
|
640
|
+
|
|
641
|
+
const { failed } = displayResults(allResults);
|
|
692
642
|
|
|
693
|
-
if (
|
|
694
|
-
|
|
695
|
-
|
|
643
|
+
if (failed.length > 0) {
|
|
644
|
+
console.error(
|
|
645
|
+
`\n❌ Export blocked: ${failed.length} policy violation(s) detected.\n`
|
|
646
|
+
);
|
|
647
|
+
return false;
|
|
696
648
|
}
|
|
697
649
|
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
}
|
|
650
|
+
console.log('\n✅ Content validation passed. Export allowed.\n');
|
|
651
|
+
return true;
|
|
652
|
+
}
|
|
701
653
|
```
|
|
702
654
|
|
|
703
|
-
|
|
655
|
+
This pattern ensures content is checked at the critical point before generating final outputs.
|
|
656
|
+
|
|
657
|
+
## Server Environment Setup
|
|
658
|
+
|
|
659
|
+
**Configuration**: Use environment variables to store API credentials and load scenes from templates:
|
|
660
|
+
|
|
661
|
+
```javascript highlight-setup
|
|
662
|
+
/**
|
|
663
|
+
* Main demonstration function
|
|
664
|
+
*/
|
|
665
|
+
async function main() {
|
|
666
|
+
console.log('🚀 Starting CE.SDK Content Moderation Demo...\n');
|
|
667
|
+
|
|
668
|
+
// Initialize the engine
|
|
669
|
+
const config = {
|
|
670
|
+
baseURL: process.env.IMGLY_LOCAL_ASSETS_URL,
|
|
671
|
+
license: process.env.CESDK_LICENSE || '',
|
|
672
|
+
logger: (level, ...args) => {
|
|
673
|
+
if (level === 'error' || level === 'warn') {
|
|
674
|
+
console.log(`[${level}]`, ...args);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
};
|
|
678
|
+
|
|
679
|
+
const engine = await CreativeEngine.init(config);
|
|
680
|
+
console.log('✓ Engine initialized\n');
|
|
681
|
+
|
|
682
|
+
// Load a sample scene/template
|
|
683
|
+
// In production, use your actual scene URL or template
|
|
684
|
+
const templateURL =
|
|
685
|
+
'https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/templates/cesdk_postcard_1.scene';
|
|
686
|
+
await engine.scene.loadFromURL(templateURL);
|
|
687
|
+
const page = engine.block.findByType('page')[0];
|
|
688
|
+
console.log('✓ Scene loaded\n');
|
|
689
|
+
```
|
|
704
690
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
-
|
|
691
|
+
**Headless Execution**: The server example loads a template scene that already contains content to moderate:
|
|
692
|
+
|
|
693
|
+
```javascript highlight-create-sample-content
|
|
694
|
+
// The loaded scene already contains images and text
|
|
695
|
+
// In production, you would modify the scene content as needed
|
|
696
|
+
console.log('✓ Scene contains sample content for moderation\n');
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
**Command-Line Interface**: Run validation checks from the command line:
|
|
700
|
+
|
|
701
|
+
```javascript highlight-run-validation
|
|
702
|
+
// Validate content before export
|
|
703
|
+
const canExport = await validateForExport(engine);
|
|
704
|
+
|
|
705
|
+
if (canExport) {
|
|
706
|
+
// Export the design
|
|
707
|
+
const blob = await engine.block.export(page, 'image/png');
|
|
708
|
+
const buffer = Buffer.from(await blob.arrayBuffer());
|
|
709
|
+
|
|
710
|
+
// Save to file (optional)
|
|
711
|
+
const fs = await import('fs/promises');
|
|
712
|
+
await fs.writeFile('output.png', buffer);
|
|
713
|
+
console.log('✓ Design exported to output.png\n');
|
|
714
|
+
}
|
|
715
|
+
```
|
|
708
716
|
|
|
709
717
|
## Best Practices
|
|
710
718
|
|
|
711
|
-
**Security**:
|
|
719
|
+
**Security**: Store API keys in environment variables, never in code. Use `.env` files for local development and secret managers in production.
|
|
712
720
|
|
|
713
|
-
**Performance**: Cache results
|
|
721
|
+
**Performance**: Cache results using Redis or similar for production workloads. Process items in parallel with `Promise.all()`.
|
|
714
722
|
|
|
715
|
-
**
|
|
723
|
+
**Error Handling**: Implement proper error handling with retries for API calls. Log all checks for compliance and auditing.
|
|
716
724
|
|
|
717
725
|
**Timing**: Validate at export time for the best balance between policy enforcement and creative freedom.
|
|
718
726
|
|
|
@@ -740,22 +748,23 @@ cesdk.ui.registerAction('ly.img.export', async (engine) => {
|
|
|
740
748
|
- `engine.block.getString(fill, 'fill/image/imageFileURI')` — Get image URL
|
|
741
749
|
- `engine.block.getSourceSet(fill, 'fill/image/sourceSet')` — Get image source set
|
|
742
750
|
|
|
743
|
-
**
|
|
751
|
+
**Export**:
|
|
744
752
|
|
|
745
|
-
- `engine.block.
|
|
746
|
-
- `engine.block.findAllSelected()` — Get currently selected blocks
|
|
753
|
+
- `engine.block.export(blockId, mimeType)` — Export block as blob
|
|
747
754
|
|
|
748
755
|
## Next Steps
|
|
749
756
|
|
|
750
|
-
Now that you understand content moderation, explore related
|
|
757
|
+
Now that you understand content moderation in Node.js, explore related features:
|
|
751
758
|
|
|
752
759
|
- [Rules Overview](./rules/overview.md) — Learn about CE.SDK's comprehensive validation system
|
|
753
760
|
|
|
761
|
+
|
|
762
|
+
|
|
754
763
|
---
|
|
755
764
|
|
|
756
765
|
## More Resources
|
|
757
766
|
|
|
758
|
-
- **[
|
|
767
|
+
- **[Node.js Documentation Index](https://img.ly/docs/cesdk/node.md)** - Browse all Node.js documentation
|
|
759
768
|
- **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
|
|
760
|
-
- **[Web Documentation](./
|
|
761
|
-
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|
|
769
|
+
- **[Web Documentation](./node.md)** - Interactive documentation with examples
|
|
770
|
+
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|