/
githubmirror
/
drawio
Обзор
Документация
Войти
/
githubmirror
/
drawio
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
etc/build/build.xml
765 строк
29 KB
David Benson
31.1.8 release
07 авг 2026, 02:43
07 авг 2026, 02:43
a1f615b
Код
Авторство
О чём код?
<?xml version="1.0"?> <!-- ================================================================================ draw.io BUILD (github-build.xml) ================================================================================ This file contains all targets needed to build draw.io from source. USAGE: ant -f github-build.xml (runs 'all' target) ant -f github-build.xml app (runs just the app target) REQUIREMENTS: - Java JDK (for Ant and Closure Compiler) - Apache Ant - Google Closure Compiler JAR (path configured in build.properties) - Xml2Js.class in etc/build/ (converts stencil XML to JS) OUTPUT FILES (in src/main/webapp/js/): - app.min.js : Full editor application - viewer.min.js : Standalone diagram viewer - viewer-static.min.js: Viewer with shapes embedded - extensions.min.js : Import/export extensions (VSDX import, Mermaid, GraphML) - shapes-14-6-5.min.js: Shape definitions - stencils.min.js : Stencil definitions - integrate.min.js : Embedding integration bundle ================================================================================ --> <project basedir="." default="all"> <property file="build.properties.local" /> <property file="build.properties" /> <taskdef name="jscomp" classname="com.google.javascript.jscomp.ant.CompileTask" classpath="${jscompiler}" /> <!-- Closure Compiler warning level for all <jscomp> tasks. Defaults to "quiet" so the build prints only errors and the per-target "N error(s), N warning(s)" summary. Pre-minified vendor libs (pako, DOMPurify) otherwise dump their entire contents as benign warnings, drowning out anything important. Override to see warnings: ant -Djscomp.warning=default (or =verbose) --> <property name="jscomp.warning" value="quiet" /> <!-- ============================================================================ TARGET: merge ============================================================================ Combines shape and stencil JavaScript files into minified bundles. PROCESS: 1. Concatenates all JS from shapes/ and stencils/ directories 2. Runs Xml2Js to convert stencil XML files to JavaScript 3. Minifies combined shapes.js with Closure Compiler OUTPUTS: - js/shapes-14-6-5.min.js : Minified shape definitions - js/stencils.min.js : Stencil definitions from XML ============================================================================ --> <target name="merge"> <concat destfile="${basedir}/../../build/shapes.js" fixlastline="yes" append="no"> <fileset dir="${war.dir}/shapes" includes="**/*.js"/> <fileset dir="${war.dir}/stencils" includes="**/*.js"/> </concat> <java fork="false" classname="Xml2Js" classpath="."> <arg value="../../src/main/webapp/stencils"/> <arg value="../../src/main/webapp/js/stencils.min.js"/> </java> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${war.dir}/js/shapes-14-6-5.min.js"> <sources dir="${basedir}/../../build"> <file name="shapes.js" /> </sources> </jscomp> <tstamp> <format property="time.stamp" pattern="MM/dd/yyyy hh:mm aa" unit="hour"/> </tstamp> <delete dir="${basedir}/../../build"/> </target> <!-- ============================================================================ TARGET: app (depends on merge) ============================================================================ Main compilation target - builds all core application JavaScript. PROCESS: 1. Creates runtime config (proxy URLs, base paths) 2. Generates Graph-Stylesheet.js from styles/default.xml 3. Generates Graph-Resources.js from resources/dia.txt 4. Compiles grapheditor components (Editor, Sidebar, Graph, etc.) 5. Compiles all Sidebar-*.js shape libraries 6. Compiles client.min.js (mxGraph core + init) 7. Builds base-viewer.min.js (lightweight viewer) 8. Builds viewer.min.js and viewer-static.min.js 9. Builds extensions.min.js (VSDX import, Mermaid, GraphML, OrgChart) 10. Builds app.min.js (full editor with cloud integrations and Simple.js) OUTPUTS: - js/viewer.min.js : Standalone viewer - js/viewer-static.min.js : Viewer with embedded shapes - js/app.min.js : Full editor application - js/extensions.min.js : Import/export extensions - js/orgchart.min.js : Org chart layout library TEMPORARY FILES (created then deleted): - Graph-Stylesheet.js, Graph-Resources.js - grapheditor.min.js, sidebar.min.js, client.min.js - .tmp0.js, .tmp1.js, .tmp2.js, .tmp3.js, etc. ============================================================================ --> <target name="app" depends="merge"> <!-- Step 1: Create runtime configuration --> <delete file="${basedir}/.tmp0.js"/> <echo file="${basedir}/.tmp0.js"> window.PROXY_URL = window.PROXY_URL || 'https://viewer.diagrams.net/proxy'; window.STYLE_PATH = window.STYLE_PATH || 'https://viewer.diagrams.net/styles'; window.SHAPES_PATH = window.SHAPES_PATH || 'https://viewer.diagrams.net/shapes'; window.STENCIL_PATH = window.STENCIL_PATH || 'https://viewer.diagrams.net/stencils'; window.DRAW_MATH_URL = window.DRAW_MATH_URL || 'https://viewer.diagrams.net/math4/es5'; window.GRAPH_IMAGE_PATH = window.GRAPH_IMAGE_PATH || 'https://viewer.diagrams.net/img'; window.mxImageBasePath = window.mxImageBasePath || 'https://viewer.diagrams.net/mxgraph/images'; window.mxBasePath = window.mxBasePath || 'https://viewer.diagrams.net/mxgraph/'; window.mxLoadStylesheets = window.mxLoadStylesheets || false; </echo> <!-- Step 2: Generate Graph-Stylesheet.js from default.xml --> <delete file="${basedir}/.tmp1.js"/> <copy file="${war.dir}/styles/default.xml" tofile="${basedir}/.tmp1.xml" overwrite="true"/> <replaceregexp file="${basedir}/.tmp1.xml" match="${line.separator}" flags="g" replace=""/> <replaceregexp file="${basedir}/.tmp1.xml" match="\t" flags="g" replace=""/> <replaceregexp file="${basedir}/.tmp1.xml" match="'" flags="g" replace="\\\\'" byline="true"/> <delete file="${basedir}/Graph-Stylesheet.js"/> <echo file="${basedir}/Graph-Stylesheet.js">Graph.prototype.defaultThemes['default-style2'] = mxUtils.parseXml(`</echo> <concat destfile="${basedir}/Graph-Stylesheet.js" fixlastline="no" append="true"> <filelist dir="${basedir}" files=".tmp1.xml"/> </concat> <echo file="${basedir}/Graph-Stylesheet.js" append="true">`).documentElement;</echo> <echo file="${basedir}/Graph-Stylesheet.js" append="true">Graph.prototype.defaultThemes['darkTheme'] = Graph.prototype.defaultThemes['default-style2'];</echo> <!-- Step 3: Generate Graph-Resources.js from dia.txt --> <delete file="${basedir}/.tmp2.xml"/> <copy file="${war.dir}/resources/dia.txt" tofile="${basedir}/.tmp2.xml" overwrite="true"/> <replaceregexp file="${basedir}/.tmp2.xml" match="${line.separator}" flags="g" replace="\\\\n"/> <replaceregexp file="${basedir}/.tmp2.xml" match="'" flags="g" replace="\\\\'" byline="true"/> <delete file="${basedir}/Graph-Resources.js"/> <echo file="${basedir}/Graph-Resources.js">mxResources.parse(`</echo> <concat destfile="${basedir}/Graph-Resources.js" fixlastline="no" append="true"> <filelist dir="${basedir}" files=".tmp2.xml"/> </concat> <echo file="${basedir}/Graph-Resources.js" append="true">`);</echo> <!-- Step 4: Compile grapheditor core components --> <jscomp warning="${jscomp.warning}" compilationLevel="simple" forceRecompile="true" debug="false" output="${basedir}/grapheditor.min.js"> <sources dir="${grapheditor.dir}"> <file name="Editor.js" /> <file name="EditorUi.js" /> <file name="Sidebar.js" /> <file name="Graph.js" /> <file name="InlineToolbar.js" /> <file name="Format.js" /> <file name="Shapes.js" /> <file name="Actions.js" /> <file name="Menus.js" /> <file name="Toolbar.js" /> <file name="Dialogs.js" /> </sources> </jscomp> <!-- Step 5: Compile all sidebar shape libraries --> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/sidebar.min.js"> <sources dir="${war.dir}/js/diagramly/sidebar"> <file name="Sidebar.js" /> <file name="Sidebar-ActiveDirectory.js" /> <file name="Sidebar-Advanced.js" /> <file name="Sidebar-AlibabaCloud.js" /> <file name="Sidebar-AlliedTelesis.js" /> <file name="Sidebar-Android.js" /> <file name="Sidebar-ArchiMate.js" /> <file name="Sidebar-ArchiMate3.js" /> <file name="Sidebar-ArchiMate4.js" /> <file name="Sidebar-Arrows2.js" /> <file name="Sidebar-Atlassian.js" /> <file name="Sidebar-AWS.js" /> <file name="Sidebar-AWS3.js" /> <file name="Sidebar-AWS3D.js" /> <file name="Sidebar-AWS4.js" /> <file name="Sidebar-AWS4b.js" /> <file name="Sidebar-Azure.js" /> <file name="Sidebar-Azure2.js" /> <file name="Sidebar-Basic.js" /> <file name="Sidebar-Bootstrap.js" /> <file name="Sidebar-BPMN.js" /> <file name="Sidebar-C4.js" /> <file name="Sidebar-Cabinet.js" /> <file name="Sidebar-Cisco.js" /> <file name="Sidebar-Cisco19.js" /> <file name="Sidebar-CiscoSafe.js" /> <file name="Sidebar-Citrix.js" /> <file name="Sidebar-Citrix2.js" /> <file name="Sidebar-Cumulus.js" /> <file name="Sidebar-DFD.js" /> <file name="Sidebar-Dynamics365.js" /> <file name="Sidebar-EIP.js" /> <file name="Sidebar-Electrical.js" /> <file name="Sidebar-ER.js" /> <file name="Sidebar-Floorplan.js" /> <file name="Sidebar-Flowchart.js" /> <file name="Sidebar-FluidPower.js" /> <file name="Sidebar-GCP.js" /> <file name="Sidebar-GCP2.js" /> <file name="Sidebar-GCP3.js" /> <file name="Sidebar-GCPIcons.js" /> <file name="Sidebar-Gmdl.js" /> <file name="Sidebar-IBM.js" /> <file name="Sidebar-IBMCloud.js" /> <file name="Sidebar-Infographic.js" /> <file name="Sidebar-Ios.js" /> <file name="Sidebar-Ios7.js" /> <file name="Sidebar-Kubernetes.js" /> <file name="Sidebar-LeanMapping.js" /> <file name="Sidebar-Mockup.js" /> <file name="Sidebar-MSCAE.js" /> <file name="Sidebar-Network.js" /> <file name="Sidebar-Network2.js" /> <file name="Sidebar-Office.js" /> <file name="Sidebar-OpenStack.js" /> <file name="Sidebar-PID.js" /> <file name="Sidebar-Rack.js" /> <file name="Sidebar-Salesforce.js" /> <file name="Sidebar-SAP.js" /> <file name="Sidebar-Signs.js" /> <file name="Sidebar-Sitemap.js" /> <file name="Sidebar-Sysml.js" /> <file name="Sidebar-ThreatModeling.js" /> <file name="Sidebar-UML25.js" /> <file name="Sidebar-Veeam.js" /> <file name="Sidebar-Veeam2.js" /> <file name="Sidebar-VVD.js" /> <file name="Sidebar-WebIcons.js" /> </sources> </jscomp> <!-- Step 6: Compile client.min.js (mxGraph core + initialization) --> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/client.min.js"> <sources dir="${war.dir}/js/deflate"> <file name="base64.js" /> </sources> <sources dir="${war.dir}/js/diagramly"> <file name="Init.js" /> </sources> <sources dir="${grapheditor.dir}"> <file name="Init.js" /> </sources> <sources dir="${war.dir}/mxgraph"> <file name="mxClient.js" /> </sources> </jscomp> <!-- Minify config snippet --> <jscomp warning="${jscomp.warning}" compilationLevel="simple" forceRecompile="true" debug="false" output="${basedir}/.tmp0.min.js"> <sources dir="${basedir}"> <file name=".tmp0.js"/> </sources> </jscomp> <!-- Step 7: Compile viewer components --> <jscomp warning="${jscomp.warning}" compilationLevel="simple" forceRecompile="true" debug="false" output="${basedir}/.tmp1.js"> <sources dir="${grapheditor.dir}"> <file name="Editor.js" /> <file name="EditorUi.js" /> <file name="Graph.js" /> <file name="Shapes.js" /> <file name="Actions.js" /> </sources> <sources dir="${war.dir}/js/diagramly"> <file name="DrawioFile.js" /> <file name="LocalFile.js" /> <file name="Editor.js" /> <file name="EditorUi.js" /> <file name="Pages.js" /> <file name="Trees.js" /> <file name="Minimal.js" /> <file name="DrawioComment.js" /> <file name="DrawioUser.js" /> </sources> <sources dir="${basedir}"> <file name="Graph-Resources.js" /> <file name="Graph-Stylesheet.js" /> </sources> <sources dir="${war.dir}/js/diagramly"> <file name="GraphViewer.js" /> </sources> </jscomp> <!-- Build base-viewer.min.js (lightweight viewer bundle) --> <concat destfile="${basedir}/base-viewer.min.js" fixlastline="yes" append="no"> <filelist dir="${basedir}" files=".tmp0.min.js"/> <filelist dir="${war.dir}/js/spin" files="spin.min.js"/> <filelist dir="${war.dir}/js/sanitizer" files="purify.min.js"/> <filelist dir="${war.dir}/js/deflate" files="pako.min.js"/> <filelist dir="${war.dir}/js/rough" files="rough.min.js"/> <filelist dir="${basedir}" files="client.min.js,.tmp1.js"/> </concat> <loadfile property="version" srcFile="../../VERSION"/> <replace file="${basedir}/base-viewer.min.js" token="@DRAWIO-VERSION@" value="${version}"/> <!-- Create viewer initialization code --> <echo file="${basedir}/.tmp2.js"> (function() { Editor.initMath(); if (window.onDrawioViewerLoad != null) { window.onDrawioViewerLoad(); } else { GraphViewer.processElements(); } })(); </echo> <jscomp warning="${jscomp.warning}" compilationLevel="simple" forceRecompile="true" debug="false" output="${basedir}/.tmp2.min.js"> <sources dir="${basedir}"> <file name=".tmp2.js"/> </sources> </jscomp> <!-- Step 8: Build viewer.min.js --> <concat destfile="${war.dir}/js/viewer.min.js" fixlastline="yes" append="no"> <filelist dir="${basedir}" files="base-viewer.min.js,.tmp2.min.js"/> </concat> <!-- Build viewer-static.min.js (with shapes and service worker) --> <echo file="${basedir}/.tmp3.js"> mxStencilRegistry.allowEval = false; (function() { try { if (Editor.enableServiceWorker) { navigator.serviceWorker.register('/service-worker.js'); } } catch (e) { if (window.console != null) { console.error(e); } } })(); </echo> <concat destfile="${war.dir}/js/viewer-static.min.js" fixlastline="yes" append="no"> <filelist dir="${basedir}" files="base-viewer.min.js"/> <filelist dir="${war.dir}/js" files="shapes-14-6-5.min.js"/> <filelist dir="${basedir}" files=".tmp3.js,.tmp2.min.js"/> </concat> <!-- Clean up viewer temp files --> <delete file="${war.dir}/js/extensions.min.js"/> <delete file="${basedir}/.tmp0.js"/> <delete file="${basedir}/.tmp0.min.js"/> <delete file="${basedir}/.tmp1.js"/> <delete file="${basedir}/.tmp2.js"/> <delete file="${basedir}/.tmp2.min.js"/> <delete file="${basedir}/.tmp3.js"/> <delete file="${basedir}/.tmp1.xml"/> <delete file="${basedir}/.tmp2.xml"/> <!-- Compile base.min.js components (for app) --> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/.tmp1.js"> <sources dir="${war.dir}/js/diagramly"> <file name="DrawioFile.js" /> <file name="LocalFile.js" /> <file name="LocalLibrary.js" /> <file name="StorageFile.js" /> <file name="StorageLibrary.js" /> <file name="RemoteFile.js" /> <file name="RemoteLibrary.js" /> <file name="UrlLibrary.js" /> <file name="EmbedFile.js" /> <file name="Dialogs.js" /> <file name="Editor.js" /> <file name="EditorUi.js" /> <file name="ConfigEditor.js" /> <file name="DiffSync.js" /> <file name="Settings.js" /> <file name="DrawioFilePolling.js" /> <file name="DrawioFileSync.js" /> <file name="App.js" /> <file name="Menus.js" /> <file name="Pages.js" /> <file name="Trees.js" /> <file name="Minimal.js" /> <file name="mxRuler.js" /> <file name="mxFreehand.js" /> <file name="DrawioUser.js" /> <file name="DrawioComment.js" /> </sources> <sources dir="${basedir}"> <file name="Graph-Stylesheet.js" /> </sources> <sources dir="${war.dir}/js/diagramly/gif"> <file name="GifEncoder.js" /> <file name="AnimatedExport.js" /> </sources> </jscomp> <!-- Build base.min.js (intermediate bundle) --> <concat destfile="${basedir}/base.min.js" fixlastline="yes" append="no"> <filelist dir="${war.dir}/js/spin" files="spin.min.js"/> <filelist dir="${war.dir}/js/sanitizer" files="purify.min.js"/> <filelist dir="${war.dir}/js/cryptojs" files="aes.min.js"/> <filelist dir="${war.dir}/js/deflate" files="pako.min.js"/> <filelist dir="${war.dir}/js/rough" files="rough.min.js"/> <filelist dir="${war.dir}/js/freehand" files="perfect-freehand.js"/> <filelist dir="${basedir}" files="client.min.js,grapheditor.min.js,sidebar.min.js,.tmp1.js"/> </concat> <replace file="${basedir}/base.min.js" token="@DRAWIO-VERSION@" value="${version}"/> <!-- Step 9: Build extensions.min.js (VSDX import, Mermaid, GraphML, OrgChart) --> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${war.dir}/js/extensions.min.js"> <sources dir="${war.dir}/js/diagramly"> <file name="Extensions.js" /> </sources> <sources dir="${war.dir}/js/diagramly/vsdx"> <file name="bmpDecoder.js" /> <file name="importer.js" /> </sources> <sources dir="${war.dir}/js/diagramly/emf"> <file name="emf-svg.js" /> </sources> <sources dir="${war.dir}/js/diagramly/graphml"> <file name="mxGraphMlCodec.js" /> </sources> <sources dir="${war.dir}/js/diagramly/miro"> <file name="MiroImporter.js" /> </sources> </jscomp> <!-- Build orgchart.min.js --> <delete file="${war.dir}/js/orgchart.min.js"/> <concat destfile="${war.dir}/js/orgchart.min.js" fixlastline="yes" append="no"> <filelist dir="${war.dir}/js/orgchart" files="bridge.min.js,bridge.collections.min.js,OrgChart.Layout.min.js"/> </concat> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/.tmp3.js"> <sources dir="${war.dir}/js/orgchart"> <file name="mxOrgChartLayout.js" /> </sources> </jscomp> <concat destfile="${war.dir}/js/orgchart.min.js" fixlastline="yes" append="yes"> <filelist dir="${basedir}" files=".tmp3.js"/> </concat> <delete file="${basedir}/.tmp3.js"/> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/.tmpelk.js"> <sources dir="${war.dir}/js/diagramly"> <file name="ElkLayout.js" /> </sources> </jscomp> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/.tmplibavoid.js"> <sources dir="${war.dir}/js/diagramly"> <file name="LibavoidRouting.js" /> </sources> </jscomp> <!-- Append vendor libraries to extensions.min.js. drawio-elk must come before drawio-mermaid so that window.ELK is defined when mermaid's layout bridge reads globalThis.ELK, and before the ElkLayout editor statics so they attach immediately. The libavoid files are concatenated raw in fixed order: the pure-JS bundle (self-contained/self-publishing — defines window.Avoid synchronously on load, like drawio-mermaid) → the shared routing core (defines AvoidRouting; canonical, vendored verbatim by drawio-mcp) → the Closure-compiled LibavoidRouting editor binding. --> <concat destfile="${war.dir}/js/extensions.min.js" fixlastline="yes" append="yes"> <fileset file="${war.dir}/js/jszip/jszip.min.js"/> <fileset file="${war.dir}/js/elk/drawio-elk.min.js"/> <filelist dir="${basedir}" files=".tmpelk.js"/> <fileset file="${war.dir}/js/mermaid/drawio-mermaid.min.js"/> <fileset file="${war.dir}/js/orgchart.min.js"/> <fileset file="${war.dir}/js/libavoid-js/libavoid.min.js"/> <fileset file="${war.dir}/js/libavoid-js/libavoid-routing.js"/> <filelist dir="${basedir}" files=".tmplibavoid.js"/> </concat> <delete file="${basedir}/.tmpelk.js"/> <delete file="${basedir}/.tmplibavoid.js"/> <delete file="${basedir}/.tmp1.js"/> <!-- Step 10: Compile full app with cloud integrations --> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/.tmp1.js"> <sources dir="${war.dir}/js/diagramly"> <file name="DrawioFile.js" /> <file name="LocalFile.js" /> <file name="LocalLibrary.js" /> <file name="StorageFile.js" /> <file name="StorageLibrary.js" /> <file name="RemoteFile.js" /> <file name="RemoteLibrary.js" /> <file name="UrlLibrary.js" /> <file name="EmbedFile.js" /> <file name="Dialogs.js" /> <file name="Editor.js" /> <file name="EditorUi.js" /> <file name="ConfigEditor.js" /> <file name="DiffSync.js" /> <file name="Settings.js" /> <file name="DrawioFilePolling.js" /> <file name="DrawioFileSync.js" /> </sources> <sources dir="${basedir}"> <file name="Graph-Stylesheet.js" /> </sources> <sources dir="${war.dir}/js/diagramly/util"> <file name="mxAsyncCanvas.js" /> <file name="mxJsCanvas.js" /> </sources> <sources dir="${war.dir}/js/diagramly/gif"> <file name="GifEncoder.js" /> <file name="AnimatedExport.js" /> </sources> <!-- Cloud storage integrations --> <sources dir="${war.dir}/js/diagramly"> <file name="DrawioClient.js" /> <file name="DrawioUser.js" /> <file name="DriveFile.js" /> <file name="DriveLibrary.js" /> <file name="DriveClient.js" /> <file name="DropboxFile.js" /> <file name="DropboxLibrary.js" /> <file name="DropboxClient.js" /> <file name="OneDriveFile.js" /> <file name="OneDriveLibrary.js" /> <file name="OneDriveClient.js" /> <file name="GitHubFile.js" /> <file name="GitHubLibrary.js" /> <file name="GitHubClient.js" /> <file name="TrelloFile.js" /> <file name="TrelloLibrary.js" /> <file name="TrelloClient.js" /> <file name="GitLabFile.js" /> <file name="GitLabLibrary.js" /> <file name="GitLabClient.js" /> <file name="DrawioComment.js" /> <file name="DriveComment.js" /> </sources> <sources dir="${war.dir}/js/onedrive"> <file name="mxODPicker.js" /> </sources> <sources dir="${war.dir}/js/diagramly"> <file name="App.js" /> <file name="Menus.js" /> <file name="Pages.js" /> <file name="Trees.js" /> <file name="Minimal.js" /> <file name="mxRuler.js" /> <file name="mxFreehand.js" /> <file name="P2PCollab.js" /> <file name="Simple.js" /> </sources> </jscomp> <!-- Build final app.min.js --> <concat destfile="${war.dir}/js/app.min.js" fixlastline="yes" append="no"> <filelist dir="${war.dir}/js/spin" files="spin.min.js"/> <filelist dir="${war.dir}/js/sanitizer" files="purify.min.js"/> <filelist dir="${war.dir}/js/cryptojs" files="aes.min.js"/> <filelist dir="${war.dir}/js/deflate" files="pako.min.js"/> <filelist dir="${war.dir}/js/rough" files="rough.min.js"/> <filelist dir="${war.dir}/js/freehand" files="perfect-freehand.js"/> <filelist dir="${basedir}" files="client.min.js,grapheditor.min.js,sidebar.min.js,.tmp1.js"/> </concat> <replace file="${war.dir}/js/app.min.js" token="@DRAWIO-VERSION@" value="${version}"/> <!-- Final cleanup --> <delete file="${basedir}/Graph-Stylesheet.js"/> <delete file="${basedir}/Graph-Resources.js"/> <delete file="${basedir}/grapheditor.min.js"/> <delete file="${basedir}/sidebar.min.js"/> <delete file="${basedir}/client.min.js"/> <delete file="${basedir}/.tmp1.js"/> </target> <!-- ============================================================================ TARGET: atlas (depends on app) ============================================================================ Builds Atlassian (Confluence/Jira) integration bundles. PROCESS: 1. Creates atlas-viewer.min.js = base-viewer + orgchart 2. Compiles mxReader.js for Atlassian connect 3. Creates atlas.min.js = base + extensions + mxReader OUTPUTS: - js/atlas-viewer.min.js : Viewer for Atlassian - js/atlas.min.js : Full editor for Atlassian ============================================================================ --> <target name="atlas" depends="app"> <concat destfile="${war.dir}/js/atlas-viewer.min.js" fixlastline="yes" append="no"> <file name="${basedir}/base-viewer.min.js" /> <file name="${war.dir}/js/orgchart.min.js" /> </concat> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/.tmp0.js"> <sources dir="${war.dir}/connect/common/js"> <file name="mxReader.js" /> </sources> </jscomp> <concat destfile="${war.dir}/js/atlas.min.js" fixlastline="yes" append="no"> <file name="${basedir}/base.min.js" /> <file name="${war.dir}/js/extensions.min.js" /> <file name="${basedir}/.tmp0.js" /> </concat> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/.tmp-simple.js"> <sources dir="${war.dir}/js/diagramly"> <file name="Simple.js" /> </sources> </jscomp> <concat destfile="${war.dir}/js/atlas.min.js" fixlastline="yes" append="yes"> <file name="${basedir}/.tmp-simple.js" /> </concat> <delete file="${basedir}/.tmp-simple.js"/> <delete file="${basedir}/.tmp0.js"/> </target> <!-- ============================================================================ TARGET: integrate (depends on atlas) ============================================================================ Builds the integration bundle for third-party embedding. PROCESS: 1. Copies atlas.min.js as base 2. Compiles Integrate.js wrapper 3. Appends shapes, stencils, and integration code OUTPUTS: - js/integrate.min.js : Self-contained embedding bundle ============================================================================ --> <target name="integrate" depends="atlas"> <copy file="${war.dir}/js/atlas.min.js" tofile="${war.dir}/js/integrate.min.js" overwrite="true"/> <jscomp warning="${jscomp.warning}" compilationLevel="simple" debug="false" forceRecompile="true" output="${basedir}/.tmp0.js"> <sources dir="${basedir}/../integrate"> <file name="Integrate.js" /> </sources> </jscomp> <concat destfile="${war.dir}/js/integrate.min.js" fixlastline="yes" append="yes"> <file name="${war.dir}/js/shapes-14-6-5.min.js" /> <file name="${war.dir}/js/stencils.min.js" /> <file name="${basedir}/.tmp0.js" /> </concat> <delete file="${basedir}/.tmp0.js"/> </target> <!-- ============================================================================ TARGET: all (default) - depends on integrate ============================================================================ Runs the complete build pipeline. DEPENDENCY CHAIN: merge -> app -> atlas -> integrate -> all FINAL CLEANUP: - Removes intermediate atlas files ============================================================================ --> <target name="all" depends="integrate"> <delete file="${war.dir}/js/atlas-viewer.min.js"/> <delete file="${war.dir}/js/atlas.min.js"/> </target> <!-- ====================================================================== JAVA COMPILATION & WAR PACKAGING ====================================================================== --> <path id="javac.class.path"> <fileset dir="${war.dir}/WEB-INF/lib" /> </path> <!-- ============================================================================ TARGET: javac ============================================================================ Compiles Java servlet classes. OUTPUTS: - Compiled .class files in ${javac.dir} ============================================================================ --> <target name="javac" description="Java compilation"> <mkdir dir="${javac.dir}"/> <javac includeantruntime="false" srcdir="${src.dir}" destdir="${javac.dir}"> <classpath refid="javac.class.path" /> </javac> <copy todir="${javac.dir}" file="${src.dir}/log4j.properties" /> </target> <!-- ============================================================================ TARGET: clean ============================================================================ Removes all build artifacts. ============================================================================ --> <target name="clean" description="Cleans build directories"> <delete dir="${javac.dir}"/> <delete dir="${build.dir}"/> <delete file="${basedir}/base.min.js"/> <delete file="${basedir}/base-viewer.min.js"/> </target> <!-- ============================================================================ TARGET: war (depends on app, javac) ============================================================================ Creates a deployable WAR file. OUTPUTS: - ${build.dir}/${war.name} : WAR archive ============================================================================ --> <target name="war" depends="app, javac" description="Create the stand-alone war file"> <zip destfile="${build.dir}/${war.name}" basedir="${war.dir}" > </zip> </target> </project>