loopwind 0.23.0 → 0.24.1
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 +13 -117
- package/dist/cli.js +16 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +6 -10
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/agent.d.ts +8 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +101 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +17 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/render.d.ts.map +1 -1
- package/dist/commands/render.js +17 -19
- package/dist/commands/render.js.map +1 -1
- package/dist/default-templates/AGENTS.md +10 -24
- package/dist/lib/config.d.ts +2 -3
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +4 -9
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +1 -3
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +2 -4
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/installer.d.ts +2 -0
- package/dist/lib/installer.d.ts.map +1 -1
- package/dist/lib/installer.js +6 -7
- package/dist/lib/installer.js.map +1 -1
- package/dist/lib/renderer.d.ts.map +1 -1
- package/dist/lib/renderer.js +4 -1
- package/dist/lib/renderer.js.map +1 -1
- package/dist/lib/utils.d.ts +13 -29
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +45 -155
- package/dist/lib/utils.js.map +1 -1
- package/dist/types/config.d.ts +0 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/package.json +1 -15
- package/REGISTRY_SETUP.md +0 -363
- package/dist/default-templates/image/template.d.ts +0 -20
- package/dist/default-templates/image/template.d.ts.map +0 -1
- package/dist/default-templates/image/template.js +0 -18
- package/dist/default-templates/image/template.js.map +0 -1
- package/dist/default-templates/image/template.tsx +0 -20
- package/dist/default-templates/kitchen-sink/template.tsx +0 -64
- package/dist/default-templates/page/template.tsx +0 -37
- package/dist/default-templates/video/template.d.ts +0 -26
- package/dist/default-templates/video/template.d.ts.map +0 -1
- package/dist/default-templates/video/template.js +0 -33
- package/dist/default-templates/video/template.js.map +0 -1
- package/dist/default-templates/video/template.tsx +0 -37
- package/dist/default-templates/website/pages/home.tsx +0 -17
- package/dist/default-templates/website/parts/footer.tsx +0 -17
- package/dist/default-templates/website/parts/header.tsx +0 -17
- package/dist/default-templates/website/template.tsx +0 -17
- package/dist/default-templates/website-template/pages/home.tsx +0 -13
- package/dist/default-templates/website-template/parts/footer.tsx +0 -15
- package/dist/default-templates/website-template/parts/header.tsx +0 -15
- package/dist/default-templates/website-template/template.tsx +0 -32
- package/dist/lib/encode-worker.d.ts +0 -2
- package/dist/lib/encode-worker.d.ts.map +0 -1
- package/dist/lib/encode-worker.js +0 -29
- package/dist/lib/encode-worker.js.map +0 -1
- package/dist/lib/mjpeg-muxer.d.ts +0 -46
- package/dist/lib/mjpeg-muxer.d.ts.map +0 -1
- package/dist/lib/mjpeg-muxer.js +0 -513
- package/dist/lib/mjpeg-muxer.js.map +0 -1
- package/dist/lib/render-core.d.ts +0 -63
- package/dist/lib/render-core.d.ts.map +0 -1
- package/dist/lib/render-core.js +0 -65
- package/dist/lib/render-core.js.map +0 -1
- package/dist/lib/tailwind-browser.d.ts +0 -27
- package/dist/lib/tailwind-browser.d.ts.map +0 -1
- package/dist/lib/tailwind-browser.js +0 -853
- package/dist/lib/tailwind-browser.js.map +0 -1
- package/dist/lib/video-player.d.ts +0 -25
- package/dist/lib/video-player.d.ts.map +0 -1
- package/dist/lib/video-player.js +0 -392
- package/dist/lib/video-player.js.map +0 -1
- package/dist/sdk/compiler.d.ts +0 -94
- package/dist/sdk/compiler.d.ts.map +0 -1
- package/dist/sdk/compiler.js +0 -122
- package/dist/sdk/compiler.js.map +0 -1
- package/dist/sdk/edge/index.d.ts +0 -91
- package/dist/sdk/edge/index.d.ts.map +0 -1
- package/dist/sdk/edge/index.js +0 -187
- package/dist/sdk/edge/index.js.map +0 -1
- package/dist/sdk/index.d.ts +0 -62
- package/dist/sdk/index.d.ts.map +0 -1
- package/dist/sdk/index.js +0 -141
- package/dist/sdk/index.js.map +0 -1
- package/dist/sdk/preview.d.ts +0 -65
- package/dist/sdk/preview.d.ts.map +0 -1
- package/dist/sdk/preview.js +0 -262
- package/dist/sdk/preview.js.map +0 -1
- package/dist/sdk/template.d.ts +0 -162
- package/dist/sdk/template.d.ts.map +0 -1
- package/dist/sdk/template.js +0 -231
- package/dist/sdk/template.js.map +0 -1
- package/dist/sdk/workers/index.d.ts +0 -135
- package/dist/sdk/workers/index.d.ts.map +0 -1
- package/dist/sdk/workers/index.js +0 -271
- package/dist/sdk/workers/index.js.map +0 -1
- package/dist/sdk/workers/tailwind-config.d.ts +0 -48
- package/dist/sdk/workers/tailwind-config.d.ts.map +0 -1
- package/dist/sdk/workers/tailwind-config.js +0 -187
- package/dist/sdk/workers/tailwind-config.js.map +0 -1
- package/dist/sdk/workers/tailwind.d.ts +0 -9
- package/dist/sdk/workers/tailwind.d.ts.map +0 -1
- package/dist/sdk/workers/tailwind.js +0 -8
- package/dist/sdk/workers/tailwind.js.map +0 -1
- package/examples/code-editor-templates.ts +0 -173
- package/examples/nextjs-api/README.md +0 -180
- package/examples/nextjs-api/package.json +0 -21
- package/examples/nextjs-api/pages/api/intro-video.ts +0 -53
- package/examples/nextjs-api/pages/api/og-image.ts +0 -50
- package/examples/nextjs-template-import.ts +0 -58
- package/examples/sdk-video-preview.tsx +0 -120
- package/examples/template-compiler-workflow.ts +0 -251
- package/examples/visual-builder-templates.ts +0 -336
- package/render-examples-600x400.mjs +0 -161
- package/render-spring-variants-fixed.mjs +0 -60
- package/render-staggered-text.mjs +0 -56
- package/test-cloudflare-worker/README.md +0 -64
- package/test-cloudflare-worker/dist/README.md +0 -1
- package/test-cloudflare-worker/dist/index.js +0 -23743
- package/test-cloudflare-worker/dist/index.js.map +0 -8
- package/test-cloudflare-worker/package-lock.json +0 -1773
- package/test-cloudflare-worker/package.json +0 -25
- package/test-cloudflare-worker/test-sdk.mjs +0 -75
- package/test-cloudflare-worker/wrangler.toml +0 -14
- package/test-font-files.mjs +0 -72
- package/test-jsx-support.mjs +0 -146
- package/test-sdk-config.mjs +0 -454
- package/test-sdk-source-config.mjs +0 -427
- package/test-sdk-user-templates.mjs +0 -469
- package/test-static-debug.tsx +0 -19
- package/test-templates/TESTS.md +0 -63
- package/test-templates/config-test.mjs +0 -17
- package/test-templates/demo-intro-props.json +0 -4
- package/test-templates/run-tests.sh +0 -44
- package/test-templates/test-sdk.mjs +0 -139
- package/test-video-720p.mjs +0 -96
- package/test-video-breakdown.mjs +0 -98
- package/test-video-perf-1080.mjs +0 -67
- package/test-video-perf.mjs +0 -56
- package/test-video-props.json +0 -3
- package/test-worker-1080p.mjs +0 -103
- package/test-worker-viability.mjs +0 -140
- package/website/.astro/content.db +0 -0
- package/website/.astro/integrations/_inox-tools_astro-when/types.d.ts +0 -1
- package/website/.astro/integrations/astro_db/db.d.ts +0 -15
- package/website/.astro/settings.json +0 -5
- package/website/.astro/types.d.ts +0 -2
- package/website/DEPLOYMENT.md +0 -143
- package/website/OG_IMAGES.md +0 -142
- package/website/README.md +0 -158
- package/website/astro.config.mjs +0 -41
- package/website/dist/.gitkeep +0 -5
- package/website/dist/_astro/PlaygroundEditor.DzFavsm8.js +0 -26
- package/website/dist/_astro/VideoPreviewClient.BrajhYmh.js +0 -1
- package/website/dist/_astro/agents.CZXv4DCM.css +0 -1
- package/website/dist/_astro/client.BHSq4mdQ.js +0 -33
- package/website/dist/_astro/index.CTbGshLK.js +0 -9
- package/website/dist/_astro/jsx-runtime.BjG_zV1W.js +0 -9
- package/website/dist/_routes.json +0 -31
- package/website/dist/_worker.js/_@astrojs-ssr-adapter.mjs +0 -1033
- package/website/dist/_worker.js/_astro-internal_middleware.mjs +0 -40
- package/website/dist/_worker.js/chunks/Logo_Cud5QvBJ.mjs +0 -22
- package/website/dist/_worker.js/chunks/_@astro-renderers_-YVK7NHa.mjs +0 -15015
- package/website/dist/_worker.js/chunks/abap_BTmsHiP5.mjs +0 -1
- package/website/dist/_worker.js/chunks/actionscript-3_DmBelb1E.mjs +0 -1
- package/website/dist/_worker.js/chunks/ada_8-E0ahCN.mjs +0 -1
- package/website/dist/_worker.js/chunks/andromeeda_XI-CXx50.mjs +0 -1
- package/website/dist/_worker.js/chunks/angular-html_DKGh3gGH.mjs +0 -1
- package/website/dist/_worker.js/chunks/angular-ts_-qZGsJoA.mjs +0 -1
- package/website/dist/_worker.js/chunks/apache_ijTUt0Ee.mjs +0 -1
- package/website/dist/_worker.js/chunks/apex_agu1c6Sh.mjs +0 -1
- package/website/dist/_worker.js/chunks/apl_Bj2f7Art.mjs +0 -1
- package/website/dist/_worker.js/chunks/applescript_B_vXrOh3.mjs +0 -1
- package/website/dist/_worker.js/chunks/ara_DCEQ2rnh.mjs +0 -1
- package/website/dist/_worker.js/chunks/asciidoc_CGN_EkYS.mjs +0 -1
- package/website/dist/_worker.js/chunks/asm_BBWZgnDp.mjs +0 -1
- package/website/dist/_worker.js/chunks/astro/assets-service_j52rQLzU.mjs +0 -721
- package/website/dist/_worker.js/chunks/astro/server_CsUrSZgd.mjs +0 -2512
- package/website/dist/_worker.js/chunks/astro-designed-error-pages_1ELXm5Tt.mjs +0 -542
- package/website/dist/_worker.js/chunks/astro_Dr_hht3h.mjs +0 -1
- package/website/dist/_worker.js/chunks/aurora-x_9GHG8nSq.mjs +0 -1
- package/website/dist/_worker.js/chunks/awk_DHRvhXot.mjs +0 -1
- package/website/dist/_worker.js/chunks/ayu-dark_CcvqmEHE.mjs +0 -1
- package/website/dist/_worker.js/chunks/ballerina_C7SdeSZb.mjs +0 -1
- package/website/dist/_worker.js/chunks/bat_Dv4A3u45.mjs +0 -1
- package/website/dist/_worker.js/chunks/beancount_BfPf9Luv.mjs +0 -1
- package/website/dist/_worker.js/chunks/berry_B8rfM3lL.mjs +0 -1
- package/website/dist/_worker.js/chunks/bibtex_TcjYgtJM.mjs +0 -1
- package/website/dist/_worker.js/chunks/bicep_CrlFWCdN.mjs +0 -1
- package/website/dist/_worker.js/chunks/blade_lanKVYID.mjs +0 -1
- package/website/dist/_worker.js/chunks/bsl_BhppzXMB.mjs +0 -1
- package/website/dist/_worker.js/chunks/c_6FBALJTK.mjs +0 -1
- package/website/dist/_worker.js/chunks/cadence_2txU9LVE.mjs +0 -1
- package/website/dist/_worker.js/chunks/cairo_BkrFAIlP.mjs +0 -1
- package/website/dist/_worker.js/chunks/catppuccin-frappe_CkEqIYhU.mjs +0 -1
- package/website/dist/_worker.js/chunks/catppuccin-latte_DG4Gx_-v.mjs +0 -1
- package/website/dist/_worker.js/chunks/catppuccin-macchiato_Cwi3vCXf.mjs +0 -1
- package/website/dist/_worker.js/chunks/catppuccin-mocha_L9_OPlFX.mjs +0 -1
- package/website/dist/_worker.js/chunks/clarity_BEAe4Ulu.mjs +0 -1
- package/website/dist/_worker.js/chunks/clojure_VnUX6p2g.mjs +0 -1
- package/website/dist/_worker.js/chunks/cmake_0-SGkZEj.mjs +0 -1
- package/website/dist/_worker.js/chunks/cobol_92M_KGaE.mjs +0 -1
- package/website/dist/_worker.js/chunks/codeowners_CzMwskBv.mjs +0 -1
- package/website/dist/_worker.js/chunks/codeql_DWJZNHv1.mjs +0 -1
- package/website/dist/_worker.js/chunks/coffee_CQjKU2fh.mjs +0 -1
- package/website/dist/_worker.js/chunks/common-lisp_BBLWDpS5.mjs +0 -1
- package/website/dist/_worker.js/chunks/coq_hedRFV3D.mjs +0 -1
- package/website/dist/_worker.js/chunks/cpp_DlS1i6Zs.mjs +0 -1
- package/website/dist/_worker.js/chunks/crystal_D6n65fKV.mjs +0 -1
- package/website/dist/_worker.js/chunks/csharp_C6FCVFzc.mjs +0 -1
- package/website/dist/_worker.js/chunks/css_C5uJEgmJ.mjs +0 -1
- package/website/dist/_worker.js/chunks/csv_CtMYuuJl.mjs +0 -1
- package/website/dist/_worker.js/chunks/cue_BsPexqx6.mjs +0 -1
- package/website/dist/_worker.js/chunks/cypher_apzf6OBi.mjs +0 -1
- package/website/dist/_worker.js/chunks/d_DcvIRcgm.mjs +0 -1
- package/website/dist/_worker.js/chunks/dark-plus_C01ONtzj.mjs +0 -1
- package/website/dist/_worker.js/chunks/dart_WkzM5WrV.mjs +0 -1
- package/website/dist/_worker.js/chunks/dax_DjXAO5V4.mjs +0 -1
- package/website/dist/_worker.js/chunks/desktop_C92LCxdc.mjs +0 -1
- package/website/dist/_worker.js/chunks/diff_CVwM_9XJ.mjs +0 -1
- package/website/dist/_worker.js/chunks/docker_DPzgJf6Z.mjs +0 -1
- package/website/dist/_worker.js/chunks/dotenv_D_vgANvA.mjs +0 -1
- package/website/dist/_worker.js/chunks/dracula-soft_CLnUBwFm.mjs +0 -1
- package/website/dist/_worker.js/chunks/dracula_lBVpb6Lb.mjs +0 -1
- package/website/dist/_worker.js/chunks/dream-maker_DTLbzd_J.mjs +0 -1
- package/website/dist/_worker.js/chunks/edge_i54JYm3_.mjs +0 -1
- package/website/dist/_worker.js/chunks/elixir_BJCIjTu4.mjs +0 -1
- package/website/dist/_worker.js/chunks/elm_BbXD39-_.mjs +0 -1
- package/website/dist/_worker.js/chunks/emacs-lisp_pxa5cXaN.mjs +0 -1
- package/website/dist/_worker.js/chunks/erb_Ccjijeee.mjs +0 -1
- package/website/dist/_worker.js/chunks/erlang_B2VM_hi7.mjs +0 -1
- package/website/dist/_worker.js/chunks/everforest-dark_BxvIPBim.mjs +0 -1
- package/website/dist/_worker.js/chunks/everforest-light_B7VoyaJM.mjs +0 -1
- package/website/dist/_worker.js/chunks/fennel_D-uo7X6c.mjs +0 -1
- package/website/dist/_worker.js/chunks/fish_BjePoK3m.mjs +0 -1
- package/website/dist/_worker.js/chunks/fluent_C8fgkzLX.mjs +0 -1
- package/website/dist/_worker.js/chunks/fortran-fixed-form_D1pu5zrc.mjs +0 -1
- package/website/dist/_worker.js/chunks/fortran-free-form_CSGOhJD6.mjs +0 -1
- package/website/dist/_worker.js/chunks/fsharp_B0xy-A4Y.mjs +0 -1
- package/website/dist/_worker.js/chunks/gdresource_CWppjlHq.mjs +0 -1
- package/website/dist/_worker.js/chunks/gdscript_eQCHchcS.mjs +0 -1
- package/website/dist/_worker.js/chunks/gdshader_C4kxepX7.mjs +0 -1
- package/website/dist/_worker.js/chunks/genie_ACtQLcDW.mjs +0 -1
- package/website/dist/_worker.js/chunks/gherkin_BFp2uKUd.mjs +0 -1
- package/website/dist/_worker.js/chunks/git-commit_CLg9ZwMV.mjs +0 -1
- package/website/dist/_worker.js/chunks/git-rebase_DG8A80Nt.mjs +0 -1
- package/website/dist/_worker.js/chunks/github-dark-default_BI0EP2Kv.mjs +0 -1
- package/website/dist/_worker.js/chunks/github-dark-dimmed_a_NIC0Xb.mjs +0 -1
- package/website/dist/_worker.js/chunks/github-dark-high-contrast_jZGqT7hk.mjs +0 -1
- package/website/dist/_worker.js/chunks/github-dark_CHCDNd2O.mjs +0 -1
- package/website/dist/_worker.js/chunks/github-light-default_DRbOW5RG.mjs +0 -1
- package/website/dist/_worker.js/chunks/github-light-high-contrast_tn_kWutM.mjs +0 -1
- package/website/dist/_worker.js/chunks/github-light_D9brYzot.mjs +0 -1
- package/website/dist/_worker.js/chunks/gleam_Dmhu1oxW.mjs +0 -1
- package/website/dist/_worker.js/chunks/glimmer-js_BfZbXy8A.mjs +0 -1
- package/website/dist/_worker.js/chunks/glimmer-ts_B9QVICrD.mjs +0 -1
- package/website/dist/_worker.js/chunks/glsl_DD2PPwOs.mjs +0 -1
- package/website/dist/_worker.js/chunks/gnuplot_D2OYChUX.mjs +0 -1
- package/website/dist/_worker.js/chunks/go_DYGFTe3h.mjs +0 -1
- package/website/dist/_worker.js/chunks/graphql_B7XsT3nH.mjs +0 -1
- package/website/dist/_worker.js/chunks/groovy_BO12Uwkl.mjs +0 -1
- package/website/dist/_worker.js/chunks/hack_CB2_ztCP.mjs +0 -1
- package/website/dist/_worker.js/chunks/haml_CyfDcDD3.mjs +0 -1
- package/website/dist/_worker.js/chunks/handlebars_CfpxpWm2.mjs +0 -1
- package/website/dist/_worker.js/chunks/haskell_jUeC5uN5.mjs +0 -1
- package/website/dist/_worker.js/chunks/haxe_B6GxP1WB.mjs +0 -1
- package/website/dist/_worker.js/chunks/hcl_DwoHV2oh.mjs +0 -1
- package/website/dist/_worker.js/chunks/hjson_DV7cJRk4.mjs +0 -1
- package/website/dist/_worker.js/chunks/hlsl_BlFCscPI.mjs +0 -1
- package/website/dist/_worker.js/chunks/houston_COBFG1Mx.mjs +0 -1
- package/website/dist/_worker.js/chunks/html-derivative_C9pJ337h.mjs +0 -1
- package/website/dist/_worker.js/chunks/html_D1OkrZS5.mjs +0 -1
- package/website/dist/_worker.js/chunks/http_DIGXRqvJ.mjs +0 -1
- package/website/dist/_worker.js/chunks/hxml_DEwh9i-c.mjs +0 -1
- package/website/dist/_worker.js/chunks/hy_DDoIgW1K.mjs +0 -1
- package/website/dist/_worker.js/chunks/imba_B00zbHo4.mjs +0 -1
- package/website/dist/_worker.js/chunks/index_BDWR1Q-q.mjs +0 -1861
- package/website/dist/_worker.js/chunks/ini_D7XQA_p8.mjs +0 -1
- package/website/dist/_worker.js/chunks/java_B9wdFd8K.mjs +0 -1
- package/website/dist/_worker.js/chunks/javascript_CLsPGOON.mjs +0 -1
- package/website/dist/_worker.js/chunks/jinja_jarBCAN1.mjs +0 -1
- package/website/dist/_worker.js/chunks/jison_oGg3J708.mjs +0 -1
- package/website/dist/_worker.js/chunks/json5_DlZ1Kyaa.mjs +0 -1
- package/website/dist/_worker.js/chunks/json_DaYk_FMp.mjs +0 -1
- package/website/dist/_worker.js/chunks/jsonc_DlwgfSDs.mjs +0 -1
- package/website/dist/_worker.js/chunks/jsonl_BbCCVaZF.mjs +0 -1
- package/website/dist/_worker.js/chunks/jsonnet_Dt-G75xe.mjs +0 -1
- package/website/dist/_worker.js/chunks/jssm_BtKFTj2A.mjs +0 -1
- package/website/dist/_worker.js/chunks/jsx_DDx_xAZ8.mjs +0 -1
- package/website/dist/_worker.js/chunks/julia_CK0lv68l.mjs +0 -1
- package/website/dist/_worker.js/chunks/kanagawa-dragon_BldAK3Oo.mjs +0 -1
- package/website/dist/_worker.js/chunks/kanagawa-lotus_DVM8FX9_.mjs +0 -1
- package/website/dist/_worker.js/chunks/kanagawa-wave_Dpih0AKP.mjs +0 -1
- package/website/dist/_worker.js/chunks/kotlin_kWneB9V_.mjs +0 -1
- package/website/dist/_worker.js/chunks/kusto_BKVATd95.mjs +0 -1
- package/website/dist/_worker.js/chunks/laserwave_BqatxsVl.mjs +0 -1
- package/website/dist/_worker.js/chunks/latex_LVDcGBbc.mjs +0 -1
- package/website/dist/_worker.js/chunks/lean_W7qo-5M2.mjs +0 -1
- package/website/dist/_worker.js/chunks/less_DFNwJnBH.mjs +0 -1
- package/website/dist/_worker.js/chunks/light-plus_Dp0AoWsO.mjs +0 -1
- package/website/dist/_worker.js/chunks/liquid_D24qs0pc.mjs +0 -1
- package/website/dist/_worker.js/chunks/log_IPWMXriF.mjs +0 -1
- package/website/dist/_worker.js/chunks/logo_C6KaatrQ.mjs +0 -1
- package/website/dist/_worker.js/chunks/lua_CwnEf-T7.mjs +0 -1
- package/website/dist/_worker.js/chunks/luau_Br3-CXjS.mjs +0 -1
- package/website/dist/_worker.js/chunks/make_UBNG-kOo.mjs +0 -1
- package/website/dist/_worker.js/chunks/markdown_C7mhJFCm.mjs +0 -1
- package/website/dist/_worker.js/chunks/marko_4tchUvI7.mjs +0 -1
- package/website/dist/_worker.js/chunks/material-theme-darker_SKtaNEPn.mjs +0 -1
- package/website/dist/_worker.js/chunks/material-theme-lighter_zOX_DZCH.mjs +0 -1
- package/website/dist/_worker.js/chunks/material-theme-ocean_BN9WbhdC.mjs +0 -1
- package/website/dist/_worker.js/chunks/material-theme-palenight_DT_covjH.mjs +0 -1
- package/website/dist/_worker.js/chunks/material-theme_6RpeM3kc.mjs +0 -1
- package/website/dist/_worker.js/chunks/matlab_DCOXsPKR.mjs +0 -1
- package/website/dist/_worker.js/chunks/mdc_B9gb2UFP.mjs +0 -1
- package/website/dist/_worker.js/chunks/mdx_DGU7Nu9u.mjs +0 -1
- package/website/dist/_worker.js/chunks/mermaid_B69URzsZ.mjs +0 -1
- package/website/dist/_worker.js/chunks/min-dark_BgxifOMI.mjs +0 -1
- package/website/dist/_worker.js/chunks/min-light_BrPjXxUp.mjs +0 -1
- package/website/dist/_worker.js/chunks/mipsasm_9U-4_t7k.mjs +0 -1
- package/website/dist/_worker.js/chunks/mojo_B0wt7ug3.mjs +0 -1
- package/website/dist/_worker.js/chunks/monokai_B6Pxpoyi.mjs +0 -1
- package/website/dist/_worker.js/chunks/move_1eid4CyR.mjs +0 -1
- package/website/dist/_worker.js/chunks/narrat_Ds6-p5JZ.mjs +0 -1
- package/website/dist/_worker.js/chunks/nextflow_v2N1Qlqa.mjs +0 -1
- package/website/dist/_worker.js/chunks/nginx_Bp9Ab2NH.mjs +0 -1
- package/website/dist/_worker.js/chunks/night-owl_CdwOw_sc.mjs +0 -1
- package/website/dist/_worker.js/chunks/nim_BXGDUe53.mjs +0 -1
- package/website/dist/_worker.js/chunks/nix_CUig1nJH.mjs +0 -1
- package/website/dist/_worker.js/chunks/noop-middleware_B8fH5jha.mjs +0 -10
- package/website/dist/_worker.js/chunks/nord_SPoG1iae.mjs +0 -1
- package/website/dist/_worker.js/chunks/nushell_DJw1Lca8.mjs +0 -1
- package/website/dist/_worker.js/chunks/objective-c_Bktzl_CO.mjs +0 -1
- package/website/dist/_worker.js/chunks/objective-cpp_CP4DWdDp.mjs +0 -1
- package/website/dist/_worker.js/chunks/ocaml_CeEAs7bZ.mjs +0 -1
- package/website/dist/_worker.js/chunks/one-dark-pro_-hIwCNMi.mjs +0 -1
- package/website/dist/_worker.js/chunks/one-light_DSmYvJ05.mjs +0 -1
- package/website/dist/_worker.js/chunks/pascal_C-S_Ms_o.mjs +0 -1
- package/website/dist/_worker.js/chunks/perl_CKamvo15.mjs +0 -1
- package/website/dist/_worker.js/chunks/php_BlmcX_F3.mjs +0 -1
- package/website/dist/_worker.js/chunks/plastic_Ryt8tVoA.mjs +0 -1
- package/website/dist/_worker.js/chunks/plsql_Cb3v7cBj.mjs +0 -1
- package/website/dist/_worker.js/chunks/po_DZbdNRlo.mjs +0 -1
- package/website/dist/_worker.js/chunks/poimandres_bYmE3_5d.mjs +0 -1
- package/website/dist/_worker.js/chunks/polar_pJkMGwoW.mjs +0 -1
- package/website/dist/_worker.js/chunks/postcss_BAXSOKgk.mjs +0 -1
- package/website/dist/_worker.js/chunks/powerquery_oITMGN4x.mjs +0 -1
- package/website/dist/_worker.js/chunks/powershell_6306-xIF.mjs +0 -1
- package/website/dist/_worker.js/chunks/prisma_DSDxnZGz.mjs +0 -1
- package/website/dist/_worker.js/chunks/prolog_CxG7tjZR.mjs +0 -1
- package/website/dist/_worker.js/chunks/proto_CS9ByXm1.mjs +0 -1
- package/website/dist/_worker.js/chunks/pug_BMtLJo6U.mjs +0 -1
- package/website/dist/_worker.js/chunks/puppet_BfeeSzee.mjs +0 -1
- package/website/dist/_worker.js/chunks/purescript_BFfueNaH.mjs +0 -1
- package/website/dist/_worker.js/chunks/python_Cc4Faapv.mjs +0 -1
- package/website/dist/_worker.js/chunks/qml_C1CTJTK8.mjs +0 -1
- package/website/dist/_worker.js/chunks/qmldir_nG1KaqKR.mjs +0 -1
- package/website/dist/_worker.js/chunks/qss_Cncxk263.mjs +0 -1
- package/website/dist/_worker.js/chunks/r_ChR54Ihi.mjs +0 -1
- package/website/dist/_worker.js/chunks/racket_BDrhptDs.mjs +0 -1
- package/website/dist/_worker.js/chunks/raku_07OUHa0P.mjs +0 -1
- package/website/dist/_worker.js/chunks/razor_DIP3INLa.mjs +0 -1
- package/website/dist/_worker.js/chunks/red_DOPXfj-6.mjs +0 -1
- package/website/dist/_worker.js/chunks/reg_B64SwEDj.mjs +0 -1
- package/website/dist/_worker.js/chunks/regexp_ButFGoB5.mjs +0 -1
- package/website/dist/_worker.js/chunks/rel_BWJAWqZD.mjs +0 -1
- package/website/dist/_worker.js/chunks/riscv_79gXlbsF.mjs +0 -1
- package/website/dist/_worker.js/chunks/rose-pine-dawn_DHIjVGd3.mjs +0 -1
- package/website/dist/_worker.js/chunks/rose-pine-moon_t86aEbs0.mjs +0 -1
- package/website/dist/_worker.js/chunks/rose-pine_BHgrcDCs.mjs +0 -1
- package/website/dist/_worker.js/chunks/rst_D3F4Fcpj.mjs +0 -1
- package/website/dist/_worker.js/chunks/ruby_Cs7vM9iv.mjs +0 -1
- package/website/dist/_worker.js/chunks/rust_DpyRVatH.mjs +0 -1
- package/website/dist/_worker.js/chunks/sas_DW45xZXN.mjs +0 -1
- package/website/dist/_worker.js/chunks/sass_C6SiMwN_.mjs +0 -1
- package/website/dist/_worker.js/chunks/scala_DlZOjNZk.mjs +0 -1
- package/website/dist/_worker.js/chunks/scheme_D2ezSJXu.mjs +0 -1
- package/website/dist/_worker.js/chunks/scss_DG5Spjqu.mjs +0 -1
- package/website/dist/_worker.js/chunks/sdbl_ZCYaj4VN.mjs +0 -1
- package/website/dist/_worker.js/chunks/shaderlab_CAcRkg1_.mjs +0 -1
- package/website/dist/_worker.js/chunks/shellscript_BWwhkDVh.mjs +0 -1
- package/website/dist/_worker.js/chunks/shellsession_BfEA3juK.mjs +0 -1
- package/website/dist/_worker.js/chunks/slack-dark_CL3lSpCc.mjs +0 -1
- package/website/dist/_worker.js/chunks/slack-ochin_DdZKOQVh.mjs +0 -1
- package/website/dist/_worker.js/chunks/smalltalk_DgilzSui.mjs +0 -1
- package/website/dist/_worker.js/chunks/snazzy-light_eJU08Pz_.mjs +0 -1
- package/website/dist/_worker.js/chunks/solarized-dark_Dg_YQywx.mjs +0 -1
- package/website/dist/_worker.js/chunks/solarized-light_BnIsrA6p.mjs +0 -1
- package/website/dist/_worker.js/chunks/solidity_DkseH8pQ.mjs +0 -1
- package/website/dist/_worker.js/chunks/soy_DU7bOYoG.mjs +0 -1
- package/website/dist/_worker.js/chunks/sparql_BuI1DBDH.mjs +0 -1
- package/website/dist/_worker.js/chunks/splunk_B8Ha9Pkg.mjs +0 -1
- package/website/dist/_worker.js/chunks/sql_BniHwea5.mjs +0 -1
- package/website/dist/_worker.js/chunks/ssh-config_CkE1GuVe.mjs +0 -1
- package/website/dist/_worker.js/chunks/stata_Dtqpbd_l.mjs +0 -1
- package/website/dist/_worker.js/chunks/stylus_CXTtglzO.mjs +0 -1
- package/website/dist/_worker.js/chunks/svelte_BjWYcUCN.mjs +0 -1
- package/website/dist/_worker.js/chunks/swift_BzHql_rM.mjs +0 -1
- package/website/dist/_worker.js/chunks/synthwave-84_DLRNhxNA.mjs +0 -1
- package/website/dist/_worker.js/chunks/system-verilog_ChyInPph.mjs +0 -1
- package/website/dist/_worker.js/chunks/systemd_Bi9Qa2qD.mjs +0 -1
- package/website/dist/_worker.js/chunks/talonscript_B3sH_Y-V.mjs +0 -1
- package/website/dist/_worker.js/chunks/tasl_BJ5yipRs.mjs +0 -1
- package/website/dist/_worker.js/chunks/tcl_CoJQjNoP.mjs +0 -1
- package/website/dist/_worker.js/chunks/templ_CrU7Ffil.mjs +0 -1
- package/website/dist/_worker.js/chunks/terraform_DT9JSFpC.mjs +0 -1
- package/website/dist/_worker.js/chunks/tex_5PKu2yA0.mjs +0 -1
- package/website/dist/_worker.js/chunks/tokyo-night_Buo8OK7-.mjs +0 -1
- package/website/dist/_worker.js/chunks/toml_CPuXX3oc.mjs +0 -1
- package/website/dist/_worker.js/chunks/ts-tags_D0M_1VSH.mjs +0 -1
- package/website/dist/_worker.js/chunks/tsv_CuivVNot.mjs +0 -1
- package/website/dist/_worker.js/chunks/tsx_MkuGr8MY.mjs +0 -1
- package/website/dist/_worker.js/chunks/turtle_BqgEPK7f.mjs +0 -1
- package/website/dist/_worker.js/chunks/twig_r1G9rpYJ.mjs +0 -1
- package/website/dist/_worker.js/chunks/typescript_Au5buqzM.mjs +0 -1
- package/website/dist/_worker.js/chunks/typespec_47rhBK_z.mjs +0 -1
- package/website/dist/_worker.js/chunks/typst_BAtuQLh-.mjs +0 -1
- package/website/dist/_worker.js/chunks/v_BIvWImHg.mjs +0 -1
- package/website/dist/_worker.js/chunks/vala_DYEacj30.mjs +0 -1
- package/website/dist/_worker.js/chunks/vb_CikQuqGJ.mjs +0 -1
- package/website/dist/_worker.js/chunks/verilog_BQRENwI-.mjs +0 -1
- package/website/dist/_worker.js/chunks/vesper_DA0kvTmj.mjs +0 -1
- package/website/dist/_worker.js/chunks/vhdl_DHscJIyg.mjs +0 -1
- package/website/dist/_worker.js/chunks/viml_F2pvMwvG.mjs +0 -1
- package/website/dist/_worker.js/chunks/vitesse-black_D9tjNzd0.mjs +0 -1
- package/website/dist/_worker.js/chunks/vitesse-dark_Bnm5d0hd.mjs +0 -1
- package/website/dist/_worker.js/chunks/vitesse-light_CHwbyjNR.mjs +0 -1
- package/website/dist/_worker.js/chunks/vue-html_DyYtbbMK.mjs +0 -1
- package/website/dist/_worker.js/chunks/vue_DofN6juy.mjs +0 -1
- package/website/dist/_worker.js/chunks/vyper_CiR0m-OV.mjs +0 -1
- package/website/dist/_worker.js/chunks/wasm_CwIGgRGf.mjs +0 -1
- package/website/dist/_worker.js/chunks/wasm_jKWhg0J0.mjs +0 -1
- package/website/dist/_worker.js/chunks/wenyan_DKvVZKXW.mjs +0 -1
- package/website/dist/_worker.js/chunks/wgsl_BOWZY7yw.mjs +0 -1
- package/website/dist/_worker.js/chunks/wikitext_CXDhhHPy.mjs +0 -1
- package/website/dist/_worker.js/chunks/wolfram_ChkmGnW0.mjs +0 -1
- package/website/dist/_worker.js/chunks/xml_DXH3hHIu.mjs +0 -1
- package/website/dist/_worker.js/chunks/xsl_DuP2mFjg.mjs +0 -1
- package/website/dist/_worker.js/chunks/yaml_IGiEkTge.mjs +0 -1
- package/website/dist/_worker.js/chunks/zenscript_59iXGyNw.mjs +0 -1
- package/website/dist/_worker.js/chunks/zig_DKzb0zdT.mjs +0 -1
- package/website/dist/_worker.js/index.js +0 -61
- package/website/dist/_worker.js/manifest_Bk6136-u.mjs +0 -98
- package/website/dist/_worker.js/pages/_image.astro.mjs +0 -24
- package/website/dist/_worker.js/pages/agents.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/animation.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/api/playground/render.astro.mjs +0 -25562
- package/website/dist/_worker.js/pages/api/playground/templates.astro.mjs +0 -92
- package/website/dist/_worker.js/pages/api/raw-markdown/_---path_.astro.mjs +0 -44
- package/website/dist/_worker.js/pages/config.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/fonts.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/getting-started.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/helpers.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/images.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/index.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/llm.txt.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/playground/_example_.astro.mjs +0 -95
- package/website/dist/_worker.js/pages/playground.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/preview.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/sdk.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/sitemap.xml.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/styling.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/templates.astro.mjs +0 -1
- package/website/dist/_worker.js/pages/video.astro.mjs +0 -1
- package/website/dist/_worker.js/renderers.mjs +0 -2
- package/website/dist/agents/index.html +0 -54
- package/website/dist/animation/index.html +0 -1505
- package/website/dist/config/index.html +0 -186
- package/website/dist/fonts/index.html +0 -200
- package/website/dist/getting-started/index.html +0 -109
- package/website/dist/helpers/index.html +0 -350
- package/website/dist/images/index.html +0 -337
- package/website/dist/index.html +0 -141
- package/website/dist/llm.txt +0 -3626
- package/website/dist/playground/index.html +0 -6
- package/website/dist/preview/index.html +0 -113
- package/website/dist/robots.txt +0 -40
- package/website/dist/sdk/index.html +0 -1588
- package/website/dist/sitemap.xml +0 -76
- package/website/dist/styling/index.html +0 -368
- package/website/dist/templates/index.html +0 -76
- package/website/dist/video/index.html +0 -354
- package/website/package-lock.json +0 -8099
- package/website/package.json +0 -43
- package/website/public/.gitkeep +0 -5
- package/website/public/robots.txt +0 -40
- package/website/templates/og-image.tsx +0 -60
- package/website/wrangler.toml +0 -9
package/dist/sdk/template.js
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* Convert a template definition to template metadata
|
|
4
|
-
* @internal
|
|
5
|
-
*/
|
|
6
|
-
export function templateToMeta(template) {
|
|
7
|
-
return {
|
|
8
|
-
name: template.name,
|
|
9
|
-
description: template.name, // Use name as description for SDK templates
|
|
10
|
-
type: template.type || 'image',
|
|
11
|
-
size: template.size,
|
|
12
|
-
video: template.video,
|
|
13
|
-
props: {}, // SDK templates don't need props metadata
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Define a template from an imported template file
|
|
18
|
-
*
|
|
19
|
-
* The standard way to create templates in loopwind. Import a template file
|
|
20
|
-
* and pass it to defineTemplate() with optional config overrides.
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* import * as ogImage from './_loopwind/templates/og-image/template';
|
|
25
|
-
*
|
|
26
|
-
* const template = defineTemplate(ogImage, {
|
|
27
|
-
* config: {
|
|
28
|
-
* colors: { primary: '#ff0000' }
|
|
29
|
-
* }
|
|
30
|
-
* });
|
|
31
|
-
*
|
|
32
|
-
* const png = await renderImage(template, { title: 'Hello' });
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export function defineTemplate(templateModule, options = {}) {
|
|
36
|
-
const { meta, default: render } = templateModule;
|
|
37
|
-
// Validate meta
|
|
38
|
-
if (!meta.name) {
|
|
39
|
-
throw new Error('Template meta must have a name');
|
|
40
|
-
}
|
|
41
|
-
if (!meta.size || !meta.size.width || !meta.size.height) {
|
|
42
|
-
throw new Error('Template meta must have a size with width and height');
|
|
43
|
-
}
|
|
44
|
-
const type = meta.type || 'image';
|
|
45
|
-
if (type === 'video' && !meta.video) {
|
|
46
|
-
throw new Error('Video templates must have video metadata (fps, duration)');
|
|
47
|
-
}
|
|
48
|
-
return {
|
|
49
|
-
name: meta.name,
|
|
50
|
-
type: type,
|
|
51
|
-
size: meta.size,
|
|
52
|
-
video: meta.video,
|
|
53
|
-
config: options.config,
|
|
54
|
-
render,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Define a template from a source code string
|
|
59
|
-
*
|
|
60
|
-
* **IMPORTANT:** This function expects **pre-compiled JavaScript** with React.createElement
|
|
61
|
-
* calls. If you have JSX source code, compile it first using `compileTemplate()` from
|
|
62
|
-
* 'loopwind/sdk/compiler'.
|
|
63
|
-
*
|
|
64
|
-
* **WARNING:** This function evaluates code strings using `new Function()`.
|
|
65
|
-
* Only use with **trusted** template sources. Never use with user input from
|
|
66
|
-
* untrusted sources as it can execute arbitrary code.
|
|
67
|
-
*
|
|
68
|
-
* **Recommended workflow:**
|
|
69
|
-
* 1. In your admin panel: Use `compileTemplate()` to transform JSX → JavaScript
|
|
70
|
-
* 2. Store the compiled JavaScript in your database
|
|
71
|
-
* 3. In production: Load compiled code and pass to `defineTemplateFromSource()`
|
|
72
|
-
*
|
|
73
|
-
* This approach keeps @babel/standalone out of your production bundle!
|
|
74
|
-
*
|
|
75
|
-
* @example
|
|
76
|
-
* ```typescript
|
|
77
|
-
* // Admin panel: Compile and save
|
|
78
|
-
* import { compileTemplate } from 'loopwind/sdk/compiler';
|
|
79
|
-
*
|
|
80
|
-
* const jsxCode = getUserCodeFromEditor(); // Contains JSX
|
|
81
|
-
* const compiled = compileTemplate(jsxCode);
|
|
82
|
-
* await db.templates.save({ code: compiled });
|
|
83
|
-
* ```
|
|
84
|
-
*
|
|
85
|
-
* @example
|
|
86
|
-
* ```typescript
|
|
87
|
-
* // Production API: Load and render
|
|
88
|
-
* import { defineTemplateFromSource, renderImage } from 'loopwind/sdk';
|
|
89
|
-
*
|
|
90
|
-
* const template = await db.templates.findById(id);
|
|
91
|
-
* const templateDef = defineTemplateFromSource(template.code, {
|
|
92
|
-
* config: { colors: { primary: '#3b82f6' } }
|
|
93
|
-
* });
|
|
94
|
-
*
|
|
95
|
-
* const png = await renderImage(templateDef, { title: 'Hello' });
|
|
96
|
-
* ```
|
|
97
|
-
*/
|
|
98
|
-
export function defineTemplateFromSource(sourceCode, options = {}) {
|
|
99
|
-
try {
|
|
100
|
-
// Strip export keywords to make it work in function context
|
|
101
|
-
// Convert "export const meta = ..." to "const meta = ..."
|
|
102
|
-
// Convert "export default ..." to "const defaultExport = ..."
|
|
103
|
-
let processedSource = sourceCode
|
|
104
|
-
.replace(/export\s+const\s+meta\s*=/g, 'const meta =')
|
|
105
|
-
.replace(/export\s+default\s+/g, 'const defaultExport = ');
|
|
106
|
-
// Create a module evaluation function
|
|
107
|
-
// This executes the source code and returns the exports
|
|
108
|
-
const moduleFactory = new Function('React', `
|
|
109
|
-
'use strict';
|
|
110
|
-
${processedSource}
|
|
111
|
-
return { meta, default: defaultExport };
|
|
112
|
-
`);
|
|
113
|
-
// Execute to get meta and render function
|
|
114
|
-
const templateModule = moduleFactory(React);
|
|
115
|
-
if (!templateModule.meta) {
|
|
116
|
-
throw new Error('Template source must export a "meta" object');
|
|
117
|
-
}
|
|
118
|
-
if (!templateModule.default || typeof templateModule.default !== 'function') {
|
|
119
|
-
throw new Error('Template source must have a default export function');
|
|
120
|
-
}
|
|
121
|
-
return defineTemplate(templateModule, options);
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
throw new Error(`Failed to parse template source: ${error instanceof Error ? error.message : String(error)}`);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Define a template from a JSON schema
|
|
129
|
-
*
|
|
130
|
-
* Perfect for visual template builders where users drag and drop elements.
|
|
131
|
-
* Converts a declarative JSON schema into a working template.
|
|
132
|
-
*
|
|
133
|
-
* @example
|
|
134
|
-
* ```typescript
|
|
135
|
-
* const schema: TemplateSchema = {
|
|
136
|
-
* name: 'card',
|
|
137
|
-
* size: { width: 1200, height: 630 },
|
|
138
|
-
* config: {
|
|
139
|
-
* colors: { primary: '#3b82f6', background: '#ffffff' }
|
|
140
|
-
* },
|
|
141
|
-
* elements: [
|
|
142
|
-
* {
|
|
143
|
-
* type: 'div',
|
|
144
|
-
* className: 'flex flex-col w-full h-full bg-background p-12',
|
|
145
|
-
* children: [
|
|
146
|
-
* {
|
|
147
|
-
* type: 'h1',
|
|
148
|
-
* className: 'text-6xl font-bold text-primary',
|
|
149
|
-
* content: '{{title}}'
|
|
150
|
-
* },
|
|
151
|
-
* {
|
|
152
|
-
* type: 'p',
|
|
153
|
-
* className: 'text-2xl text-gray-600',
|
|
154
|
-
* content: '{{description}}'
|
|
155
|
-
* }
|
|
156
|
-
* ]
|
|
157
|
-
* }
|
|
158
|
-
* ]
|
|
159
|
-
* };
|
|
160
|
-
*
|
|
161
|
-
* const template = defineTemplateFromSchema(schema);
|
|
162
|
-
* const png = await renderImage(template, {
|
|
163
|
-
* title: 'Hello World',
|
|
164
|
-
* description: 'Created with visual builder'
|
|
165
|
-
* });
|
|
166
|
-
* ```
|
|
167
|
-
*/
|
|
168
|
-
export function defineTemplateFromSchema(schema) {
|
|
169
|
-
if (schema.elements.length === 0) {
|
|
170
|
-
throw new Error('Schema must have at least one element');
|
|
171
|
-
}
|
|
172
|
-
// Embed schema directly in the function body as a JSON literal
|
|
173
|
-
// This way the function is completely self-contained and survives serialization
|
|
174
|
-
const elementsJSON = JSON.stringify(schema.elements);
|
|
175
|
-
// Create a completely self-contained render function
|
|
176
|
-
// The function body contains the entire schema and all helper functions
|
|
177
|
-
// React must be available globally or passed in
|
|
178
|
-
const render = new Function('React', `
|
|
179
|
-
return function(props) {
|
|
180
|
-
const h = React.createElement;
|
|
181
|
-
const elements = ${elementsJSON};
|
|
182
|
-
|
|
183
|
-
const interpolate = (str) => {
|
|
184
|
-
return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {
|
|
185
|
-
return props[key] !== undefined ? String(props[key]) : '';
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
const buildElement = (element, key) => {
|
|
190
|
-
const { type, className, content, src, style, children } = element;
|
|
191
|
-
const elementProps = { key };
|
|
192
|
-
|
|
193
|
-
if (className && props.tw) {
|
|
194
|
-
elementProps.style = props.tw(className);
|
|
195
|
-
} else if (style) {
|
|
196
|
-
elementProps.style = style;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
if (type === 'img' && src) {
|
|
200
|
-
elementProps.src = interpolate(src);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
let elementChildren = null;
|
|
204
|
-
if (content) {
|
|
205
|
-
elementChildren = interpolate(content);
|
|
206
|
-
} else if (children && children.length > 0) {
|
|
207
|
-
elementChildren = children.map((child, i) => buildElement(child, i));
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return h(type, elementProps, elementChildren);
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
if (elements.length === 1) {
|
|
214
|
-
return buildElement(elements[0]);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return h(React.Fragment, null, elements.map((el, i) => buildElement(el, i)));
|
|
218
|
-
}
|
|
219
|
-
`)(React);
|
|
220
|
-
// Create a template module from the schema
|
|
221
|
-
const meta = {
|
|
222
|
-
name: schema.name,
|
|
223
|
-
description: schema.name,
|
|
224
|
-
type: schema.type || 'image',
|
|
225
|
-
size: schema.size,
|
|
226
|
-
video: schema.video,
|
|
227
|
-
props: {},
|
|
228
|
-
};
|
|
229
|
-
return defineTemplate({ meta, default: render }, { config: schema.config });
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=template.js.map
|
package/dist/sdk/template.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloudflare Workers SDK for loopwind
|
|
3
|
-
*
|
|
4
|
-
* Pure JavaScript/WASM implementation for edge runtimes.
|
|
5
|
-
* - @resvg/resvg-wasm for SVG-to-PNG conversion
|
|
6
|
-
* - h264-mp4-encoder for video encoding
|
|
7
|
-
*
|
|
8
|
-
* All rendering (image and video) works in Cloudflare Workers!
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { renderImage, renderSVG, renderVideo, defineTemplate, initWasm } from 'loopwind/sdk/workers';
|
|
13
|
-
* import React from 'react';
|
|
14
|
-
*
|
|
15
|
-
* // Image template
|
|
16
|
-
* const imageTemplate = defineTemplate({
|
|
17
|
-
* name: 'og-image',
|
|
18
|
-
* size: { width: 1200, height: 630 },
|
|
19
|
-
* render: ({ tw, title }) => React.createElement(
|
|
20
|
-
* 'div',
|
|
21
|
-
* { style: tw('flex items-center justify-center w-full h-full bg-blue-500') },
|
|
22
|
-
* React.createElement('h1', { style: tw('text-6xl font-bold text-white') }, title)
|
|
23
|
-
* )
|
|
24
|
-
* });
|
|
25
|
-
*
|
|
26
|
-
* // SVG (no WASM needed)
|
|
27
|
-
* const svg = await renderSVG(imageTemplate, { title: 'Hello World' });
|
|
28
|
-
*
|
|
29
|
-
* // PNG (requires WASM)
|
|
30
|
-
* await initWasm();
|
|
31
|
-
* const png = await renderImage(imageTemplate, { title: 'Hello World' });
|
|
32
|
-
*
|
|
33
|
-
* // Video template
|
|
34
|
-
* const videoTemplate = defineTemplate({
|
|
35
|
-
* name: 'intro',
|
|
36
|
-
* type: 'video',
|
|
37
|
-
* size: { width: 1920, height: 1080 },
|
|
38
|
-
* video: { fps: 30, duration: 2 },
|
|
39
|
-
* render: ({ tw, progress }) => React.createElement(
|
|
40
|
-
* 'div',
|
|
41
|
-
* { style: tw('flex items-center justify-center w-full h-full bg-gradient-to-r from-blue-500 to-purple-500') },
|
|
42
|
-
* React.createElement('div', { style: { opacity: progress } }, 'Fade In')
|
|
43
|
-
* )
|
|
44
|
-
* });
|
|
45
|
-
*
|
|
46
|
-
* // MP4 (requires WASM)
|
|
47
|
-
* const mp4 = await renderVideo(videoTemplate, {});
|
|
48
|
-
* ```
|
|
49
|
-
*/
|
|
50
|
-
import { type TemplateConfig, type FontConfig, type StyleConfig } from '../../lib/render-core.js';
|
|
51
|
-
export { defineTemplate } from '../../lib/render-core.js';
|
|
52
|
-
export type { TemplateConfig, FontConfig, StyleConfig };
|
|
53
|
-
export { defineTemplateFromSchema, defineTemplateFromSource } from '../template.js';
|
|
54
|
-
export type { TemplateDefinition } from '../template.js';
|
|
55
|
-
/**
|
|
56
|
-
* Render options for workers
|
|
57
|
-
*/
|
|
58
|
-
export interface WorkerRenderOptions {
|
|
59
|
-
format?: 'png' | 'svg';
|
|
60
|
-
fonts?: FontConfig[];
|
|
61
|
-
config?: StyleConfig;
|
|
62
|
-
scale?: number;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Initialize WASM (required for PNG rendering)
|
|
66
|
-
*/
|
|
67
|
-
export declare function initWasm(resvgWasm?: ArrayBuffer): Promise<void>;
|
|
68
|
-
/**
|
|
69
|
-
* Check if WASM is initialized
|
|
70
|
-
*/
|
|
71
|
-
export declare function isWasmInitialized(): boolean;
|
|
72
|
-
/**
|
|
73
|
-
* Render to SVG string
|
|
74
|
-
*/
|
|
75
|
-
export declare function renderSVG<TProps = any>(template: TemplateConfig<TProps>, props: TProps, options?: WorkerRenderOptions): Promise<string>;
|
|
76
|
-
/**
|
|
77
|
-
* Render to PNG (requires initWasm() first)
|
|
78
|
-
*/
|
|
79
|
-
export declare function renderImage<TProps = any>(template: TemplateConfig<TProps>, props: TProps, options?: WorkerRenderOptions): Promise<Uint8Array>;
|
|
80
|
-
/**
|
|
81
|
-
* Load a font from URL (helper for custom fonts)
|
|
82
|
-
*
|
|
83
|
-
* @example
|
|
84
|
-
* ```typescript
|
|
85
|
-
* const fonts = await Promise.all([
|
|
86
|
-
* loadFont('https://example.com/my-font-400.woff', 'MyFont', 400),
|
|
87
|
-
* loadFont('https://example.com/my-font-700.woff', 'MyFont', 700),
|
|
88
|
-
* ]);
|
|
89
|
-
*
|
|
90
|
-
* const png = await renderImage(template, props, { fonts });
|
|
91
|
-
* ```
|
|
92
|
-
*/
|
|
93
|
-
export declare function loadFont(url: string, name: string, weight?: number, style?: 'normal' | 'italic'): Promise<FontConfig>;
|
|
94
|
-
/**
|
|
95
|
-
* Fetch an image and convert to data URI
|
|
96
|
-
*/
|
|
97
|
-
export declare function fetchImage(url: string): Promise<string>;
|
|
98
|
-
/**
|
|
99
|
-
* Video render options for workers
|
|
100
|
-
*/
|
|
101
|
-
export interface VideoRenderOptions {
|
|
102
|
-
fonts?: FontConfig[];
|
|
103
|
-
config?: StyleConfig;
|
|
104
|
-
quality?: number;
|
|
105
|
-
onProgress?: (frame: number, total: number) => void;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Render a video template to MP4 (requires initWasm() first)
|
|
109
|
-
*
|
|
110
|
-
* Uses h264-mp4-encoder (WASM) for encoding - works in Cloudflare Workers.
|
|
111
|
-
*
|
|
112
|
-
* @example
|
|
113
|
-
* ```typescript
|
|
114
|
-
* await initWasm();
|
|
115
|
-
*
|
|
116
|
-
* const template = defineTemplate({
|
|
117
|
-
* name: 'video',
|
|
118
|
-
* type: 'video',
|
|
119
|
-
* size: { width: 1920, height: 1080 },
|
|
120
|
-
* video: { fps: 30, duration: 2 },
|
|
121
|
-
* render: ({ tw, progress }) => React.createElement(
|
|
122
|
-
* 'div',
|
|
123
|
-
* { style: tw('flex items-center justify-center w-full h-full bg-blue-500') },
|
|
124
|
-
* React.createElement('div', {
|
|
125
|
-
* style: { opacity: progress, ...tw('text-6xl font-bold text-white') }
|
|
126
|
-
* }, 'Fade In')
|
|
127
|
-
* )
|
|
128
|
-
* });
|
|
129
|
-
*
|
|
130
|
-
* const mp4 = await renderVideo(template, {});
|
|
131
|
-
* return new Response(mp4, { headers: { 'Content-Type': 'video/mp4' } });
|
|
132
|
-
* ```
|
|
133
|
-
*/
|
|
134
|
-
export declare function renderVideo<TProps = any>(template: TemplateConfig<TProps>, props: TProps, options?: VideoRenderOptions): Promise<Uint8Array>;
|
|
135
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/workers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAIH,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,WAAW,EAEjB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AACpF,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAarE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAyCD;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,GAAG,GAAG,EAC1C,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,GAAG,GAAG,EAC5C,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,UAAU,CAAC,CAyBrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAY,EACpB,KAAK,GAAE,QAAQ,GAAG,QAAmB,GACpC,OAAO,CAAC,UAAU,CAAC,CAWrB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7D;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,WAAW,CAAC,MAAM,GAAG,GAAG,EAC5C,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAgErB"}
|
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloudflare Workers SDK for loopwind
|
|
3
|
-
*
|
|
4
|
-
* Pure JavaScript/WASM implementation for edge runtimes.
|
|
5
|
-
* - @resvg/resvg-wasm for SVG-to-PNG conversion
|
|
6
|
-
* - h264-mp4-encoder for video encoding
|
|
7
|
-
*
|
|
8
|
-
* All rendering (image and video) works in Cloudflare Workers!
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { renderImage, renderSVG, renderVideo, defineTemplate, initWasm } from 'loopwind/sdk/workers';
|
|
13
|
-
* import React from 'react';
|
|
14
|
-
*
|
|
15
|
-
* // Image template
|
|
16
|
-
* const imageTemplate = defineTemplate({
|
|
17
|
-
* name: 'og-image',
|
|
18
|
-
* size: { width: 1200, height: 630 },
|
|
19
|
-
* render: ({ tw, title }) => React.createElement(
|
|
20
|
-
* 'div',
|
|
21
|
-
* { style: tw('flex items-center justify-center w-full h-full bg-blue-500') },
|
|
22
|
-
* React.createElement('h1', { style: tw('text-6xl font-bold text-white') }, title)
|
|
23
|
-
* )
|
|
24
|
-
* });
|
|
25
|
-
*
|
|
26
|
-
* // SVG (no WASM needed)
|
|
27
|
-
* const svg = await renderSVG(imageTemplate, { title: 'Hello World' });
|
|
28
|
-
*
|
|
29
|
-
* // PNG (requires WASM)
|
|
30
|
-
* await initWasm();
|
|
31
|
-
* const png = await renderImage(imageTemplate, { title: 'Hello World' });
|
|
32
|
-
*
|
|
33
|
-
* // Video template
|
|
34
|
-
* const videoTemplate = defineTemplate({
|
|
35
|
-
* name: 'intro',
|
|
36
|
-
* type: 'video',
|
|
37
|
-
* size: { width: 1920, height: 1080 },
|
|
38
|
-
* video: { fps: 30, duration: 2 },
|
|
39
|
-
* render: ({ tw, progress }) => React.createElement(
|
|
40
|
-
* 'div',
|
|
41
|
-
* { style: tw('flex items-center justify-center w-full h-full bg-gradient-to-r from-blue-500 to-purple-500') },
|
|
42
|
-
* React.createElement('div', { style: { opacity: progress } }, 'Fade In')
|
|
43
|
-
* )
|
|
44
|
-
* });
|
|
45
|
-
*
|
|
46
|
-
* // MP4 (requires WASM)
|
|
47
|
-
* const mp4 = await renderVideo(videoTemplate, {});
|
|
48
|
-
* ```
|
|
49
|
-
*/
|
|
50
|
-
import { Resvg, initWasm as initResvgWasm } from '@resvg/resvg-wasm';
|
|
51
|
-
import HME from 'h264-mp4-encoder';
|
|
52
|
-
import { renderTemplateToSVG, } from '../../lib/render-core.js';
|
|
53
|
-
// Re-export core types and functions
|
|
54
|
-
export { defineTemplate } from '../../lib/render-core.js';
|
|
55
|
-
// Re-export from template module for backwards compatibility
|
|
56
|
-
export { defineTemplateFromSchema, defineTemplateFromSource } from '../template.js';
|
|
57
|
-
// WASM state
|
|
58
|
-
let wasmInitialized = false;
|
|
59
|
-
/**
|
|
60
|
-
* Initialize WASM (required for PNG rendering)
|
|
61
|
-
*/
|
|
62
|
-
export async function initWasm(resvgWasm) {
|
|
63
|
-
if (wasmInitialized)
|
|
64
|
-
return;
|
|
65
|
-
if (resvgWasm) {
|
|
66
|
-
await initResvgWasm(resvgWasm);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
const wasmUrl = 'https://unpkg.com/@resvg/resvg-wasm@2.6.2/index_bg.wasm';
|
|
70
|
-
const response = await fetch(wasmUrl);
|
|
71
|
-
const wasm = await response.arrayBuffer();
|
|
72
|
-
await initResvgWasm(wasm);
|
|
73
|
-
}
|
|
74
|
-
wasmInitialized = true;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Check if WASM is initialized
|
|
78
|
-
*/
|
|
79
|
-
export function isWasmInitialized() {
|
|
80
|
-
return wasmInitialized;
|
|
81
|
-
}
|
|
82
|
-
// Font cache
|
|
83
|
-
let defaultFontsCache = null;
|
|
84
|
-
async function getDefaultFonts() {
|
|
85
|
-
if (defaultFontsCache)
|
|
86
|
-
return defaultFontsCache;
|
|
87
|
-
const fonts = [];
|
|
88
|
-
try {
|
|
89
|
-
const [regularRes, boldRes] = await Promise.all([
|
|
90
|
-
fetch('https://cdn.jsdelivr.net/npm/@fontsource/inter@5.0.18/files/inter-latin-400-normal.woff'),
|
|
91
|
-
fetch('https://cdn.jsdelivr.net/npm/@fontsource/inter@5.0.18/files/inter-latin-700-normal.woff'),
|
|
92
|
-
]);
|
|
93
|
-
if (regularRes.ok) {
|
|
94
|
-
fonts.push({
|
|
95
|
-
name: 'Inter',
|
|
96
|
-
data: await regularRes.arrayBuffer(),
|
|
97
|
-
weight: 400,
|
|
98
|
-
style: 'normal',
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
if (boldRes.ok) {
|
|
102
|
-
fonts.push({
|
|
103
|
-
name: 'Inter',
|
|
104
|
-
data: await boldRes.arrayBuffer(),
|
|
105
|
-
weight: 700,
|
|
106
|
-
style: 'normal',
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
catch (e) {
|
|
111
|
-
console.warn('Failed to load default fonts:', e);
|
|
112
|
-
}
|
|
113
|
-
defaultFontsCache = fonts;
|
|
114
|
-
return fonts;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Render to SVG string
|
|
118
|
-
*/
|
|
119
|
-
export async function renderSVG(template, props, options = {}) {
|
|
120
|
-
const fonts = options.fonts || await getDefaultFonts();
|
|
121
|
-
return renderTemplateToSVG(template, props, {
|
|
122
|
-
fonts,
|
|
123
|
-
config: options.config,
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Render to PNG (requires initWasm() first)
|
|
128
|
-
*/
|
|
129
|
-
export async function renderImage(template, props, options = {}) {
|
|
130
|
-
const { format = 'png', scale = 2 } = options;
|
|
131
|
-
if (!wasmInitialized) {
|
|
132
|
-
throw new Error('WASM not initialized. Call initWasm() before rendering.');
|
|
133
|
-
}
|
|
134
|
-
if (template.type === 'video') {
|
|
135
|
-
throw new Error('Cannot render video template as image.');
|
|
136
|
-
}
|
|
137
|
-
const svg = await renderSVG(template, props, options);
|
|
138
|
-
if (format === 'svg') {
|
|
139
|
-
return new TextEncoder().encode(svg);
|
|
140
|
-
}
|
|
141
|
-
const resvg = new Resvg(svg, {
|
|
142
|
-
fitTo: {
|
|
143
|
-
mode: 'width',
|
|
144
|
-
value: Math.round(template.size.width * scale),
|
|
145
|
-
},
|
|
146
|
-
});
|
|
147
|
-
return resvg.render().asPng();
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Load a font from URL (helper for custom fonts)
|
|
151
|
-
*
|
|
152
|
-
* @example
|
|
153
|
-
* ```typescript
|
|
154
|
-
* const fonts = await Promise.all([
|
|
155
|
-
* loadFont('https://example.com/my-font-400.woff', 'MyFont', 400),
|
|
156
|
-
* loadFont('https://example.com/my-font-700.woff', 'MyFont', 700),
|
|
157
|
-
* ]);
|
|
158
|
-
*
|
|
159
|
-
* const png = await renderImage(template, props, { fonts });
|
|
160
|
-
* ```
|
|
161
|
-
*/
|
|
162
|
-
export async function loadFont(url, name, weight = 400, style = 'normal') {
|
|
163
|
-
const response = await fetch(url);
|
|
164
|
-
if (!response.ok) {
|
|
165
|
-
throw new Error(`Failed to load font from ${url}: ${response.statusText}`);
|
|
166
|
-
}
|
|
167
|
-
return {
|
|
168
|
-
name,
|
|
169
|
-
data: await response.arrayBuffer(),
|
|
170
|
-
weight,
|
|
171
|
-
style,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Fetch an image and convert to data URI
|
|
176
|
-
*/
|
|
177
|
-
export async function fetchImage(url) {
|
|
178
|
-
try {
|
|
179
|
-
const response = await fetch(url);
|
|
180
|
-
if (!response.ok)
|
|
181
|
-
throw new Error(`Failed to fetch: ${response.statusText}`);
|
|
182
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
183
|
-
const base64 = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
|
|
184
|
-
const contentType = response.headers.get('content-type') || 'image/png';
|
|
185
|
-
return `data:${contentType.split(';')[0]};base64,${base64}`;
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
console.error('Image loading failed:', error);
|
|
189
|
-
return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Render a video template to MP4 (requires initWasm() first)
|
|
194
|
-
*
|
|
195
|
-
* Uses h264-mp4-encoder (WASM) for encoding - works in Cloudflare Workers.
|
|
196
|
-
*
|
|
197
|
-
* @example
|
|
198
|
-
* ```typescript
|
|
199
|
-
* await initWasm();
|
|
200
|
-
*
|
|
201
|
-
* const template = defineTemplate({
|
|
202
|
-
* name: 'video',
|
|
203
|
-
* type: 'video',
|
|
204
|
-
* size: { width: 1920, height: 1080 },
|
|
205
|
-
* video: { fps: 30, duration: 2 },
|
|
206
|
-
* render: ({ tw, progress }) => React.createElement(
|
|
207
|
-
* 'div',
|
|
208
|
-
* { style: tw('flex items-center justify-center w-full h-full bg-blue-500') },
|
|
209
|
-
* React.createElement('div', {
|
|
210
|
-
* style: { opacity: progress, ...tw('text-6xl font-bold text-white') }
|
|
211
|
-
* }, 'Fade In')
|
|
212
|
-
* )
|
|
213
|
-
* });
|
|
214
|
-
*
|
|
215
|
-
* const mp4 = await renderVideo(template, {});
|
|
216
|
-
* return new Response(mp4, { headers: { 'Content-Type': 'video/mp4' } });
|
|
217
|
-
* ```
|
|
218
|
-
*/
|
|
219
|
-
export async function renderVideo(template, props, options = {}) {
|
|
220
|
-
if (!wasmInitialized) {
|
|
221
|
-
throw new Error('WASM not initialized. Call initWasm() before rendering video.');
|
|
222
|
-
}
|
|
223
|
-
if (template.type !== 'video') {
|
|
224
|
-
throw new Error('Template must have type: "video" to render as video.');
|
|
225
|
-
}
|
|
226
|
-
if (!template.video) {
|
|
227
|
-
throw new Error('Template must have video config (fps, duration).');
|
|
228
|
-
}
|
|
229
|
-
const { fps, duration } = template.video;
|
|
230
|
-
const { width, height } = template.size;
|
|
231
|
-
const { quality = 23, onProgress } = options;
|
|
232
|
-
const totalFrames = Math.floor(fps * duration);
|
|
233
|
-
const fonts = options.fonts || await getDefaultFonts();
|
|
234
|
-
// Generate all frames as RGBA
|
|
235
|
-
const rgbaFrames = new Array(totalFrames);
|
|
236
|
-
for (let frame = 0; frame < totalFrames; frame++) {
|
|
237
|
-
const progress = frame / (totalFrames - 1);
|
|
238
|
-
const frameProps = { ...props, frame, progress };
|
|
239
|
-
// Render SVG
|
|
240
|
-
const svg = await renderTemplateToSVG(template, frameProps, {
|
|
241
|
-
fonts,
|
|
242
|
-
config: options.config,
|
|
243
|
-
});
|
|
244
|
-
// Convert SVG to RGBA using resvg
|
|
245
|
-
const resvg = new Resvg(svg, {
|
|
246
|
-
fitTo: { mode: 'width', value: width },
|
|
247
|
-
});
|
|
248
|
-
const rendered = resvg.render();
|
|
249
|
-
rgbaFrames[frame] = rendered.pixels;
|
|
250
|
-
if (onProgress) {
|
|
251
|
-
onProgress(frame + 1, totalFrames);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
// Encode to H.264 MP4
|
|
255
|
-
const encoder = await HME.createH264MP4Encoder();
|
|
256
|
-
encoder.width = width;
|
|
257
|
-
encoder.height = height;
|
|
258
|
-
encoder.frameRate = fps;
|
|
259
|
-
encoder.quantizationParameter = quality;
|
|
260
|
-
encoder.speed = 10;
|
|
261
|
-
encoder.groupOfPictures = fps;
|
|
262
|
-
encoder.initialize();
|
|
263
|
-
for (let i = 0; i < rgbaFrames.length; i++) {
|
|
264
|
-
encoder.addFrameRgba(rgbaFrames[i]);
|
|
265
|
-
}
|
|
266
|
-
encoder.finalize();
|
|
267
|
-
const output = encoder.FS.readFile(encoder.outputFilename);
|
|
268
|
-
encoder.delete();
|
|
269
|
-
return output;
|
|
270
|
-
}
|
|
271
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sdk/workers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,EACL,mBAAmB,GAMpB,MAAM,0BAA0B,CAAC;AAElC,qCAAqC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,6DAA6D;AAC7D,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAapF,aAAa;AACb,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAuB;IACpD,IAAI,eAAe;QAAE,OAAO;IAE5B,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,yDAAyD,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,aAAa;AACb,IAAI,iBAAiB,GAAwB,IAAI,CAAC;AAElD,KAAK,UAAU,eAAe;IAC5B,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9C,KAAK,CAAC,yFAAyF,CAAC;YAChG,KAAK,CAAC,yFAAyF,CAAC;SACjG,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,MAAM,UAAU,CAAC,WAAW,EAAE;gBACpC,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE;gBACjC,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,iBAAiB,GAAG,KAAK,CAAC;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgC,EAChC,KAAa,EACb,UAA+B,EAAE;IAEjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,eAAe,EAAE,CAAC;IAEvD,OAAO,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE;QAC1C,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgC,EAChC,KAAa,EACb,UAA+B,EAAE;IAEjC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAE9C,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;QAC3B,KAAK,EAAE;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SAC/C;KACF,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,IAAY,EACZ,SAAiB,GAAG,EACpB,QAA6B,QAAQ;IAErC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,MAAM,QAAQ,CAAC,WAAW,EAAE;QAClC,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE7E,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC;QAExE,OAAO,QAAQ,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,wHAAwH,CAAC;IAClI,CAAC;AACH,CAAC;AAYD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgC,EAChC,KAAa,EACb,UAA8B,EAAE;IAEhC,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;IACzC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;IACxC,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,eAAe,EAAE,CAAC;IAEvD,8BAA8B;IAC9B,MAAM,UAAU,GAAiB,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAExD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAY,CAAC;QAE3D,aAAa;QACb,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE;YAC1D,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,kCAAkC;QAClC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;YAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;SACvC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAChC,UAAU,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEpC,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,oBAAoB,EAAE,CAAC;IACjD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;IACtB,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;IACxB,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC;IACxC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;IACnB,OAAO,CAAC,eAAe,GAAG,GAAG,CAAC;IAC9B,OAAO,CAAC,UAAU,EAAE,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,QAAQ,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,EAAE,CAAC;IAEjB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|