├── .editorconfig ├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── CHANGELOG.md ├── CNAME ├── LICENSE ├── README.md ├── eslint.config.js ├── images └── screenshot.png ├── package-lock.json ├── package.json ├── postcss.config.cjs ├── scripts └── load_templates.js ├── src ├── index.html ├── index.js ├── main.css ├── monaco │ └── configure-yaml.js ├── sharing │ └── encoding.js ├── storage │ └── storage.js ├── templates │ ├── examples.js │ ├── parsing-error.js │ ├── render.js │ └── templates.js ├── ui │ └── elements │ │ ├── editor-element.js │ │ ├── error-list-element.js │ │ ├── nav-element.js │ │ └── preview-pane-element.js └── workers │ ├── editor.worker.js │ ├── monaco.workers.js │ ├── parser.worker.js │ └── yaml.worker.js └── tailwind.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 2 7 | indent_style = tab 8 | insert_final_newline = true 9 | tab_width = 2 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main # Change this to the branch you want to trigger the workflow on 7 | 8 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 9 | permissions: 10 | contents: read 11 | pages: write 12 | id-token: write 13 | 14 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 15 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 16 | concurrency: 17 | group: "pages" 18 | cancel-in-progress: false 19 | 20 | 21 | jobs: 22 | build: 23 | environment: 24 | name: github-pages 25 | url: ${{ steps.deployment.outputs.page_url }} 26 | runs-on: ubuntu-latest 27 | 28 | steps: 29 | - name: Checkout repository 30 | uses: actions/checkout@v4 31 | 32 | - name: Setup Node.js 33 | uses: actions/setup-node@v4 34 | with: 35 | node-version: 20 # You can specify the Node.js version here 36 | 37 | - name: Install dependencies 38 | run: npm install 39 | 40 | - name: Fetch, process and precompile HTML templates 41 | run: npm run update-templates 42 | 43 | - name: Build project 44 | run: npm run build 45 | 46 | - name: Copy images 47 | run: cp -r images dist 48 | 49 | - name: Setup Pages 50 | uses: actions/configure-pages@v5 51 | - name: Upload artifact 52 | uses: actions/upload-pages-artifact@v3 53 | with: 54 | # Upload entire repository 55 | path: 'dist' 56 | - name: Deploy to GitHub Pages 57 | id: deployment 58 | uses: actions/deploy-pages@v4 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | # local templates 27 | /templates 28 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## 2024-07-19 4 | 5 | - Better sharing support. When clicking "File -> Share", the Data Contract creates a shareable URL with the Data Contract YAML encoded in the URL. Previously, we only used base64 encoding, but it turned out that may lead to some URLs that are too long. To solve this, we gzip before encoding with base64. This allows for much large data contracts to be shared. 6 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | editor.datacontract.com 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 innoQ Deutschland GmbH 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | 24 | Open Source Licenses for Dependencies 25 | 26 | This project utilizes the following open-source libraries, each of which has its own respective license: 27 | 28 | 1. github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 29 | License: MIT License 30 | License URL: https://github.com/pkg/browser/blob/main/LICENSE 31 | 32 | 2. github.com/qri-io/jsonschema v0.2.1 33 | License: MIT License 34 | License URL: https://github.com/qri-io/jsonschema/blob/main/LICENSE 35 | 36 | 3. github.com/urfave/cli/v2 v2.25.7 37 | License: MIT License 38 | License URL: https://github.com/urfave/cli/blob/v2.25.7/LICENSE 39 | 40 | 4. gopkg.in/yaml.v3 v3.0.1 41 | License: Apache License 2.0 42 | License URL: https://gopkg.in/yaml.v3/blob/v3.0.1/LICENSE 43 | 44 | Please review and comply with the terms and conditions of each respective license when using this software. 45 | 46 | The complete text of each license can be found in the provided License URLs. Ensure that you adhere to the terms and obligations outlined in these licenses when using the dependencies in your project. 47 | 48 | It is your responsibility to understand and comply with the licensing terms of these dependencies as specified by the respective licenses. 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Data Contract Editor 2 | 3 | The [Data Contract Editor](https://editor.datacontract.com) is like VS Code, but for [data contracts](https://datacontract.com). It's enterprise-friendly as it stores your data contracts in your browser. 4 | 5 | **Features** 6 | 7 | - ✅ Syntax highlighting 8 | - ✅ Code completion 9 | - ✅ Error checking 10 | - ✅ Privacy-friendly (no data leaves your browser) 11 | - ✅ Live HTML preview 12 | - ✅ Share data contracts via URLs 13 | 14 | Try it out at [editor.datacontract.com](https://editor.datacontract.com). And if you like it, please star the repository. 15 | 16 | ![Data Contract Editor](images/screenshot.png) 17 | 18 | ## Development Setup 19 | 20 | ```bash 21 | # run locally 22 | npm install 23 | npm run precompile # optional, only needed if you change the templates 24 | npm run dev 25 | ``` 26 | 27 | ```bash 28 | # build for production 29 | npm install 30 | npm run precompile 31 | npm run build 32 | # deploy dist folder 33 | ``` 34 | 35 | ## How to update the templates 36 | 37 | Templates are taken from the Data Contract CLI and are fetched directly from the repository. 38 | If you want to update them locally run `npm run update-templates`, which will also be automatically run in the build. 39 | 40 | Optionally, you can specify a location to the templates folder of a local datacontract-cli repository (or any other location). 41 | Combined with `npm run dev`, the templates will be live reloaded. 42 | 43 | ``` 44 | npm run update-templates --datacontract-template-source="/my/path/to/datacontract-cli/datacontract/templates/" 45 | ``` 46 | 47 | ## License 48 | 49 | [MIT](LICENSE) 50 | 51 | ## Credits 52 | 53 | Created by [Dr. Simon Harrer](https://www.linkedin.com/in/simonharrer/) and [Jochen Christ](https://www.linkedin.com/in/jochenchrist/). 54 | 55 | Supported by [INNOQ](https://www.innoq.com). 56 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import pluginJs from "@eslint/js"; 2 | import globals from "globals"; 3 | 4 | export default [ 5 | { 6 | ignores: ["**/templates.js", "**/*.config.[c]js"], 7 | }, 8 | { 9 | name: "project-options", 10 | languageOptions: { 11 | globals: globals.browser 12 | }, 13 | files: ["src/**/*.js"], 14 | }, 15 | pluginJs.configs.recommended, 16 | ]; -------------------------------------------------------------------------------- /images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacontract/datacontract-editor/7fa98cbf69c0ccabc802c75be1db728620bbceb7/images/screenshot.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "datacontract-editor", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite src", 8 | "build": "vite build src --outDir ../dist --emptyOutDir", 9 | "update-templates": "npm run load-templates %npm_config_datacontract-template-source% && npm run precompile-templates", 10 | "load-templates": "node scripts/load_templates.js %npm_config_datacontract-template-source%", 11 | "precompile-templates": "node_modules/nunjucks/bin/precompile templates > src/templates/templates.js", 12 | "lint": "eslint" 13 | }, 14 | "dependencies": { 15 | "js-yaml": "^4.1.0", 16 | "lit": "^3.1.4", 17 | "monaco-editor": "0.49.0", 18 | "monaco-yaml": "5.1.1", 19 | "nunjucks": "^3.2.4", 20 | "split-grid": "^1.0.11" 21 | }, 22 | "devDependencies": { 23 | "@eslint/js": "9.4.0", 24 | "autoprefixer": "^10.4.19", 25 | "css-loader": "^6.0.0", 26 | "eslint": "9.4.0", 27 | "globals": "15.4.0", 28 | "postcss": "^8.4.38", 29 | "tailwindcss": "^3.4.4", 30 | "vite": "^5.2.13" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | } 6 | } -------------------------------------------------------------------------------- /scripts/load_templates.js: -------------------------------------------------------------------------------- 1 | import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs'; 2 | 3 | /** Utility functions */ 4 | 5 | async function loadTemplate(sub_path) { 6 | // eslint-disable-next-line no-undef 7 | let base_path = process.env['npm_config_datacontract_template_source'] || 'https://raw.githubusercontent.com/datacontract/datacontract-cli/main/datacontract/templates/'; 8 | let path = base_path + sub_path; 9 | if (path.startsWith('http')) { 10 | // eslint-disable-next-line no-undef 11 | return await (await fetch(path)).text(); 12 | } 13 | return readFileSync(path) + ''; 14 | } 15 | 16 | // handle the replacement of all Python constructs into the JS equivalent 17 | function updateTemplateCode(template) { 18 | const updated_template = template 19 | .replace(/\.items\(\)/gm, '') 20 | .replace(/True/gm, 'true') 21 | .replace(/False/gm, 'false') 22 | .replace(/\.ref/gm, '.$ref') 23 | .replace(/cli\.datacontract\.com/gm, 'editor.datacontract.com') 24 | .replace(/Data Contract CLI/gm, 'Data Contract Editor'); 25 | return updated_template; 26 | } 27 | 28 | // write the file to disk 29 | function storeTemplate(path, content) { 30 | writeFileSync(path, content, { encoding: 'utf-8' }); 31 | } 32 | 33 | // download and process a partial 34 | async function processPartial(partial_name) { 35 | const template = await loadTemplate(partial_name); 36 | const processed_template = updateTemplateCode(template); 37 | return processed_template; 38 | } 39 | 40 | /** Main loop */ 41 | 42 | // fetch the main template, all other work is based on that 43 | const full_main_template = await loadTemplate('datacontract.html'); 44 | // const full_main_template = await raw_template.text(); 45 | // cut out the relevant part of the template (which is inside the
element) 46 | // note: this is a bit crude, but since this is a template we can't parse it as HTML 47 | const main_template = full_main_template.match(/
.*<\/main>/s)[0]; 48 | 49 | // find all the render partial calls in there, to know what other templates we need to load 50 | const partial_regex = /partial\('([\w/.]+)'/g; 51 | // the result of our capturing group is in the second element of the result array 52 | const partials = Array.from(main_template.matchAll(partial_regex), (m) => m[1]); 53 | 54 | // ensure we have an output directory 55 | if (!existsSync('templates/partials')) { 56 | mkdirSync('templates/partials', { recursive: true }); 57 | } 58 | 59 | // do the main template 60 | const updated_main_template = updateTemplateCode(main_template); 61 | storeTemplate('templates/datacontract.html', updated_main_template); 62 | 63 | // and all the partials we've found 64 | partials.forEach(async (p) => { 65 | const updated_partial = await processPartial(p); 66 | storeTemplate(`templates/${p}`, updated_partial); 67 | }) 68 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Data Contract Editor 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
31 |
32 | 33 | 34 |
35 |
36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import Split from 'split-grid'; 2 | 3 | // Setup Editor Infrastructure 4 | import './monaco/configure-yaml.js'; 5 | import './workers/monaco.workers.js'; 6 | import {setupMonacoYaml} from "./monaco/configure-yaml.js"; 7 | 8 | setupMonacoYaml(); 9 | 10 | // Init the movable split 11 | Split({ 12 | snapOffset: 0, 13 | columnGutters: [{ 14 | track: 1, 15 | element: document.querySelector('.gutter-col'), 16 | }], 17 | }) 18 | 19 | // Wire Editor Events to the other elements 20 | const editor = document.querySelector('dce-editor'); 21 | const errorList = document.querySelector('dce-error-list'); 22 | const previewPane = document.querySelector('dce-preview-pane'); 23 | 24 | // wire error list to error events 25 | editor.addEventListener('editor-errors', (e) => { 26 | const errors = e.detail.validationErrors; 27 | errorList.errors = errors; 28 | }); 29 | 30 | // wire preview pane to editor content changes 31 | editor.addEventListener('editor-content-changed', (e) => { 32 | const document = e.detail.content; 33 | previewPane.document = document; 34 | }); 35 | -------------------------------------------------------------------------------- /src/main.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | .grid-container { 6 | display: grid; 7 | grid-template-columns: 1fr 10px 1fr; 8 | grid-template-rows: auto 1fr; 9 | height: 100vh; 10 | max-height: 100vh; 11 | } 12 | 13 | dce-nav { 14 | grid-column: 1/-1; 15 | } 16 | 17 | main { 18 | height: 100%; 19 | } 20 | 21 | .gutter-col { 22 | grid-row: 2; 23 | grid-column: 2; 24 | cursor: col-resize; 25 | } 26 | -------------------------------------------------------------------------------- /src/monaco/configure-yaml.js: -------------------------------------------------------------------------------- 1 | import * as monaco from 'monaco-editor'; 2 | import { configureMonacoYaml } from 'monaco-yaml'; 3 | 4 | export function setupMonacoYaml() { 5 | configureMonacoYaml(monaco, { 6 | enableSchemaRequest: true, 7 | schemas: [ 8 | { 9 | // If YAML file is opened matching this glob 10 | fileMatch: ['**/datacontract.yaml'], 11 | // And the following URI will be linked to as the source. 12 | uri: 'https://datacontract.com/datacontract.schema.json' 13 | }, 14 | { 15 | // If YAML file is opened matching this glob 16 | fileMatch: ['**/definition.yaml'], 17 | // And the following URI will be linked to as the source. 18 | uri: 'https://datacontract.com/definition.schema.json' 19 | }, 20 | { 21 | // If YAML file is opened matching this glob 22 | fileMatch: ['**/dataproduct.yaml'], 23 | // And the following URI will be linked to as the source. 24 | uri: 'https://dataproduct-specification.com/dataproduct.schema.json' 25 | } 26 | ] 27 | }) 28 | } -------------------------------------------------------------------------------- /src/sharing/encoding.js: -------------------------------------------------------------------------------- 1 | /* encoded = encodebase64(gzip(yaml)) */ 2 | export async function encodeYamlCode(yamlCode) { 3 | const compressed = await gzip(yamlCode); 4 | return window.btoa(String.fromCharCode(...new Uint8Array(compressed))); 5 | } 6 | 7 | /* decoded = gunzip(decodebase64(queryparameter)) */ 8 | export async function decodeQueryParameter(queryParameter) { 9 | const compressed = Uint8Array.from(window.atob(queryParameter), c => c.charCodeAt(0)); 10 | const decompressed = await gunzip(compressed); 11 | const decoder = new TextDecoder(); 12 | return decoder.decode(decompressed) 13 | } 14 | 15 | async function gzip(input) { 16 | const encoder = new TextEncoder(); 17 | const data = encoder.encode(input); 18 | 19 | const stream = new CompressionStream('gzip'); 20 | const writer = stream.writable.getWriter(); 21 | writer.write(data); 22 | writer.close(); 23 | 24 | const compressedStream = stream.readable; 25 | const reader = compressedStream.getReader(); 26 | 27 | let chunks = []; 28 | let done = false; 29 | 30 | while (!done) { 31 | const { value, done: doneReading } = await reader.read(); 32 | if (value) { 33 | chunks.push(value); 34 | } 35 | done = doneReading; 36 | } 37 | 38 | let size = 0; 39 | chunks.forEach(chunk => size += chunk.length); 40 | 41 | let compressed = new Uint8Array(size); 42 | let offset = 0; 43 | chunks.forEach(chunk => { 44 | compressed.set(chunk, offset); 45 | offset += chunk.length; 46 | }); 47 | 48 | return compressed; 49 | } 50 | 51 | async function gunzip(data) { 52 | const stream = new DecompressionStream('gzip'); 53 | const writer = stream.writable.getWriter(); 54 | writer.write(data); 55 | writer.close(); 56 | 57 | const decompressedStream = stream.readable; 58 | const reader = decompressedStream.getReader(); 59 | 60 | let chunks = []; 61 | let done = false; 62 | 63 | while (!done) { 64 | const { value, done: doneReading } = await reader.read(); 65 | if (value) { 66 | chunks.push(value); 67 | } 68 | done = doneReading; 69 | } 70 | 71 | let size = 0; 72 | chunks.forEach(chunk => size += chunk.length); 73 | 74 | let decompressed = new Uint8Array(size); 75 | let offset = 0; 76 | chunks.forEach(chunk => { 77 | decompressed.set(chunk, offset); 78 | offset += chunk.length; 79 | }); 80 | 81 | return decompressed; 82 | } 83 | -------------------------------------------------------------------------------- /src/storage/storage.js: -------------------------------------------------------------------------------- 1 | import { getExample } from "../templates/examples.js"; 2 | import {decodeQueryParameter} from "../sharing/encoding.js"; 3 | 4 | 5 | function loadDataContractYaml() { 6 | return localStorage.getItem("dataContractYaml"); 7 | } 8 | 9 | function isFirstLoadOfDataContractEditor() { 10 | return localStorage.getItem("dataContractYamlUpdated") === null; 11 | } 12 | 13 | export function storeDataContractYaml(yaml) { 14 | localStorage.setItem("dataContractYaml", yaml); 15 | localStorage.setItem("dataContractYamlUpdated", new Date().toISOString()); 16 | } 17 | 18 | export function loadInitialDocument() { 19 | const queryString = window.location.search; 20 | const urlParams = new URLSearchParams(queryString); 21 | if (urlParams.has("dc")) { 22 | decodeQueryParameter(urlParams.get("dc")).then(value => { 23 | storeDataContractYaml(value); 24 | window.location.search = ""; 25 | }); 26 | } 27 | if (isFirstLoadOfDataContractEditor()) { 28 | storeDataContractYaml(getExample()); 29 | } 30 | return loadDataContractYaml(); 31 | } 32 | -------------------------------------------------------------------------------- /src/templates/examples.js: -------------------------------------------------------------------------------- 1 | export function getMinimal() { 2 | return `dataContractSpecification: 0.9.3 3 | id: my-data-contract-id 4 | info: 5 | title: My Data Contract 6 | version: 0.0.1 7 | `; 8 | } 9 | 10 | export function getExample() { 11 | return `dataContractSpecification: 0.9.3 12 | id: urn:datacontract:checkout:orders-latest 13 | info: 14 | title: Orders Latest 15 | version: 1.0.0 16 | description: | 17 | Successful customer orders in the webshop. 18 | All orders since 2020-01-01. 19 | Orders with their line items are in their current state (no history included). 20 | owner: Checkout Team 21 | contact: 22 | name: John Doe (Data Product Owner) 23 | url: https://teams.microsoft.com/l/channel/example/checkout 24 | servers: 25 | production: 26 | type: s3 27 | location: s3://datacontract-example-orders-latest/data/{model}/*.json 28 | format: json 29 | delimiter: new_line 30 | terms: 31 | usage: | 32 | Data can be used for reports, analytics and machine learning use cases. 33 | Order may be linked and joined by other tables 34 | limitations: | 35 | Not suitable for real-time use cases. 36 | Data may not be used to identify individual customers. 37 | Max data processing per day: 10 TiB 38 | billing: 5000 USD per month 39 | noticePeriod: P3M 40 | models: 41 | orders: 42 | description: One record per order. Includes cancelled and deleted orders. 43 | type: table 44 | fields: 45 | order_id: 46 | $ref: '#/definitions/order_id' 47 | required: true 48 | unique: true 49 | primary: true 50 | order_timestamp: 51 | description: The business timestamp in UTC when the order was successfully registered in the source system and the payment was successful. 52 | type: timestamp 53 | required: true 54 | example: "2024-09-09T08:30:00Z" 55 | order_total: 56 | description: Total amount the smallest monetary unit (e.g., cents). 57 | type: long 58 | required: true 59 | example: "9999" 60 | customer_id: 61 | description: Unique identifier for the customer. 62 | type: text 63 | minLength: 10 64 | maxLength: 20 65 | customer_email_address: 66 | description: The email address, as entered by the customer. The email address was not verified. 67 | type: text 68 | format: email 69 | required: true 70 | pii: true 71 | classification: sensitive 72 | processed_timestamp: 73 | description: The timestamp when the record was processed by the data platform. 74 | type: timestamp 75 | required: true 76 | config: 77 | jsonType: string 78 | jsonFormat: date-time 79 | line_items: 80 | description: A single article that is part of an order. 81 | type: table 82 | fields: 83 | lines_item_id: 84 | type: text 85 | description: Primary key of the lines_item_id table 86 | required: true 87 | unique: true 88 | primary: true 89 | order_id: 90 | $ref: '#/definitions/order_id' 91 | references: orders.order_id 92 | sku: 93 | description: The purchased article number 94 | $ref: '#/definitions/sku' 95 | definitions: 96 | order_id: 97 | domain: checkout 98 | name: order_id 99 | title: Order ID 100 | type: text 101 | format: uuid 102 | description: An internal ID that identifies an order in the online shop. 103 | example: 243c25e5-a081-43a9-aeab-6d5d5b6cb5e2 104 | pii: true 105 | classification: restricted 106 | sku: 107 | domain: inventory 108 | name: sku 109 | title: Stock Keeping Unit 110 | type: text 111 | pattern: ^[A-Za-z0-9]{8,14}$ 112 | example: "96385074" 113 | description: | 114 | A Stock Keeping Unit (SKU) is an internal unique identifier for an article. 115 | It is typically associated with an article's barcode, such as the EAN/GTIN. 116 | examples: 117 | - type: csv # csv, json, yaml, custom 118 | model: orders 119 | description: An example list of order records. 120 | data: | # expressed as string or inline yaml or via "$ref: data.csv" 121 | order_id,order_timestamp,order_total,customer_id,customer_email_address,processed_timestamp 122 | "1001","2030-09-09T08:30:00Z",2500,"1000000001","mary.taylor82@example.com","2030-09-09T08:31:00Z" 123 | "1002","2030-09-08T15:45:00Z",1800,"1000000002","michael.miller83@example.com","2030-09-09T08:31:00Z" 124 | "1003","2030-09-07T12:15:00Z",3200,"1000000003","michael.smith5@example.com","2030-09-09T08:31:00Z" 125 | "1004","2030-09-06T19:20:00Z",1500,"1000000004","elizabeth.moore80@example.com","2030-09-09T08:31:00Z" 126 | "1005","2030-09-05T10:10:00Z",4200,"1000000004","elizabeth.moore80@example.com","2030-09-09T08:31:00Z" 127 | "1006","2030-09-04T14:55:00Z",2800,"1000000005","john.davis28@example.com","2030-09-09T08:31:00Z" 128 | "1007","2030-09-03T21:05:00Z",1900,"1000000006","linda.brown67@example.com","2030-09-09T08:31:00Z" 129 | "1008","2030-09-02T17:40:00Z",3600,"1000000007","patricia.smith40@example.com","2030-09-09T08:31:00Z" 130 | "1009","2030-09-01T09:25:00Z",3100,"1000000008","linda.wilson43@example.com","2030-09-09T08:31:00Z" 131 | "1010","2030-08-31T22:50:00Z",2700,"1000000009","mary.smith98@example.com","2030-09-09T08:31:00Z" 132 | - type: csv 133 | model: line_items 134 | description: An example list of line items. 135 | data: | 136 | lines_item_id,order_id,sku 137 | "LI-1","1001","5901234123457" 138 | "LI-2","1001","4001234567890" 139 | "LI-3","1002","5901234123457" 140 | "LI-4","1002","2001234567893" 141 | "LI-5","1003","4001234567890" 142 | "LI-6","1003","5001234567892" 143 | "LI-7","1004","5901234123457" 144 | "LI-8","1005","2001234567893" 145 | "LI-9","1005","5001234567892" 146 | "LI-10","1005","6001234567891" 147 | servicelevels: 148 | availability: 149 | description: The server is available during support hours 150 | percentage: 99.9% 151 | retention: 152 | description: Data is retained for one year 153 | period: P1Y 154 | unlimited: false 155 | latency: 156 | description: Data is available within 25 hours after the order was placed 157 | threshold: 25h 158 | sourceTimestampField: orders.order_timestamp 159 | processedTimestampField: orders.processed_timestamp 160 | freshness: 161 | description: The age of the youngest row in a table. 162 | threshold: 25h 163 | timestampField: orders.order_timestamp 164 | frequency: 165 | description: Data is delivered once a day 166 | type: batch # or streaming 167 | interval: daily # for batch, either or cron 168 | cron: 0 0 * * * # for batch, either or interval 169 | support: 170 | description: The data is available during typical business hours at headquarters 171 | time: 9am to 5pm in EST on business days 172 | responseTime: 1h 173 | backup: 174 | description: Data is backed up once a week, every Sunday at 0:00 UTC. 175 | interval: weekly 176 | cron: 0 0 * * 0 177 | recoveryTime: 24 hours 178 | recoveryPoint: 1 week 179 | quality: 180 | type: SodaCL # data quality check format: SodaCL, montecarlo, custom 181 | specification: # expressed as string or inline yaml or via "$ref: checks.yaml" 182 | checks for orders: 183 | - row_count >= 5 184 | - duplicate_count(order_id) = 0 185 | checks for line_items: 186 | - values in (order_id) must exist in orders (order_id) 187 | - row_count >= 5 188 | `; 189 | } 190 | -------------------------------------------------------------------------------- /src/templates/parsing-error.js: -------------------------------------------------------------------------------- 1 | export function renderParsingError(message) { 2 | return ` 3 |
4 |
5 |
6 | 9 |
10 |
11 |

YAML parsing failed

12 |
13 |
    14 |
  • ${message}
  • 15 |
16 |
17 |
18 |
19 |
` 20 | } 21 | -------------------------------------------------------------------------------- /src/templates/render.js: -------------------------------------------------------------------------------- 1 | import nunjucks from "nunjucks"; 2 | import { version } from '../../package.json'; 3 | 4 | import './templates.js'; 5 | 6 | /* 7 | * Rendering with nunjucks. 8 | * Requires "npm run precompile" to have the templates available 9 | */ 10 | 11 | const env = nunjucks.configure('templates', {autoescape: false}); 12 | env.addGlobal('render_partial', function (partialName, context) { 13 | return nunjucks.render(partialName, context); 14 | }); 15 | env.addGlobal('range', function (from, to) { 16 | return [...Array(to).keys()].map(i => i + from) 17 | }); 18 | 19 | export function renderDataContract(dataContract) { 20 | const local_date = new Date().toLocaleDateString(); 21 | return nunjucks.render("datacontract.html", { datacontract: dataContract, formatted_date: local_date, datacontract_cli_version: version }); 22 | } 23 | -------------------------------------------------------------------------------- /src/templates/templates.js: -------------------------------------------------------------------------------- 1 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["datacontract.html"] = (function() { 2 | function root(env, context, frame, runtime, cb) { 3 | var lineno = 0; 4 | var colno = 0; 5 | var output = ""; 6 | try { 7 | var parentTemplate = null; 8 | output += "
\n\n
\n
\n
\n
\n

\n Data Contract

\n
\n "; 9 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"id"), env.opts.autoescape); 10 | output += "\n
\n
\n "; 11 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"tags")) { 12 | output += "\n
\n \n \n \n \n "; 13 | frame = frame.push(); 14 | var t_3 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"tags"); 15 | if(t_3) {t_3 = runtime.fromIterator(t_3); 16 | var t_2 = t_3.length; 17 | for(var t_1=0; t_1 < t_3.length; t_1++) { 18 | var t_4 = t_3[t_1]; 19 | frame.set("tag", t_4); 20 | frame.set("loop.index", t_1 + 1); 21 | frame.set("loop.index0", t_1); 22 | frame.set("loop.revindex", t_2 - t_1); 23 | frame.set("loop.revindex0", t_2 - t_1 - 1); 24 | frame.set("loop.first", t_1 === 0); 25 | frame.set("loop.last", t_1 === t_2 - 1); 26 | frame.set("loop.length", t_2); 27 | output += "\n \n "; 28 | output += runtime.suppressValue(t_4, env.opts.autoescape); 29 | output += "\n \n "; 30 | ; 31 | } 32 | } 33 | frame = frame.pop(); 34 | output += "\n
\n "; 35 | ; 36 | } 37 | output += "\n
\n
\n
\n \n \n \n \n Show YAML\n \n
\n
\n
\n\n
\n
\n
\n "; 38 | output += runtime.suppressValue((lineno = 44, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/datacontract_information.html",runtime.makeKeywordArgs({"datacontract": runtime.contextOrFrameLookup(context, frame, "datacontract")})])), env.opts.autoescape); 39 | output += "\n
\n\n\n "; 40 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servers")) { 41 | output += "\n
\n
\n

Servers

\n

Servers of the data contract

\n
\n\n
    \n\n "; 42 | frame = frame.push(); 43 | var t_7 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servers"); 44 | if(t_7) {t_7 = runtime.fromIterator(t_7); 45 | var t_5; 46 | if(runtime.isArray(t_7)) { 47 | var t_6 = t_7.length; 48 | for(t_5=0; t_5 < t_7.length; t_5++) { 49 | var t_8 = t_7[t_5][0]; 50 | frame.set("[object Object]", t_7[t_5][0]); 51 | var t_9 = t_7[t_5][1]; 52 | frame.set("[object Object]", t_7[t_5][1]); 53 | frame.set("loop.index", t_5 + 1); 54 | frame.set("loop.index0", t_5); 55 | frame.set("loop.revindex", t_6 - t_5); 56 | frame.set("loop.revindex0", t_6 - t_5 - 1); 57 | frame.set("loop.first", t_5 === 0); 58 | frame.set("loop.last", t_5 === t_6 - 1); 59 | frame.set("loop.length", t_6); 60 | output += "\n "; 61 | output += runtime.suppressValue((lineno = 58, colno = 33, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/server.html",runtime.makeKeywordArgs({"server_name": t_8,"server": t_9})])), env.opts.autoescape); 62 | output += "\n "; 63 | ; 64 | } 65 | } else { 66 | t_5 = -1; 67 | var t_6 = runtime.keys(t_7).length; 68 | for(var t_10 in t_7) { 69 | t_5++; 70 | var t_11 = t_7[t_10]; 71 | frame.set("server_name", t_10); 72 | frame.set("server", t_11); 73 | frame.set("loop.index", t_5 + 1); 74 | frame.set("loop.index0", t_5); 75 | frame.set("loop.revindex", t_6 - t_5); 76 | frame.set("loop.revindex0", t_6 - t_5 - 1); 77 | frame.set("loop.first", t_5 === 0); 78 | frame.set("loop.last", t_5 === t_6 - 1); 79 | frame.set("loop.length", t_6); 80 | output += "\n "; 81 | output += runtime.suppressValue((lineno = 58, colno = 33, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/server.html",runtime.makeKeywordArgs({"server_name": t_10,"server": t_11})])), env.opts.autoescape); 82 | output += "\n "; 83 | ; 84 | } 85 | } 86 | } 87 | frame = frame.pop(); 88 | output += "\n\n
\n\n
\n "; 89 | ; 90 | } 91 | output += "\n\n\n "; 92 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"terms")) { 93 | output += "\n
\n "; 94 | output += runtime.suppressValue((lineno = 69, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/datacontract_terms.html",runtime.makeKeywordArgs({"datacontract": runtime.contextOrFrameLookup(context, frame, "datacontract")})])), env.opts.autoescape); 95 | output += "\n
\n "; 96 | ; 97 | } 98 | output += "\n\n\n
\n
\n
\n

\n Data Model\n

\n

The logical data model

\n
\n
\n\n "; 99 | frame = frame.push(); 100 | var t_14 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"models"); 101 | if(t_14) {t_14 = runtime.fromIterator(t_14); 102 | var t_12; 103 | if(runtime.isArray(t_14)) { 104 | var t_13 = t_14.length; 105 | for(t_12=0; t_12 < t_14.length; t_12++) { 106 | var t_15 = t_14[t_12][0]; 107 | frame.set("[object Object]", t_14[t_12][0]); 108 | var t_16 = t_14[t_12][1]; 109 | frame.set("[object Object]", t_14[t_12][1]); 110 | frame.set("loop.index", t_12 + 1); 111 | frame.set("loop.index0", t_12); 112 | frame.set("loop.revindex", t_13 - t_12); 113 | frame.set("loop.revindex0", t_13 - t_12 - 1); 114 | frame.set("loop.first", t_12 === 0); 115 | frame.set("loop.last", t_12 === t_13 - 1); 116 | frame.set("loop.length", t_13); 117 | output += "\n\n
\n
\n
\n
\n\n \n \n \n \n\n \n \n \n "; 124 | frame = frame.push(); 125 | var t_19 = runtime.memberLookup((t_16),"fields"); 126 | if(t_19) {t_19 = runtime.fromIterator(t_19); 127 | var t_17; 128 | if(runtime.isArray(t_19)) { 129 | var t_18 = t_19.length; 130 | for(t_17=0; t_17 < t_19.length; t_17++) { 131 | var t_20 = t_19[t_17][0]; 132 | frame.set("[object Object]", t_19[t_17][0]); 133 | var t_21 = t_19[t_17][1]; 134 | frame.set("[object Object]", t_19[t_17][1]); 135 | frame.set("loop.index", t_17 + 1); 136 | frame.set("loop.index0", t_17); 137 | frame.set("loop.revindex", t_18 - t_17); 138 | frame.set("loop.revindex0", t_18 - t_17 - 1); 139 | frame.set("loop.first", t_17 === 0); 140 | frame.set("loop.last", t_17 === t_18 - 1); 141 | frame.set("loop.length", t_18); 142 | output += "\n "; 143 | output += runtime.suppressValue((lineno = 104, colno = 41, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": false,"field_name": t_20,"field": t_21,"level": 0})])), env.opts.autoescape); 144 | output += "\n "; 145 | ; 146 | } 147 | } else { 148 | t_17 = -1; 149 | var t_18 = runtime.keys(t_19).length; 150 | for(var t_22 in t_19) { 151 | t_17++; 152 | var t_23 = t_19[t_22]; 153 | frame.set("field_name", t_22); 154 | frame.set("field", t_23); 155 | frame.set("loop.index", t_17 + 1); 156 | frame.set("loop.index0", t_17); 157 | frame.set("loop.revindex", t_18 - t_17); 158 | frame.set("loop.revindex0", t_18 - t_17 - 1); 159 | frame.set("loop.first", t_17 === 0); 160 | frame.set("loop.last", t_17 === t_18 - 1); 161 | frame.set("loop.length", t_18); 162 | output += "\n "; 163 | output += runtime.suppressValue((lineno = 104, colno = 41, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": false,"field_name": t_22,"field": t_23,"level": 0})])), env.opts.autoescape); 164 | output += "\n "; 165 | ; 166 | } 167 | } 168 | } 169 | frame = frame.pop(); 170 | output += "\n \n
\n "; 118 | output += runtime.suppressValue(t_15, env.opts.autoescape); 119 | output += "\n "; 120 | output += runtime.suppressValue(runtime.memberLookup((t_16),"type"), env.opts.autoescape); 121 | output += "\n
"; 122 | output += runtime.suppressValue(runtime.memberLookup((t_16),"description"), env.opts.autoescape); 123 | output += "
\n
\n
\n
\n
\n
\n "; 171 | ; 172 | } 173 | } else { 174 | t_12 = -1; 175 | var t_13 = runtime.keys(t_14).length; 176 | for(var t_24 in t_14) { 177 | t_12++; 178 | var t_25 = t_14[t_24]; 179 | frame.set("model_name", t_24); 180 | frame.set("model", t_25); 181 | frame.set("loop.index", t_12 + 1); 182 | frame.set("loop.index0", t_12); 183 | frame.set("loop.revindex", t_13 - t_12); 184 | frame.set("loop.revindex0", t_13 - t_12 - 1); 185 | frame.set("loop.first", t_12 === 0); 186 | frame.set("loop.last", t_12 === t_13 - 1); 187 | frame.set("loop.length", t_13); 188 | output += "\n\n
\n
\n
\n
\n\n \n \n \n \n\n \n \n \n "; 195 | frame = frame.push(); 196 | var t_28 = runtime.memberLookup((t_25),"fields"); 197 | if(t_28) {t_28 = runtime.fromIterator(t_28); 198 | var t_26; 199 | if(runtime.isArray(t_28)) { 200 | var t_27 = t_28.length; 201 | for(t_26=0; t_26 < t_28.length; t_26++) { 202 | var t_29 = t_28[t_26][0]; 203 | frame.set("[object Object]", t_28[t_26][0]); 204 | var t_30 = t_28[t_26][1]; 205 | frame.set("[object Object]", t_28[t_26][1]); 206 | frame.set("loop.index", t_26 + 1); 207 | frame.set("loop.index0", t_26); 208 | frame.set("loop.revindex", t_27 - t_26); 209 | frame.set("loop.revindex0", t_27 - t_26 - 1); 210 | frame.set("loop.first", t_26 === 0); 211 | frame.set("loop.last", t_26 === t_27 - 1); 212 | frame.set("loop.length", t_27); 213 | output += "\n "; 214 | output += runtime.suppressValue((lineno = 104, colno = 41, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": false,"field_name": t_29,"field": t_30,"level": 0})])), env.opts.autoescape); 215 | output += "\n "; 216 | ; 217 | } 218 | } else { 219 | t_26 = -1; 220 | var t_27 = runtime.keys(t_28).length; 221 | for(var t_31 in t_28) { 222 | t_26++; 223 | var t_32 = t_28[t_31]; 224 | frame.set("field_name", t_31); 225 | frame.set("field", t_32); 226 | frame.set("loop.index", t_26 + 1); 227 | frame.set("loop.index0", t_26); 228 | frame.set("loop.revindex", t_27 - t_26); 229 | frame.set("loop.revindex0", t_27 - t_26 - 1); 230 | frame.set("loop.first", t_26 === 0); 231 | frame.set("loop.last", t_26 === t_27 - 1); 232 | frame.set("loop.length", t_27); 233 | output += "\n "; 234 | output += runtime.suppressValue((lineno = 104, colno = 41, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": false,"field_name": t_31,"field": t_32,"level": 0})])), env.opts.autoescape); 235 | output += "\n "; 236 | ; 237 | } 238 | } 239 | } 240 | frame = frame.pop(); 241 | output += "\n \n
\n "; 189 | output += runtime.suppressValue(t_24, env.opts.autoescape); 190 | output += "\n "; 191 | output += runtime.suppressValue(runtime.memberLookup((t_25),"type"), env.opts.autoescape); 192 | output += "\n
"; 193 | output += runtime.suppressValue(runtime.memberLookup((t_25),"description"), env.opts.autoescape); 194 | output += "
\n
\n
\n
\n
\n
\n "; 242 | ; 243 | } 244 | } 245 | } 246 | frame = frame.pop(); 247 | output += "\n
\n\n "; 248 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"definitions")) { 249 | output += "\n
\n
\n

Definitions

\n

Domain specific definitions in the data contract

\n
\n\n "; 250 | frame = frame.push(); 251 | var t_35 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"definitions"); 252 | if(t_35) {t_35 = runtime.fromIterator(t_35); 253 | var t_33; 254 | if(runtime.isArray(t_35)) { 255 | var t_34 = t_35.length; 256 | for(t_33=0; t_33 < t_35.length; t_33++) { 257 | var t_36 = t_35[t_33][0]; 258 | frame.set("[object Object]", t_35[t_33][0]); 259 | var t_37 = t_35[t_33][1]; 260 | frame.set("[object Object]", t_35[t_33][1]); 261 | frame.set("loop.index", t_33 + 1); 262 | frame.set("loop.index0", t_33); 263 | frame.set("loop.revindex", t_34 - t_33); 264 | frame.set("loop.revindex0", t_34 - t_33 - 1); 265 | frame.set("loop.first", t_33 === 0); 266 | frame.set("loop.last", t_33 === t_34 - 1); 267 | frame.set("loop.length", t_34); 268 | output += "\n "; 269 | output += runtime.suppressValue((lineno = 123, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/definition.html",runtime.makeKeywordArgs({"definition_name": t_36,"definition": t_37})])), env.opts.autoescape); 270 | output += "\n "; 271 | ; 272 | } 273 | } else { 274 | t_33 = -1; 275 | var t_34 = runtime.keys(t_35).length; 276 | for(var t_38 in t_35) { 277 | t_33++; 278 | var t_39 = t_35[t_38]; 279 | frame.set("definition_name", t_38); 280 | frame.set("definition", t_39); 281 | frame.set("loop.index", t_33 + 1); 282 | frame.set("loop.index0", t_33); 283 | frame.set("loop.revindex", t_34 - t_33); 284 | frame.set("loop.revindex0", t_34 - t_33 - 1); 285 | frame.set("loop.first", t_33 === 0); 286 | frame.set("loop.last", t_33 === t_34 - 1); 287 | frame.set("loop.length", t_34); 288 | output += "\n "; 289 | output += runtime.suppressValue((lineno = 123, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/definition.html",runtime.makeKeywordArgs({"definition_name": t_38,"definition": t_39})])), env.opts.autoescape); 290 | output += "\n "; 291 | ; 292 | } 293 | } 294 | } 295 | frame = frame.pop(); 296 | output += "\n
\n "; 297 | ; 298 | } 299 | output += "\n\n "; 300 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"examples")) { 301 | output += "\n
\n
\n

Examples

\n

Examples for models in the data contract

\n
\n "; 302 | frame = frame.push(); 303 | var t_42 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"examples"); 304 | if(t_42) {t_42 = runtime.fromIterator(t_42); 305 | var t_41 = t_42.length; 306 | for(var t_40=0; t_40 < t_42.length; t_40++) { 307 | var t_43 = t_42[t_40]; 308 | frame.set("example", t_43); 309 | frame.set("loop.index", t_40 + 1); 310 | frame.set("loop.index0", t_40); 311 | frame.set("loop.revindex", t_41 - t_40); 312 | frame.set("loop.revindex0", t_41 - t_40 - 1); 313 | frame.set("loop.first", t_40 === 0); 314 | frame.set("loop.last", t_40 === t_41 - 1); 315 | frame.set("loop.length", t_41); 316 | output += "\n "; 317 | output += runtime.suppressValue((lineno = 135, colno = 31, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/example.html",runtime.makeKeywordArgs({"example": t_43})])), env.opts.autoescape); 318 | output += "\n "; 319 | ; 320 | } 321 | } 322 | frame = frame.pop(); 323 | output += "\n
\n "; 324 | ; 325 | } 326 | output += "\n\n "; 327 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")) { 328 | output += "\n
\n "; 329 | output += runtime.suppressValue((lineno = 142, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/datacontract_servicelevels.html",runtime.makeKeywordArgs({"datacontract": runtime.contextOrFrameLookup(context, frame, "datacontract")})])), env.opts.autoescape); 330 | output += "\n
\n "; 331 | ; 332 | } 333 | output += "\n\n "; 334 | if(runtime.contextOrFrameLookup(context, frame, "quality_specification")) { 335 | output += "\n
\n
\n

\n Quality\n

\n

\n "; 336 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"quality")),"type"), env.opts.autoescape); 337 | output += "\n

\n
\n
\n
\n
\n
";
 338 | output += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, "quality_specification"), env.opts.autoescape);
 339 | output += "
\n
\n
\n
\n
\n "; 340 | ; 341 | } 342 | output += "\n\n
\n
\n\n
\n Created at "; 343 | output += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, "formatted_date"), env.opts.autoescape); 344 | output += " with Data Contract Editor v"; 345 | output += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, "datacontract_cli_version"), env.opts.autoescape); 346 | output += "\n
\n\n
\n
"; 347 | if(parentTemplate) { 348 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 349 | } else { 350 | cb(null, output); 351 | } 352 | ; 353 | } catch (e) { 354 | cb(runtime.handleError(e, lineno, colno)); 355 | } 356 | } 357 | return { 358 | root: root 359 | }; 360 | 361 | })(); 362 | })(); 363 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["partials/datacontract_information.html"] = (function() { 364 | function root(env, context, frame, runtime, cb) { 365 | var lineno = 0; 366 | var colno = 0; 367 | var output = ""; 368 | try { 369 | var parentTemplate = null; 370 | output += "
\n

Info

\n

Information about the data contract

\n
\n
\n\n
\n\n "; 371 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"links")) { 372 | output += "\n
\n "; 373 | frame = frame.push(); 374 | var t_3 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"links"); 375 | if(t_3) {t_3 = runtime.fromIterator(t_3); 376 | var t_1; 377 | if(runtime.isArray(t_3)) { 378 | var t_2 = t_3.length; 379 | for(t_1=0; t_1 < t_3.length; t_1++) { 380 | var t_4 = t_3[t_1][0]; 381 | frame.set("[object Object]", t_3[t_1][0]); 382 | var t_5 = t_3[t_1][1]; 383 | frame.set("[object Object]", t_3[t_1][1]); 384 | frame.set("loop.index", t_1 + 1); 385 | frame.set("loop.index0", t_1); 386 | frame.set("loop.revindex", t_2 - t_1); 387 | frame.set("loop.revindex0", t_2 - t_1 - 1); 388 | frame.set("loop.first", t_1 === 0); 389 | frame.set("loop.last", t_1 === t_2 - 1); 390 | frame.set("loop.length", t_2); 391 | output += "\n \n
\n \n
\n
"; 394 | output += runtime.suppressValue(t_4, env.opts.autoescape); 395 | output += "
\n
\n "; 396 | ; 397 | } 398 | } else { 399 | t_1 = -1; 400 | var t_2 = runtime.keys(t_3).length; 401 | for(var t_6 in t_3) { 402 | t_1++; 403 | var t_7 = t_3[t_6]; 404 | frame.set("name", t_6); 405 | frame.set("href", t_7); 406 | frame.set("loop.index", t_1 + 1); 407 | frame.set("loop.index0", t_1); 408 | frame.set("loop.revindex", t_2 - t_1); 409 | frame.set("loop.revindex0", t_2 - t_1 - 1); 410 | frame.set("loop.first", t_1 === 0); 411 | frame.set("loop.last", t_1 === t_2 - 1); 412 | frame.set("loop.length", t_2); 413 | output += "\n \n
\n \n
\n
"; 416 | output += runtime.suppressValue(t_6, env.opts.autoescape); 417 | output += "
\n
\n "; 418 | ; 419 | } 420 | } 421 | } 422 | frame = frame.pop(); 423 | output += "\n
\n "; 424 | ; 425 | } 426 | output += "\n\n
\n
\n
Title
\n
"; 427 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"title"), env.opts.autoescape); 428 | output += "
\n
\n\n
\n
Version
\n
"; 429 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"version"), env.opts.autoescape); 430 | output += "
\n
\n\n "; 431 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"status")) { 432 | output += "\n
\n
Status
\n
"; 433 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"status"), env.opts.autoescape); 434 | output += "
\n
\n "; 435 | ; 436 | } 437 | output += "\n\n "; 438 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"description")) { 439 | output += "\n
\n
Description
\n
\n "; 440 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"description"), env.opts.autoescape); 441 | output += "\n
\n
\n "; 442 | ; 443 | } 444 | output += "\n\n "; 445 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"owner")) { 446 | output += "\n
\n
Owner
\n
\n "; 447 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"owner"), env.opts.autoescape); 448 | output += "\n
\n
\n "; 449 | ; 450 | } 451 | output += "\n\n "; 452 | frame = frame.push(); 453 | var t_10 = runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"model_extra"); 454 | if(t_10) {t_10 = runtime.fromIterator(t_10); 455 | var t_8; 456 | if(runtime.isArray(t_10)) { 457 | var t_9 = t_10.length; 458 | for(t_8=0; t_8 < t_10.length; t_8++) { 459 | var t_11 = t_10[t_8][0]; 460 | frame.set("[object Object]", t_10[t_8][0]); 461 | var t_12 = t_10[t_8][1]; 462 | frame.set("[object Object]", t_10[t_8][1]); 463 | frame.set("loop.index", t_8 + 1); 464 | frame.set("loop.index0", t_8); 465 | frame.set("loop.revindex", t_9 - t_8); 466 | frame.set("loop.revindex0", t_9 - t_8 - 1); 467 | frame.set("loop.first", t_8 === 0); 468 | frame.set("loop.last", t_8 === t_9 - 1); 469 | frame.set("loop.length", t_9); 470 | output += "\n
\n
"; 471 | output += runtime.suppressValue(t_11, env.opts.autoescape); 472 | output += "
\n
"; 473 | output += runtime.suppressValue(t_12, env.opts.autoescape); 474 | output += "
\n
\n "; 475 | ; 476 | } 477 | } else { 478 | t_8 = -1; 479 | var t_9 = runtime.keys(t_10).length; 480 | for(var t_13 in t_10) { 481 | t_8++; 482 | var t_14 = t_10[t_13]; 483 | frame.set("key", t_13); 484 | frame.set("value", t_14); 485 | frame.set("loop.index", t_8 + 1); 486 | frame.set("loop.index0", t_8); 487 | frame.set("loop.revindex", t_9 - t_8); 488 | frame.set("loop.revindex0", t_9 - t_8 - 1); 489 | frame.set("loop.first", t_8 === 0); 490 | frame.set("loop.last", t_8 === t_9 - 1); 491 | frame.set("loop.length", t_9); 492 | output += "\n
\n
"; 493 | output += runtime.suppressValue(t_13, env.opts.autoescape); 494 | output += "
\n
"; 495 | output += runtime.suppressValue(t_14, env.opts.autoescape); 496 | output += "
\n
\n "; 497 | ; 498 | } 499 | } 500 | } 501 | frame = frame.pop(); 502 | output += "\n\n "; 503 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"contact")) { 504 | output += "\n
\n
Contact
\n
\n "; 505 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"contact")),"name")) { 506 | output += "\n "; 507 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"contact")),"name"), env.opts.autoescape); 508 | output += "\n "; 509 | ; 510 | } 511 | output += "\n "; 512 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"contact")),"email")) { 513 | output += "\n "; 516 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"contact")),"email"), env.opts.autoescape); 517 | output += "\n "; 518 | ; 519 | } 520 | output += "\n "; 521 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"info")),"contact")),"url")) { 522 | output += "\n \n "; 527 | ; 528 | } 529 | output += "\n
\n
\n "; 530 | ; 531 | } 532 | output += "\n\n
\n
\n
"; 533 | if(parentTemplate) { 534 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 535 | } else { 536 | cb(null, output); 537 | } 538 | ; 539 | } catch (e) { 540 | cb(runtime.handleError(e, lineno, colno)); 541 | } 542 | } 543 | return { 544 | root: root 545 | }; 546 | 547 | })(); 548 | })(); 549 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["partials/datacontract_models.html"] = (function() { 550 | function root(env, context, frame, runtime, cb) { 551 | var lineno = 0; 552 | var colno = 0; 553 | var output = ""; 554 | try { 555 | var parentTemplate = null; 556 | output += "
\n
\n

\n Data Model\n

\n

The logical data model

\n
\n
\n\n"; 557 | frame = frame.push(); 558 | var t_3 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"models"); 559 | if(t_3) {t_3 = runtime.fromIterator(t_3); 560 | var t_1; 561 | if(runtime.isArray(t_3)) { 562 | var t_2 = t_3.length; 563 | for(t_1=0; t_1 < t_3.length; t_1++) { 564 | var t_4 = t_3[t_1][0]; 565 | frame.set("[object Object]", t_3[t_1][0]); 566 | var t_5 = t_3[t_1][1]; 567 | frame.set("[object Object]", t_3[t_1][1]); 568 | frame.set("loop.index", t_1 + 1); 569 | frame.set("loop.index0", t_1); 570 | frame.set("loop.revindex", t_2 - t_1); 571 | frame.set("loop.revindex0", t_2 - t_1 - 1); 572 | frame.set("loop.first", t_1 === 0); 573 | frame.set("loop.last", t_1 === t_2 - 1); 574 | frame.set("loop.length", t_2); 575 | output += "\n\n
\n
\n
\n
\n\n \n \n \n \n\n \n \n \n "; 582 | frame = frame.push(); 583 | var t_8 = runtime.memberLookup((t_5),"fields"); 584 | if(t_8) {t_8 = runtime.fromIterator(t_8); 585 | var t_6; 586 | if(runtime.isArray(t_8)) { 587 | var t_7 = t_8.length; 588 | for(t_6=0; t_6 < t_8.length; t_6++) { 589 | var t_9 = t_8[t_6][0]; 590 | frame.set("[object Object]", t_8[t_6][0]); 591 | var t_10 = t_8[t_6][1]; 592 | frame.set("[object Object]", t_8[t_6][1]); 593 | frame.set("loop.index", t_6 + 1); 594 | frame.set("loop.index0", t_6); 595 | frame.set("loop.revindex", t_7 - t_6); 596 | frame.set("loop.revindex0", t_7 - t_6 - 1); 597 | frame.set("loop.first", t_6 === 0); 598 | frame.set("loop.last", t_6 === t_7 - 1); 599 | frame.set("loop.length", t_7); 600 | output += "\n "; 601 | output += runtime.suppressValue((lineno = 29, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": false,"field_name": t_9,"field": t_10,"level": 0})])), env.opts.autoescape); 602 | output += "\n "; 603 | ; 604 | } 605 | } else { 606 | t_6 = -1; 607 | var t_7 = runtime.keys(t_8).length; 608 | for(var t_11 in t_8) { 609 | t_6++; 610 | var t_12 = t_8[t_11]; 611 | frame.set("field_name", t_11); 612 | frame.set("field", t_12); 613 | frame.set("loop.index", t_6 + 1); 614 | frame.set("loop.index0", t_6); 615 | frame.set("loop.revindex", t_7 - t_6); 616 | frame.set("loop.revindex0", t_7 - t_6 - 1); 617 | frame.set("loop.first", t_6 === 0); 618 | frame.set("loop.last", t_6 === t_7 - 1); 619 | frame.set("loop.length", t_7); 620 | output += "\n "; 621 | output += runtime.suppressValue((lineno = 29, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": false,"field_name": t_11,"field": t_12,"level": 0})])), env.opts.autoescape); 622 | output += "\n "; 623 | ; 624 | } 625 | } 626 | } 627 | frame = frame.pop(); 628 | output += "\n \n
\n "; 576 | output += runtime.suppressValue(t_4, env.opts.autoescape); 577 | output += "\n "; 578 | output += runtime.suppressValue(runtime.memberLookup((t_5),"type"), env.opts.autoescape); 579 | output += "\n
"; 580 | output += runtime.suppressValue(runtime.memberLookup((t_5),"description"), env.opts.autoescape); 581 | output += "
\n
\n
\n
\n
\n
\n"; 629 | ; 630 | } 631 | } else { 632 | t_1 = -1; 633 | var t_2 = runtime.keys(t_3).length; 634 | for(var t_13 in t_3) { 635 | t_1++; 636 | var t_14 = t_3[t_13]; 637 | frame.set("model_name", t_13); 638 | frame.set("model", t_14); 639 | frame.set("loop.index", t_1 + 1); 640 | frame.set("loop.index0", t_1); 641 | frame.set("loop.revindex", t_2 - t_1); 642 | frame.set("loop.revindex0", t_2 - t_1 - 1); 643 | frame.set("loop.first", t_1 === 0); 644 | frame.set("loop.last", t_1 === t_2 - 1); 645 | frame.set("loop.length", t_2); 646 | output += "\n\n
\n
\n
\n
\n\n \n \n \n \n\n \n \n \n "; 653 | frame = frame.push(); 654 | var t_17 = runtime.memberLookup((t_14),"fields"); 655 | if(t_17) {t_17 = runtime.fromIterator(t_17); 656 | var t_15; 657 | if(runtime.isArray(t_17)) { 658 | var t_16 = t_17.length; 659 | for(t_15=0; t_15 < t_17.length; t_15++) { 660 | var t_18 = t_17[t_15][0]; 661 | frame.set("[object Object]", t_17[t_15][0]); 662 | var t_19 = t_17[t_15][1]; 663 | frame.set("[object Object]", t_17[t_15][1]); 664 | frame.set("loop.index", t_15 + 1); 665 | frame.set("loop.index0", t_15); 666 | frame.set("loop.revindex", t_16 - t_15); 667 | frame.set("loop.revindex0", t_16 - t_15 - 1); 668 | frame.set("loop.first", t_15 === 0); 669 | frame.set("loop.last", t_15 === t_16 - 1); 670 | frame.set("loop.length", t_16); 671 | output += "\n "; 672 | output += runtime.suppressValue((lineno = 29, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": false,"field_name": t_18,"field": t_19,"level": 0})])), env.opts.autoescape); 673 | output += "\n "; 674 | ; 675 | } 676 | } else { 677 | t_15 = -1; 678 | var t_16 = runtime.keys(t_17).length; 679 | for(var t_20 in t_17) { 680 | t_15++; 681 | var t_21 = t_17[t_20]; 682 | frame.set("field_name", t_20); 683 | frame.set("field", t_21); 684 | frame.set("loop.index", t_15 + 1); 685 | frame.set("loop.index0", t_15); 686 | frame.set("loop.revindex", t_16 - t_15); 687 | frame.set("loop.revindex0", t_16 - t_15 - 1); 688 | frame.set("loop.first", t_15 === 0); 689 | frame.set("loop.last", t_15 === t_16 - 1); 690 | frame.set("loop.length", t_16); 691 | output += "\n "; 692 | output += runtime.suppressValue((lineno = 29, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": false,"field_name": t_20,"field": t_21,"level": 0})])), env.opts.autoescape); 693 | output += "\n "; 694 | ; 695 | } 696 | } 697 | } 698 | frame = frame.pop(); 699 | output += "\n \n
\n "; 647 | output += runtime.suppressValue(t_13, env.opts.autoescape); 648 | output += "\n "; 649 | output += runtime.suppressValue(runtime.memberLookup((t_14),"type"), env.opts.autoescape); 650 | output += "\n
"; 651 | output += runtime.suppressValue(runtime.memberLookup((t_14),"description"), env.opts.autoescape); 652 | output += "
\n
\n
\n
\n
\n
\n"; 700 | ; 701 | } 702 | } 703 | } 704 | frame = frame.pop(); 705 | if(parentTemplate) { 706 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 707 | } else { 708 | cb(null, output); 709 | } 710 | ; 711 | } catch (e) { 712 | cb(runtime.handleError(e, lineno, colno)); 713 | } 714 | } 715 | return { 716 | root: root 717 | }; 718 | 719 | })(); 720 | })(); 721 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["partials/datacontract_servicelevels.html"] = (function() { 722 | function root(env, context, frame, runtime, cb) { 723 | var lineno = 0; 724 | var colno = 0; 725 | var output = ""; 726 | try { 727 | var parentTemplate = null; 728 | output += "
\n

Service Levels

\n

Service levels of the data contract

\n
\n
\n
\n
\n "; 729 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"availability")) { 730 | output += "\n
\n

\n Availability\n

\n "; 731 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"availability")),"description")) { 732 | output += "\n
\n
Description
\n
\n "; 733 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"availability")),"description"), env.opts.autoescape); 734 | output += "\n
\n
\n "; 735 | ; 736 | } 737 | output += "\n "; 738 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"availability")),"percentage")) { 739 | output += "\n
\n
Percentage
\n
\n "; 740 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"availability")),"percentage"), env.opts.autoescape); 741 | output += "\n
\n
\n "; 742 | ; 743 | } 744 | output += "\n
\n "; 745 | ; 746 | } 747 | output += "\n "; 748 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"retention")) { 749 | output += "\n
\n

\n Retention\n

\n "; 750 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"retention")),"description")) { 751 | output += "\n
\n
Description
\n
\n "; 752 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"retention")),"description"), env.opts.autoescape); 753 | output += "\n
\n
\n "; 754 | ; 755 | } 756 | output += "\n "; 757 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"retention")),"period")) { 758 | output += "\n
\n
Period
\n
\n "; 759 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"retention")),"period"), env.opts.autoescape); 760 | output += "\n
\n
\n "; 761 | ; 762 | } 763 | output += "\n "; 764 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"retention")),"unlimited")) { 765 | output += "\n
\n
Unlimited
\n
\n "; 766 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"retention")),"unlimited"), env.opts.autoescape); 767 | output += "\n
\n
\n "; 768 | ; 769 | } 770 | output += "\n
\n "; 771 | ; 772 | } 773 | output += "\n "; 774 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")) { 775 | output += "\n
\n

\n Latency\n

\n "; 776 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")),"description")) { 777 | output += "\n
\n
Description
\n
\n "; 778 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")),"description"), env.opts.autoescape); 779 | output += "\n
\n
\n "; 780 | ; 781 | } 782 | output += "\n "; 783 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")),"threshold")) { 784 | output += "\n
\n
Threshold
\n
\n "; 785 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")),"threshold"), env.opts.autoescape); 786 | output += "\n
\n
\n "; 787 | ; 788 | } 789 | output += "\n "; 790 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")),"sourceTimestampField")) { 791 | output += "\n
\n
Source Timestamp field
\n
\n "; 792 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")),"sourceTimestampField"), env.opts.autoescape); 793 | output += "\n
\n
\n "; 794 | ; 795 | } 796 | output += "\n "; 797 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")),"processedTimestampField")) { 798 | output += "\n
\n
Processed Timestamp field
\n
\n "; 799 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"latency")),"processedTimestampField"), env.opts.autoescape); 800 | output += "\n
\n
\n "; 801 | ; 802 | } 803 | output += "\n
\n "; 804 | ; 805 | } 806 | output += "\n "; 807 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"freshness")) { 808 | output += "\n
\n

\n Freshness\n

\n "; 809 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"freshness")),"description")) { 810 | output += "\n
\n
Description
\n
\n "; 811 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"freshness")),"description"), env.opts.autoescape); 812 | output += "\n
\n
\n "; 813 | ; 814 | } 815 | output += "\n "; 816 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"freshness")),"threshold")) { 817 | output += "\n
\n
Threshold
\n
\n "; 818 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"freshness")),"threshold"), env.opts.autoescape); 819 | output += "\n
\n
\n "; 820 | ; 821 | } 822 | output += "\n "; 823 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"freshness")),"timestampField")) { 824 | output += "\n
\n
Timestamp field
\n
\n "; 825 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"freshness")),"timestampField"), env.opts.autoescape); 826 | output += "\n
\n
\n "; 827 | ; 828 | } 829 | output += "\n
\n "; 830 | ; 831 | } 832 | output += "\n "; 833 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")) { 834 | output += "\n
\n

\n Frequency\n

\n "; 835 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")),"description")) { 836 | output += "\n
\n
Description
\n
\n "; 837 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")),"description"), env.opts.autoescape); 838 | output += "\n
\n
\n "; 839 | ; 840 | } 841 | output += "\n "; 842 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")),"type")) { 843 | output += "\n
\n
Type
\n
\n "; 844 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")),"type"), env.opts.autoescape); 845 | output += "\n
\n
\n "; 846 | ; 847 | } 848 | output += "\n "; 849 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")),"interval")) { 850 | output += "\n
\n
Interval
\n
\n "; 851 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")),"interval"), env.opts.autoescape); 852 | output += "\n
\n
\n "; 853 | ; 854 | } 855 | output += "\n "; 856 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")),"cron")) { 857 | output += "\n
\n
Cron
\n
\n "; 858 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"frequency")),"cron"), env.opts.autoescape); 859 | output += "\n
\n
\n "; 860 | ; 861 | } 862 | output += "\n
\n "; 863 | ; 864 | } 865 | output += "\n "; 866 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"support")) { 867 | output += "\n
\n

\n Support\n

\n "; 868 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"support")),"description")) { 869 | output += "\n
\n
Description
\n
\n "; 870 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"support")),"description"), env.opts.autoescape); 871 | output += "\n
\n
\n "; 872 | ; 873 | } 874 | output += "\n "; 875 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"support")),"time")) { 876 | output += "\n
\n
Time
\n
\n "; 877 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"support")),"time"), env.opts.autoescape); 878 | output += "\n
\n
\n "; 879 | ; 880 | } 881 | output += "\n "; 882 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"support")),"responseTime")) { 883 | output += "\n
\n
Response Time
\n
\n "; 884 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"support")),"responseTime"), env.opts.autoescape); 885 | output += "\n
\n
\n "; 886 | ; 887 | } 888 | output += "\n
\n "; 889 | ; 890 | } 891 | output += "\n "; 892 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")) { 893 | output += "\n
\n

\n Backup\n

\n "; 894 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"description")) { 895 | output += "\n
\n
Description
\n
\n "; 896 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"description"), env.opts.autoescape); 897 | output += "\n
\n
\n "; 898 | ; 899 | } 900 | output += "\n "; 901 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"internal")) { 902 | output += "\n
\n
Interval
\n
\n "; 903 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"interval"), env.opts.autoescape); 904 | output += "\n
\n
\n "; 905 | ; 906 | } 907 | output += "\n "; 908 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"cron")) { 909 | output += "\n
\n
Cron
\n
\n "; 910 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"cron"), env.opts.autoescape); 911 | output += "\n
\n
\n "; 912 | ; 913 | } 914 | output += "\n "; 915 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"recoveryTime")) { 916 | output += "\n
\n
Recovery Time
\n
\n "; 917 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"recoveryTime"), env.opts.autoescape); 918 | output += "\n
\n
\n "; 919 | ; 920 | } 921 | output += "\n "; 922 | if(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"recoveryPoint")) { 923 | output += "\n
\n
Recovery Point
\n
\n "; 924 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"servicelevels")),"backup")),"recoveryPoint"), env.opts.autoescape); 925 | output += "\n
\n
\n "; 926 | ; 927 | } 928 | output += "\n
\n "; 929 | ; 930 | } 931 | output += "\n
\n
\n
"; 932 | if(parentTemplate) { 933 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 934 | } else { 935 | cb(null, output); 936 | } 937 | ; 938 | } catch (e) { 939 | cb(runtime.handleError(e, lineno, colno)); 940 | } 941 | } 942 | return { 943 | root: root 944 | }; 945 | 946 | })(); 947 | })(); 948 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["partials/datacontract_terms.html"] = (function() { 949 | function root(env, context, frame, runtime, cb) { 950 | var lineno = 0; 951 | var colno = 0; 952 | var output = ""; 953 | try { 954 | var parentTemplate = null; 955 | output += "
\n

Terms

\n

Terms and conditions of the data contract

\n
\n
\n\n
\n\n
\n
\n
Usage
\n
\n "; 956 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"terms")),"usage"), env.opts.autoescape); 957 | output += "\n
\n
\n\n
\n
Limitations
\n
\n "; 958 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"terms")),"limitations"), env.opts.autoescape); 959 | output += "\n
\n
\n\n "; 960 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"terms")),"billing")) { 961 | output += "\n
\n
Billing
\n
\n "; 962 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"terms")),"billing"), env.opts.autoescape); 963 | output += "\n
\n
\n "; 964 | ; 965 | } 966 | output += "\n\n "; 967 | if(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"terms")),"noticePeriod")) { 968 | output += "\n
\n
Notice Period
\n
\n "; 969 | output += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"terms")),"noticePeriod"), env.opts.autoescape); 970 | output += "\n
\n
\n "; 971 | ; 972 | } 973 | output += "\n\n "; 974 | frame = frame.push(); 975 | var t_3 = runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "datacontract")),"terms")),"model_extra"); 976 | if(t_3) {t_3 = runtime.fromIterator(t_3); 977 | var t_1; 978 | if(runtime.isArray(t_3)) { 979 | var t_2 = t_3.length; 980 | for(t_1=0; t_1 < t_3.length; t_1++) { 981 | var t_4 = t_3[t_1][0]; 982 | frame.set("[object Object]", t_3[t_1][0]); 983 | var t_5 = t_3[t_1][1]; 984 | frame.set("[object Object]", t_3[t_1][1]); 985 | frame.set("loop.index", t_1 + 1); 986 | frame.set("loop.index0", t_1); 987 | frame.set("loop.revindex", t_2 - t_1); 988 | frame.set("loop.revindex0", t_2 - t_1 - 1); 989 | frame.set("loop.first", t_1 === 0); 990 | frame.set("loop.last", t_1 === t_2 - 1); 991 | frame.set("loop.length", t_2); 992 | output += "\n
\n
"; 993 | output += runtime.suppressValue(t_4, env.opts.autoescape); 994 | output += "
\n
"; 995 | output += runtime.suppressValue(t_5, env.opts.autoescape); 996 | output += "
\n
\n "; 997 | ; 998 | } 999 | } else { 1000 | t_1 = -1; 1001 | var t_2 = runtime.keys(t_3).length; 1002 | for(var t_6 in t_3) { 1003 | t_1++; 1004 | var t_7 = t_3[t_6]; 1005 | frame.set("key", t_6); 1006 | frame.set("value", t_7); 1007 | frame.set("loop.index", t_1 + 1); 1008 | frame.set("loop.index0", t_1); 1009 | frame.set("loop.revindex", t_2 - t_1); 1010 | frame.set("loop.revindex0", t_2 - t_1 - 1); 1011 | frame.set("loop.first", t_1 === 0); 1012 | frame.set("loop.last", t_1 === t_2 - 1); 1013 | frame.set("loop.length", t_2); 1014 | output += "\n
\n
"; 1015 | output += runtime.suppressValue(t_6, env.opts.autoescape); 1016 | output += "
\n
"; 1017 | output += runtime.suppressValue(t_7, env.opts.autoescape); 1018 | output += "
\n
\n "; 1019 | ; 1020 | } 1021 | } 1022 | } 1023 | frame = frame.pop(); 1024 | output += "\n\n
\n
\n
"; 1025 | if(parentTemplate) { 1026 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 1027 | } else { 1028 | cb(null, output); 1029 | } 1030 | ; 1031 | } catch (e) { 1032 | cb(runtime.handleError(e, lineno, colno)); 1033 | } 1034 | } 1035 | return { 1036 | root: root 1037 | }; 1038 | 1039 | })(); 1040 | })(); 1041 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["partials/definition.html"] = (function() { 1042 | function root(env, context, frame, runtime, cb) { 1043 | var lineno = 0; 1044 | var colno = 0; 1045 | var output = ""; 1046 | try { 1047 | var parentTemplate = null; 1048 | output += "
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n
\n "; 1049 | output += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, "definition_name"), env.opts.autoescape); 1050 | output += "\n "; 1051 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"domain"), env.opts.autoescape); 1052 | output += "\n
"; 1053 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"description"), env.opts.autoescape); 1054 | output += "
\n
\n
\n "; 1057 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"title")) { 1058 | output += "\n
"; 1059 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"title"), env.opts.autoescape); 1060 | output += "
\n "; 1061 | ; 1062 | } 1063 | output += "\n
"; 1064 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"name"), env.opts.autoescape); 1065 | output += "
\n
\n
\n
\n "; 1066 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"type"), env.opts.autoescape); 1067 | output += "\n "; 1068 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"format")) { 1069 | output += "\n "; 1070 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"format"), env.opts.autoescape); 1071 | output += "\n "; 1072 | ; 1073 | } 1074 | output += "\n
\n
\n "; 1075 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"example")) { 1076 | output += "\n
\n Example: "; 1077 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"example"), env.opts.autoescape); 1078 | output += "\n
\n "; 1079 | ; 1080 | } 1081 | output += "\n "; 1082 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"tags")) { 1083 | output += "\n
\n Tags:\n "; 1084 | frame = frame.push(); 1085 | var t_3 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"tags"); 1086 | if(t_3) {t_3 = runtime.fromIterator(t_3); 1087 | var t_2 = t_3.length; 1088 | for(var t_1=0; t_1 < t_3.length; t_1++) { 1089 | var t_4 = t_3[t_1]; 1090 | frame.set("tag", t_4); 1091 | frame.set("loop.index", t_1 + 1); 1092 | frame.set("loop.index0", t_1); 1093 | frame.set("loop.revindex", t_2 - t_1); 1094 | frame.set("loop.revindex0", t_2 - t_1 - 1); 1095 | frame.set("loop.first", t_1 === 0); 1096 | frame.set("loop.last", t_1 === t_2 - 1); 1097 | frame.set("loop.length", t_2); 1098 | output += "\n "; 1099 | output += runtime.suppressValue(t_4, env.opts.autoescape); 1100 | output += "\n "; 1101 | ; 1102 | } 1103 | } 1104 | frame = frame.pop(); 1105 | output += "\n
\n "; 1106 | ; 1107 | } 1108 | output += "\n "; 1109 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"enum")) { 1110 | output += "\n
\n Enum:\n "; 1111 | frame = frame.push(); 1112 | var t_7 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"enum"); 1113 | if(t_7) {t_7 = runtime.fromIterator(t_7); 1114 | var t_6 = t_7.length; 1115 | for(var t_5=0; t_5 < t_7.length; t_5++) { 1116 | var t_8 = t_7[t_5]; 1117 | frame.set("value", t_8); 1118 | frame.set("loop.index", t_5 + 1); 1119 | frame.set("loop.index0", t_5); 1120 | frame.set("loop.revindex", t_6 - t_5); 1121 | frame.set("loop.revindex0", t_6 - t_5 - 1); 1122 | frame.set("loop.first", t_5 === 0); 1123 | frame.set("loop.last", t_5 === t_6 - 1); 1124 | frame.set("loop.length", t_6); 1125 | output += "\n "; 1126 | output += runtime.suppressValue(t_8, env.opts.autoescape); 1127 | output += "\n "; 1128 | ; 1129 | } 1130 | } 1131 | frame = frame.pop(); 1132 | output += "\n
\n "; 1133 | ; 1134 | } 1135 | output += "\n
\n "; 1136 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"minLength")) { 1137 | output += "\n minLength:"; 1138 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"minLength"), env.opts.autoescape); 1139 | output += "\n "; 1140 | ; 1141 | } 1142 | output += "\n "; 1143 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"maxLength")) { 1144 | output += "\n maxLength:"; 1145 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"maxLength"), env.opts.autoescape); 1146 | output += "\n "; 1147 | ; 1148 | } 1149 | output += "\n "; 1150 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"pattern")) { 1151 | output += "\n pattern:"; 1152 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"pattern"), env.opts.autoescape); 1153 | output += "\n "; 1154 | ; 1155 | } 1156 | output += "\n "; 1157 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"precision")) { 1158 | output += "\n precision:"; 1159 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"precision"), env.opts.autoescape); 1160 | output += "\n "; 1161 | ; 1162 | } 1163 | output += "\n "; 1164 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"scale")) { 1165 | output += "\n scale:"; 1166 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"scale"), env.opts.autoescape); 1167 | output += "\n "; 1168 | ; 1169 | } 1170 | output += "\n "; 1171 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"minimum")) { 1172 | output += "\n minimum:"; 1173 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"minimum"), env.opts.autoescape); 1174 | output += "\n "; 1175 | ; 1176 | } 1177 | output += "\n "; 1178 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"exclusiveMinimum")) { 1179 | output += "\n exclusiveMinimum:"; 1180 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"exclusiveMinimum"), env.opts.autoescape); 1181 | output += "\n "; 1182 | ; 1183 | } 1184 | output += "\n "; 1185 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"maximum")) { 1186 | output += "\n maximum:"; 1187 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"maximum"), env.opts.autoescape); 1188 | output += "\n "; 1189 | ; 1190 | } 1191 | output += "\n "; 1192 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"exclusiveMaximum")) { 1193 | output += "\n exclusiveMaximum:"; 1194 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"exclusiveMaximum"), env.opts.autoescape); 1195 | output += "\n "; 1196 | ; 1197 | } 1198 | output += "\n "; 1199 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"classification")) { 1200 | output += "\n "; 1201 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"classification"), env.opts.autoescape); 1202 | output += "\n "; 1203 | ; 1204 | } 1205 | output += "\n "; 1206 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"pii")) { 1207 | output += "\n PII\n "; 1208 | ; 1209 | } 1210 | output += "\n "; 1211 | frame = frame.push(); 1212 | var t_11 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"model_extra"); 1213 | if(t_11) {t_11 = runtime.fromIterator(t_11); 1214 | var t_9; 1215 | if(runtime.isArray(t_11)) { 1216 | var t_10 = t_11.length; 1217 | for(t_9=0; t_9 < t_11.length; t_9++) { 1218 | var t_12 = t_11[t_9][0]; 1219 | frame.set("[object Object]", t_11[t_9][0]); 1220 | var t_13 = t_11[t_9][1]; 1221 | frame.set("[object Object]", t_11[t_9][1]); 1222 | frame.set("loop.index", t_9 + 1); 1223 | frame.set("loop.index0", t_9); 1224 | frame.set("loop.revindex", t_10 - t_9); 1225 | frame.set("loop.revindex0", t_10 - t_9 - 1); 1226 | frame.set("loop.first", t_9 === 0); 1227 | frame.set("loop.last", t_9 === t_10 - 1); 1228 | frame.set("loop.length", t_10); 1229 | output += "\n "; 1230 | output += runtime.suppressValue(t_12, env.opts.autoescape); 1231 | output += ":"; 1232 | output += runtime.suppressValue(t_13, env.opts.autoescape); 1233 | output += "\n "; 1234 | ; 1235 | } 1236 | } else { 1237 | t_9 = -1; 1238 | var t_10 = runtime.keys(t_11).length; 1239 | for(var t_14 in t_11) { 1240 | t_9++; 1241 | var t_15 = t_11[t_14]; 1242 | frame.set("key", t_14); 1243 | frame.set("value", t_15); 1244 | frame.set("loop.index", t_9 + 1); 1245 | frame.set("loop.index0", t_9); 1246 | frame.set("loop.revindex", t_10 - t_9); 1247 | frame.set("loop.revindex0", t_10 - t_9 - 1); 1248 | frame.set("loop.first", t_9 === 0); 1249 | frame.set("loop.last", t_9 === t_10 - 1); 1250 | frame.set("loop.length", t_10); 1251 | output += "\n "; 1252 | output += runtime.suppressValue(t_14, env.opts.autoescape); 1253 | output += ":"; 1254 | output += runtime.suppressValue(t_15, env.opts.autoescape); 1255 | output += "\n "; 1256 | ; 1257 | } 1258 | } 1259 | } 1260 | frame = frame.pop(); 1261 | output += "\n "; 1262 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"links")) { 1263 | output += "\n "; 1264 | frame = frame.push(); 1265 | var t_18 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "definition")),"links"); 1266 | if(t_18) {t_18 = runtime.fromIterator(t_18); 1267 | var t_16; 1268 | if(runtime.isArray(t_18)) { 1269 | var t_17 = t_18.length; 1270 | for(t_16=0; t_16 < t_18.length; t_16++) { 1271 | var t_19 = t_18[t_16][0]; 1272 | frame.set("[object Object]", t_18[t_16][0]); 1273 | var t_20 = t_18[t_16][1]; 1274 | frame.set("[object Object]", t_18[t_16][1]); 1275 | frame.set("loop.index", t_16 + 1); 1276 | frame.set("loop.index0", t_16); 1277 | frame.set("loop.revindex", t_17 - t_16); 1278 | frame.set("loop.revindex0", t_17 - t_16 - 1); 1279 | frame.set("loop.first", t_16 === 0); 1280 | frame.set("loop.last", t_16 === t_17 - 1); 1281 | frame.set("loop.length", t_17); 1282 | output += "\n "; 1285 | output += runtime.suppressValue(t_19, env.opts.autoescape); 1286 | output += "\n "; 1287 | ; 1288 | } 1289 | } else { 1290 | t_16 = -1; 1291 | var t_17 = runtime.keys(t_18).length; 1292 | for(var t_21 in t_18) { 1293 | t_16++; 1294 | var t_22 = t_18[t_21]; 1295 | frame.set("name", t_21); 1296 | frame.set("href", t_22); 1297 | frame.set("loop.index", t_16 + 1); 1298 | frame.set("loop.index0", t_16); 1299 | frame.set("loop.revindex", t_17 - t_16); 1300 | frame.set("loop.revindex0", t_17 - t_16 - 1); 1301 | frame.set("loop.first", t_16 === 0); 1302 | frame.set("loop.last", t_16 === t_17 - 1); 1303 | frame.set("loop.length", t_17); 1304 | output += "\n "; 1307 | output += runtime.suppressValue(t_21, env.opts.autoescape); 1308 | output += "\n "; 1309 | ; 1310 | } 1311 | } 1312 | } 1313 | frame = frame.pop(); 1314 | output += "\n "; 1315 | ; 1316 | } 1317 | output += "\n
\n
\n
\n
\n
\n
"; 1318 | if(parentTemplate) { 1319 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 1320 | } else { 1321 | cb(null, output); 1322 | } 1323 | ; 1324 | } catch (e) { 1325 | cb(runtime.handleError(e, lineno, colno)); 1326 | } 1327 | } 1328 | return { 1329 | root: root 1330 | }; 1331 | 1332 | })(); 1333 | })(); 1334 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["partials/example.html"] = (function() { 1335 | function root(env, context, frame, runtime, cb) { 1336 | var lineno = 0; 1337 | var colno = 0; 1338 | var output = ""; 1339 | try { 1340 | var parentTemplate = null; 1341 | output += "
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n \n \n
\n "; 1342 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "example")),"model"), env.opts.autoescape); 1343 | output += "\n "; 1344 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "example")),"type"), env.opts.autoescape); 1345 | output += "\n
"; 1346 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "example")),"description"), env.opts.autoescape); 1347 | output += "
\n
\n
";
1348 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "example")),"data"), env.opts.autoescape);
1349 | output += "
\n
\n
\n
\n
\n
"; 1350 | if(parentTemplate) { 1351 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 1352 | } else { 1353 | cb(null, output); 1354 | } 1355 | ; 1356 | } catch (e) { 1357 | cb(runtime.handleError(e, lineno, colno)); 1358 | } 1359 | } 1360 | return { 1361 | root: root 1362 | }; 1363 | 1364 | })(); 1365 | })(); 1366 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["partials/model_field.html"] = (function() { 1367 | function root(env, context, frame, runtime, cb) { 1368 | var lineno = 0; 1369 | var colno = 0; 1370 | var output = ""; 1371 | try { 1372 | var parentTemplate = null; 1373 | if(runtime.contextOrFrameLookup(context, frame, "nested")) { 1374 | output += "\n\n \n "; 1375 | output += "\n "; 1376 | frame = frame.push(); 1377 | var t_3 = (lineno = 4, colno = 21, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "range"), "range", context, [0,runtime.contextOrFrameLookup(context, frame, "level")])); 1378 | if(t_3) {t_3 = runtime.fromIterator(t_3); 1379 | var t_2 = t_3.length; 1380 | for(var t_1=0; t_1 < t_3.length; t_1++) { 1381 | var t_4 = t_3[t_1]; 1382 | frame.set("i", t_4); 1383 | frame.set("loop.index", t_1 + 1); 1384 | frame.set("loop.index0", t_1); 1385 | frame.set("loop.revindex", t_2 - t_1); 1386 | frame.set("loop.revindex0", t_2 - t_1 - 1); 1387 | frame.set("loop.first", t_1 === 0); 1388 | frame.set("loop.last", t_1 === t_2 - 1); 1389 | frame.set("loop.length", t_2); 1390 | output += "\n
 
\n "; 1391 | ; 1392 | } 1393 | } 1394 | frame = frame.pop(); 1395 | output += "\n
\n ↳\n
\n"; 1396 | ; 1397 | } 1398 | else { 1399 | output += "\n\n \n"; 1400 | ; 1401 | } 1402 | output += "\n
\n "; 1403 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"title")) { 1404 | output += "\n "; 1405 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"title"), env.opts.autoescape); 1406 | output += "
\n "; 1407 | ; 1408 | } 1409 | output += "\n "; 1410 | output += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, "field_name"), env.opts.autoescape); 1411 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"$ref")) { 1412 | output += " \n \n "; 1415 | ; 1416 | } 1417 | output += "\n
\n \n \n "; 1418 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"type")) { 1419 | output += "\n "; 1420 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"type"), env.opts.autoescape); 1421 | output += "\n "; 1422 | ; 1423 | } 1424 | output += "\n \n \n "; 1425 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"description")) { 1426 | output += "\n
"; 1427 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"description"), env.opts.autoescape); 1428 | output += "
\n "; 1429 | ; 1430 | } 1431 | else { 1432 | output += "\n
No description
\n "; 1433 | ; 1434 | } 1435 | output += "\n\n "; 1436 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"example")) { 1437 | output += "\n
\n Example: "; 1438 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"example"), env.opts.autoescape); 1439 | output += "\n
\n "; 1440 | ; 1441 | } 1442 | output += "\n\n
\n "; 1443 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"primary")) { 1444 | output += "\n primary\n "; 1445 | ; 1446 | } 1447 | output += "\n "; 1448 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"required")) { 1449 | output += "\n required\n "; 1450 | ; 1451 | } 1452 | output += "\n "; 1453 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"unique")) { 1454 | output += "\n unique\n "; 1455 | ; 1456 | } 1457 | output += "\n "; 1458 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"format")) { 1459 | output += "\n format:"; 1460 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"format"), env.opts.autoescape); 1461 | output += "\n "; 1462 | ; 1463 | } 1464 | output += "\n "; 1465 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"minLength")) { 1466 | output += "\n minLength:"; 1467 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"minLength"), env.opts.autoescape); 1468 | output += "\n "; 1469 | ; 1470 | } 1471 | output += "\n "; 1472 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"maxLength")) { 1473 | output += "\n maxLength:"; 1474 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"maxLength"), env.opts.autoescape); 1475 | output += "\n "; 1476 | ; 1477 | } 1478 | output += "\n "; 1479 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"pattern")) { 1480 | output += "\n pattern:"; 1481 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"pattern"), env.opts.autoescape); 1482 | output += "\n "; 1483 | ; 1484 | } 1485 | output += "\n "; 1486 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"precision")) { 1487 | output += "\n precision:"; 1488 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"precision"), env.opts.autoescape); 1489 | output += "\n "; 1490 | ; 1491 | } 1492 | output += "\n "; 1493 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"scale")) { 1494 | output += "\n scale:"; 1495 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"scale"), env.opts.autoescape); 1496 | output += "\n "; 1497 | ; 1498 | } 1499 | output += "\n "; 1500 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"minimum")) { 1501 | output += "\n minimum:"; 1502 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"minimum"), env.opts.autoescape); 1503 | output += "\n "; 1504 | ; 1505 | } 1506 | output += "\n "; 1507 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"exclusiveMinimum")) { 1508 | output += "\n exclusiveMinimum:"; 1509 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"exclusiveMinimum"), env.opts.autoescape); 1510 | output += "\n "; 1511 | ; 1512 | } 1513 | output += "\n "; 1514 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"maximum")) { 1515 | output += "\n maximum:"; 1516 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"maximum"), env.opts.autoescape); 1517 | output += "\n "; 1518 | ; 1519 | } 1520 | output += "\n "; 1521 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"exclusiveMaximum")) { 1522 | output += "\n exclusiveMaximum:"; 1523 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"exclusiveMaximum"), env.opts.autoescape); 1524 | output += "\n "; 1525 | ; 1526 | } 1527 | output += "\n "; 1528 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"classification")) { 1529 | output += "\n "; 1530 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"classification"), env.opts.autoescape); 1531 | output += "\n "; 1532 | ; 1533 | } 1534 | output += "\n "; 1535 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"pii")) { 1536 | output += "\n PII\n "; 1537 | ; 1538 | } 1539 | output += "\n "; 1540 | frame = frame.push(); 1541 | var t_7 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"model_extra"); 1542 | if(t_7) {t_7 = runtime.fromIterator(t_7); 1543 | var t_5; 1544 | if(runtime.isArray(t_7)) { 1545 | var t_6 = t_7.length; 1546 | for(t_5=0; t_5 < t_7.length; t_5++) { 1547 | var t_8 = t_7[t_5][0]; 1548 | frame.set("[object Object]", t_7[t_5][0]); 1549 | var t_9 = t_7[t_5][1]; 1550 | frame.set("[object Object]", t_7[t_5][1]); 1551 | frame.set("loop.index", t_5 + 1); 1552 | frame.set("loop.index0", t_5); 1553 | frame.set("loop.revindex", t_6 - t_5); 1554 | frame.set("loop.revindex0", t_6 - t_5 - 1); 1555 | frame.set("loop.first", t_5 === 0); 1556 | frame.set("loop.last", t_5 === t_6 - 1); 1557 | frame.set("loop.length", t_6); 1558 | output += "\n "; 1559 | output += runtime.suppressValue(t_8, env.opts.autoescape); 1560 | output += ":"; 1561 | output += runtime.suppressValue(t_9, env.opts.autoescape); 1562 | output += "\n "; 1563 | ; 1564 | } 1565 | } else { 1566 | t_5 = -1; 1567 | var t_6 = runtime.keys(t_7).length; 1568 | for(var t_10 in t_7) { 1569 | t_5++; 1570 | var t_11 = t_7[t_10]; 1571 | frame.set("key", t_10); 1572 | frame.set("value", t_11); 1573 | frame.set("loop.index", t_5 + 1); 1574 | frame.set("loop.index0", t_5); 1575 | frame.set("loop.revindex", t_6 - t_5); 1576 | frame.set("loop.revindex0", t_6 - t_5 - 1); 1577 | frame.set("loop.first", t_5 === 0); 1578 | frame.set("loop.last", t_5 === t_6 - 1); 1579 | frame.set("loop.length", t_6); 1580 | output += "\n "; 1581 | output += runtime.suppressValue(t_10, env.opts.autoescape); 1582 | output += ":"; 1583 | output += runtime.suppressValue(t_11, env.opts.autoescape); 1584 | output += "\n "; 1585 | ; 1586 | } 1587 | } 1588 | } 1589 | frame = frame.pop(); 1590 | output += "\n "; 1591 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"links")) { 1592 | output += "\n "; 1593 | frame = frame.push(); 1594 | var t_14 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"links"); 1595 | if(t_14) {t_14 = runtime.fromIterator(t_14); 1596 | var t_12; 1597 | if(runtime.isArray(t_14)) { 1598 | var t_13 = t_14.length; 1599 | for(t_12=0; t_12 < t_14.length; t_12++) { 1600 | var t_15 = t_14[t_12][0]; 1601 | frame.set("[object Object]", t_14[t_12][0]); 1602 | var t_16 = t_14[t_12][1]; 1603 | frame.set("[object Object]", t_14[t_12][1]); 1604 | frame.set("loop.index", t_12 + 1); 1605 | frame.set("loop.index0", t_12); 1606 | frame.set("loop.revindex", t_13 - t_12); 1607 | frame.set("loop.revindex0", t_13 - t_12 - 1); 1608 | frame.set("loop.first", t_12 === 0); 1609 | frame.set("loop.last", t_12 === t_13 - 1); 1610 | frame.set("loop.length", t_13); 1611 | output += "\n "; 1614 | output += runtime.suppressValue(t_15, env.opts.autoescape); 1615 | output += "\n "; 1616 | ; 1617 | } 1618 | } else { 1619 | t_12 = -1; 1620 | var t_13 = runtime.keys(t_14).length; 1621 | for(var t_17 in t_14) { 1622 | t_12++; 1623 | var t_18 = t_14[t_17]; 1624 | frame.set("name", t_17); 1625 | frame.set("href", t_18); 1626 | frame.set("loop.index", t_12 + 1); 1627 | frame.set("loop.index0", t_12); 1628 | frame.set("loop.revindex", t_13 - t_12); 1629 | frame.set("loop.revindex0", t_13 - t_12 - 1); 1630 | frame.set("loop.first", t_12 === 0); 1631 | frame.set("loop.last", t_12 === t_13 - 1); 1632 | frame.set("loop.length", t_13); 1633 | output += "\n "; 1636 | output += runtime.suppressValue(t_17, env.opts.autoescape); 1637 | output += "\n "; 1638 | ; 1639 | } 1640 | } 1641 | } 1642 | frame = frame.pop(); 1643 | output += "\n "; 1644 | ; 1645 | } 1646 | output += "\n
\n \n\n\n"; 1647 | var macro_t_19 = runtime.makeMacro( 1648 | ["field_name", "field", "level"], 1649 | [], 1650 | function (l_field_name, l_field, l_level, kwargs) { 1651 | var callerFrame = frame; 1652 | frame = new runtime.Frame(); 1653 | kwargs = kwargs || {}; 1654 | if (Object.prototype.hasOwnProperty.call(kwargs, "caller")) { 1655 | frame.set("caller", kwargs.caller); } 1656 | frame.set("field_name", l_field_name); 1657 | frame.set("field", l_field); 1658 | frame.set("level", l_level); 1659 | var t_20 = "";t_20 += "\n"; 1660 | t_20 += runtime.suppressValue((lineno = 100, colno = 17, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, "render_partial"), "render_partial", context, ["partials/model_field.html",runtime.makeKeywordArgs({"nested": true,"field_name": l_field_name,"field": l_field,"level": l_level + 1})])), env.opts.autoescape); 1661 | t_20 += "\n\n\n"; 1662 | ; 1663 | frame = callerFrame; 1664 | return new runtime.SafeString(t_20); 1665 | }); 1666 | context.addExport("render_nested_partial"); 1667 | context.setVariable("render_nested_partial", macro_t_19); 1668 | output += "\n\n"; 1669 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"fields")) { 1670 | output += "\n"; 1671 | frame = frame.push(); 1672 | var t_23 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"fields"); 1673 | if(t_23) {t_23 = runtime.fromIterator(t_23); 1674 | var t_21; 1675 | if(runtime.isArray(t_23)) { 1676 | var t_22 = t_23.length; 1677 | for(t_21=0; t_21 < t_23.length; t_21++) { 1678 | var t_24 = t_23[t_21][0]; 1679 | frame.set("[object Object]", t_23[t_21][0]); 1680 | var t_25 = t_23[t_21][1]; 1681 | frame.set("[object Object]", t_23[t_21][1]); 1682 | frame.set("loop.index", t_21 + 1); 1683 | frame.set("loop.index0", t_21); 1684 | frame.set("loop.revindex", t_22 - t_21); 1685 | frame.set("loop.revindex0", t_22 - t_21 - 1); 1686 | frame.set("loop.first", t_21 === 0); 1687 | frame.set("loop.last", t_21 === t_22 - 1); 1688 | frame.set("loop.length", t_22); 1689 | output += "\n"; 1690 | output += runtime.suppressValue((lineno = 107, colno = 24, runtime.callWrap(macro_t_19, "render_nested_partial", context, [t_24,t_25,runtime.contextOrFrameLookup(context, frame, "level")])), env.opts.autoescape); 1691 | output += "\n"; 1692 | ; 1693 | } 1694 | } else { 1695 | t_21 = -1; 1696 | var t_22 = runtime.keys(t_23).length; 1697 | for(var t_26 in t_23) { 1698 | t_21++; 1699 | var t_27 = t_23[t_26]; 1700 | frame.set("field_name", t_26); 1701 | frame.set("field", t_27); 1702 | frame.set("loop.index", t_21 + 1); 1703 | frame.set("loop.index0", t_21); 1704 | frame.set("loop.revindex", t_22 - t_21); 1705 | frame.set("loop.revindex0", t_22 - t_21 - 1); 1706 | frame.set("loop.first", t_21 === 0); 1707 | frame.set("loop.last", t_21 === t_22 - 1); 1708 | frame.set("loop.length", t_22); 1709 | output += "\n"; 1710 | output += runtime.suppressValue((lineno = 107, colno = 24, runtime.callWrap(macro_t_19, "render_nested_partial", context, [t_26,t_27,runtime.contextOrFrameLookup(context, frame, "level")])), env.opts.autoescape); 1711 | output += "\n"; 1712 | ; 1713 | } 1714 | } 1715 | } 1716 | frame = frame.pop(); 1717 | output += "\n"; 1718 | ; 1719 | } 1720 | output += "\n\n"; 1721 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"items")) { 1722 | output += "\n"; 1723 | output += runtime.suppressValue((lineno = 112, colno = 24, runtime.callWrap(macro_t_19, "render_nested_partial", context, ["item",runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "field")),"items"),runtime.contextOrFrameLookup(context, frame, "level")])), env.opts.autoescape); 1724 | output += "\n"; 1725 | ; 1726 | } 1727 | if(parentTemplate) { 1728 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 1729 | } else { 1730 | cb(null, output); 1731 | } 1732 | ; 1733 | } catch (e) { 1734 | cb(runtime.handleError(e, lineno, colno)); 1735 | } 1736 | } 1737 | return { 1738 | root: root 1739 | }; 1740 | 1741 | })(); 1742 | })(); 1743 | (function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})["partials/server.html"] = (function() { 1744 | function root(env, context, frame, runtime, cb) { 1745 | var lineno = 0; 1746 | var colno = 0; 1747 | var output = ""; 1748 | try { 1749 | var parentTemplate = null; 1750 | output += "
  • \n
    \n
    \n
    \n
    Server
    \n
    "; 1751 | output += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, "server_name"), env.opts.autoescape); 1752 | output += "
    \n
    \n
    \n
    \n\n "; 1753 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"environment")) { 1754 | output += "\n
    \n
    \n
    \n
    Environment
    \n
    "; 1755 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"environment"), env.opts.autoescape); 1756 | output += "
    \n
    \n
    \n
    \n "; 1757 | ; 1758 | } 1759 | output += "\n\n "; 1760 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"type")) { 1761 | output += "\n
    \n
    \n
    \n
    Type
    \n
    "; 1762 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"type"), env.opts.autoescape); 1763 | output += "
    \n
    \n
    \n
    \n "; 1764 | ; 1765 | } 1766 | output += "\n\n "; 1767 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"project")) { 1768 | output += "\n
    \n
    \n
    \n
    Project
    \n
    "; 1769 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"project"), env.opts.autoescape); 1770 | output += "
    \n
    \n
    \n
    \n "; 1771 | ; 1772 | } 1773 | output += "\n\n "; 1774 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"dataset")) { 1775 | output += "\n
    \n
    \n
    \n
    Dataset
    \n
    "; 1776 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"dataset"), env.opts.autoescape); 1777 | output += "
    \n
    \n
    \n
    \n "; 1778 | ; 1779 | } 1780 | output += "\n\n "; 1781 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"location")) { 1782 | output += "\n
    \n
    \n
    \n
    Location
    \n
    "; 1783 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"location"), env.opts.autoescape); 1784 | output += "
    \n
    \n
    \n
    \n "; 1785 | ; 1786 | } 1787 | output += "\n\n "; 1788 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"endpointUrl")) { 1789 | output += "\n
    \n
    \n
    \n
    Endpoint URL
    \n
    "; 1790 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"endpointUrl"), env.opts.autoescape); 1791 | output += "
    \n
    \n
    \n
    \n "; 1792 | ; 1793 | } 1794 | output += "\n\n "; 1795 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"account")) { 1796 | output += "\n
    \n
    \n
    \n
    Account
    \n
    "; 1797 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"account"), env.opts.autoescape); 1798 | output += "
    \n
    \n
    \n
    \n "; 1799 | ; 1800 | } 1801 | output += "\n\n "; 1802 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"host")) { 1803 | output += "\n
    \n
    \n
    \n
    Host
    \n
    "; 1804 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"host"), env.opts.autoescape); 1805 | output += "
    \n
    \n
    \n
    \n "; 1806 | ; 1807 | } 1808 | output += "\n\n "; 1809 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"port")) { 1810 | output += "\n
    \n
    \n
    \n
    Port
    \n
    "; 1811 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"port"), env.opts.autoescape); 1812 | output += "
    \n
    \n
    \n
    \n "; 1813 | ; 1814 | } 1815 | output += "\n\n "; 1816 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"catalog")) { 1817 | output += "\n
    \n
    \n
    \n
    Catalog
    \n
    "; 1818 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"catalog"), env.opts.autoescape); 1819 | output += "
    \n
    \n
    \n
    \n "; 1820 | ; 1821 | } 1822 | output += "\n\n "; 1823 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"database")) { 1824 | output += "\n
    \n
    \n
    \n
    Database
    \n
    "; 1825 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"database"), env.opts.autoescape); 1826 | output += "
    \n
    \n
    \n
    \n "; 1827 | ; 1828 | } 1829 | output += "\n\n "; 1830 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"schema_")) { 1831 | output += "\n
    \n
    \n
    \n
    Schema
    \n
    "; 1832 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"schema_"), env.opts.autoescape); 1833 | output += "
    \n
    \n
    \n
    \n "; 1834 | ; 1835 | } 1836 | output += "\n\n "; 1837 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"topic")) { 1838 | output += "\n
    \n
    \n
    \n
    Topic
    \n
    "; 1839 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"topic"), env.opts.autoescape); 1840 | output += "
    \n
    \n
    \n
    \n "; 1841 | ; 1842 | } 1843 | output += "\n\n "; 1844 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"path")) { 1845 | output += "\n
    \n
    \n
    \n
    Path
    \n
    "; 1846 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"path"), env.opts.autoescape); 1847 | output += "
    \n
    \n
    \n
    \n "; 1848 | ; 1849 | } 1850 | output += "\n\n "; 1851 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"format")) { 1852 | output += "\n
    \n
    \n
    \n
    Format
    \n
    "; 1853 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"format"), env.opts.autoescape); 1854 | output += "
    \n
    \n
    \n
    \n "; 1855 | ; 1856 | } 1857 | output += "\n\n "; 1858 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"delimiter")) { 1859 | output += "\n
    \n
    \n
    \n
    Delimiter
    \n
    "; 1860 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"delimiter"), env.opts.autoescape); 1861 | output += "
    \n
    \n
    \n
    \n "; 1862 | ; 1863 | } 1864 | output += "\n\n "; 1865 | if(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"description")) { 1866 | output += "\n
    \n
    \n
    \n
    Description
    \n
    "; 1867 | output += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"description"), env.opts.autoescape); 1868 | output += "
    \n
    \n
    \n
    \n "; 1869 | ; 1870 | } 1871 | output += "\n\n "; 1872 | frame = frame.push(); 1873 | var t_3 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, "server")),"model_extra"); 1874 | if(t_3) {t_3 = runtime.fromIterator(t_3); 1875 | var t_1; 1876 | if(runtime.isArray(t_3)) { 1877 | var t_2 = t_3.length; 1878 | for(t_1=0; t_1 < t_3.length; t_1++) { 1879 | var t_4 = t_3[t_1][0]; 1880 | frame.set("[object Object]", t_3[t_1][0]); 1881 | var t_5 = t_3[t_1][1]; 1882 | frame.set("[object Object]", t_3[t_1][1]); 1883 | frame.set("loop.index", t_1 + 1); 1884 | frame.set("loop.index0", t_1); 1885 | frame.set("loop.revindex", t_2 - t_1); 1886 | frame.set("loop.revindex0", t_2 - t_1 - 1); 1887 | frame.set("loop.first", t_1 === 0); 1888 | frame.set("loop.last", t_1 === t_2 - 1); 1889 | frame.set("loop.length", t_2); 1890 | output += "\n
    \n
    \n
    \n
    "; 1891 | output += runtime.suppressValue(t_4, env.opts.autoescape); 1892 | output += "
    \n
    "; 1893 | output += runtime.suppressValue(t_5, env.opts.autoescape); 1894 | output += "
    \n
    \n
    \n
    \n "; 1895 | ; 1896 | } 1897 | } else { 1898 | t_1 = -1; 1899 | var t_2 = runtime.keys(t_3).length; 1900 | for(var t_6 in t_3) { 1901 | t_1++; 1902 | var t_7 = t_3[t_6]; 1903 | frame.set("key", t_6); 1904 | frame.set("value", t_7); 1905 | frame.set("loop.index", t_1 + 1); 1906 | frame.set("loop.index0", t_1); 1907 | frame.set("loop.revindex", t_2 - t_1); 1908 | frame.set("loop.revindex0", t_2 - t_1 - 1); 1909 | frame.set("loop.first", t_1 === 0); 1910 | frame.set("loop.last", t_1 === t_2 - 1); 1911 | frame.set("loop.length", t_2); 1912 | output += "\n
    \n
    \n
    \n
    "; 1913 | output += runtime.suppressValue(t_6, env.opts.autoescape); 1914 | output += "
    \n
    "; 1915 | output += runtime.suppressValue(t_7, env.opts.autoescape); 1916 | output += "
    \n
    \n
    \n
    \n "; 1917 | ; 1918 | } 1919 | } 1920 | } 1921 | frame = frame.pop(); 1922 | output += "\n\n
  • "; 1923 | if(parentTemplate) { 1924 | parentTemplate.rootRenderFunc(env, context, frame, runtime, cb); 1925 | } else { 1926 | cb(null, output); 1927 | } 1928 | ; 1929 | } catch (e) { 1930 | cb(runtime.handleError(e, lineno, colno)); 1931 | } 1932 | } 1933 | return { 1934 | root: root 1935 | }; 1936 | 1937 | })(); 1938 | })(); 1939 | 1940 | -------------------------------------------------------------------------------- /src/ui/elements/editor-element.js: -------------------------------------------------------------------------------- 1 | import { LitElement, html } from "lit"; 2 | import * as monaco from "monaco-editor"; 3 | import { MarkerSeverity } from "monaco-editor"; 4 | 5 | import { loadInitialDocument, storeDataContractYaml } from "../../storage/storage.js"; 6 | 7 | export class EditorElement extends LitElement { 8 | get editor() { 9 | return this.querySelector("#editor"); 10 | } 11 | 12 | render() { 13 | return html`
    `; 14 | } 15 | 16 | // render in the Light DOM 17 | createRenderRoot() { 18 | return this; 19 | } 20 | 21 | // after the first render, setup the editor 22 | firstUpdated() { 23 | // load initial content 24 | const value = loadInitialDocument(); 25 | 26 | // create a model and the editor 27 | const model = monaco.editor.createModel( 28 | value, 29 | "yaml", 30 | monaco.Uri.parse("file:///datacontract.yaml") 31 | ); 32 | const editor = monaco.editor.create(this.editor, { 33 | model: model, 34 | language: "yaml", 35 | automaticLayout: true, 36 | minimap: { 37 | enabled: false, 38 | }, 39 | fixedOverflowWidgets: true, 40 | scrollBeyondLastLine: false, 41 | }); 42 | 43 | // store changes to the content to local storage and emit the new content 44 | editor.onDidChangeModelContent(() => { 45 | const content = editor.getValue(); 46 | storeDataContractYaml(content); 47 | this.dispatchEvent(new CustomEvent('editor-content-changed', { detail: { content } })); 48 | }); 49 | 50 | // set up to detect editor errors and emit them 51 | monaco.editor.onDidChangeMarkers((resource) => { 52 | const markers = monaco.editor.getModelMarkers({resource}); 53 | const validationErrors = markers 54 | .filter((marker) => marker.severity !== MarkerSeverity.Hint) 55 | .map((marker) => ({ 56 | text: marker.message, 57 | level: "ERROR", 58 | lineNumber: marker.startLineNumber, 59 | column: marker.startColumn 60 | })) 61 | 62 | this.dispatchEvent(new CustomEvent('editor-errors', { detail: { validationErrors } })); 63 | }); 64 | 65 | 66 | // make sure the editor re-renders itself on window resizes 67 | const resizeObserver = new ResizeObserver(() => { 68 | editor.layout(); 69 | }); 70 | resizeObserver.observe(this.editor); 71 | 72 | // do an initial dispatch of content 73 | setTimeout(() => { 74 | this.dispatchEvent(new CustomEvent('editor-content-changed', { detail: { content: editor.getValue() } })); 75 | }, 200); 76 | } 77 | } 78 | customElements.define("dce-editor", EditorElement); 79 | -------------------------------------------------------------------------------- /src/ui/elements/error-list-element.js: -------------------------------------------------------------------------------- 1 | import { LitElement, html } from "lit"; 2 | import * as monaco from "monaco-editor"; 3 | 4 | export class ErrorListElement extends LitElement { 5 | 6 | static properties = { 7 | errors: { type: Array, attribute: false } 8 | } 9 | 10 | constructor() { 11 | super(); 12 | this.errors = []; 13 | } 14 | 15 | get editor() { 16 | return monaco.editor.getEditors()[0]; 17 | } 18 | 19 | render() { 20 | return html`${this.errors.length ? this.renderErrors(): ''}`; 21 | } 22 | 23 | // render in the Light DOM 24 | createRenderRoot() { 25 | return this; 26 | } 27 | 28 | renderErrors() { 29 | return html` 30 |
    31 |
    32 |
    33 | 36 |
    37 |
    38 |

    YAML schema validation failed

    39 |
    40 |
      41 | ${this.errors.map((error) => html` 42 |
    • Line ${error.lineNumber}: ${error.text} 47 |
    • 48 | `)} 49 |
    50 |
    51 |
    52 |
    53 |
    54 | `; 55 | } 56 | 57 | handleClick(e) { 58 | this.editor.setPosition({ 59 | lineNumber: parseInt(e.target.dataset.linenumber), 60 | column: parseInt(e.target.dataset.column), 61 | }); 62 | this.editor.focus(); 63 | } 64 | 65 | } 66 | customElements.define("dce-error-list", ErrorListElement); 67 | -------------------------------------------------------------------------------- /src/ui/elements/nav-element.js: -------------------------------------------------------------------------------- 1 | import { LitElement, html } from "lit"; 2 | import * as monaco from "monaco-editor"; 3 | 4 | import { getExample, getMinimal } from "../../templates/examples.js"; 5 | import {encodeYamlCode} from "../../sharing/encoding.js"; 6 | 7 | export class NavElement extends LitElement { 8 | 9 | static properties = { 10 | showNotification: { type: Boolean, attribute: false } 11 | } 12 | 13 | notificationTitle = ''; 14 | notificationText = ''; 15 | 16 | render() { 17 | return html` 352 | ${this.showNotification ? this.renderNotification(): ''} 353 | `; 354 | } 355 | 356 | // render in the Light DOM 357 | createRenderRoot() { 358 | return this; 359 | } 360 | 361 | get editor() { 362 | return monaco.editor.getEditors()[0]; 363 | } 364 | 365 | connectedCallback() { 366 | super.connectedCallback(); 367 | // setup listener for menu autoclose 368 | this.clickListener = document.addEventListener('click', (event) => { 369 | // if the click was inside one of our two menus, do nothing 370 | if (event.target.closest('#file_menu') || event.target.closest('#menu-file')) { 371 | return; 372 | } 373 | if (event.target.closest('#about_menu') || event.target.closest('#menu-about')) { 374 | return; 375 | } 376 | // otherwise check if any of the menus are open and close them 377 | if (this.aboutMenuOpen()) { 378 | this.toggleAboutMenu(); 379 | } 380 | if (this.fileMenuOpen()) { 381 | this.toggleFileMenu(); 382 | } 383 | 384 | }, false); 385 | } 386 | 387 | disconnectedCallback() { 388 | super.disconnectedCallback(); 389 | // remove the listener, when we disconnect 390 | document.removeEventListener(this.clickListener); 391 | } 392 | 393 | renderNotification() { 394 | return html`

    ${this.notificationTitle}

    ${this.notificationText}

    `; 395 | } 396 | 397 | toggleNotification() { 398 | if (this.showNotification) { 399 | this.hideNotification(); 400 | } else { 401 | this.displayNotification(); 402 | } 403 | } 404 | 405 | async hideNotification() { 406 | this.querySelector('#notification').classList.toggle("opacity-0"); 407 | await new Promise(resolve => setTimeout(resolve, 300)); 408 | this.showNotification = false; 409 | } 410 | 411 | async displayNotification() { 412 | this.showNotification = true; 413 | await new Promise(resolve => setTimeout(resolve, 100)); 414 | this.querySelector('#notification').classList.toggle("opacity-0"); 415 | } 416 | 417 | notifyUser(title, text) { 418 | this.notificationTitle = title; 419 | this.notificationText = text; 420 | this.toggleNotification(); 421 | setTimeout(() => this.toggleNotification(), 3000); 422 | } 423 | 424 | fileMenuOpen() { 425 | return !this.querySelector("#file_menu")?.classList.contains("hidden"); 426 | } 427 | 428 | aboutMenuOpen() { 429 | return !this.querySelector("#about_menu")?.classList.contains("hidden"); 430 | } 431 | 432 | toggleFileMenu() { 433 | this.querySelector("#file_menu")?.classList.toggle("hidden"); 434 | } 435 | 436 | toggleAboutMenu() { 437 | this.querySelector("#about_menu")?.classList.toggle("hidden"); 438 | } 439 | 440 | async handleOpenFile() { 441 | this.toggleFileMenu(); 442 | 443 | if (window.showOpenFilePicker) { 444 | const [fileHandle] = await window.showOpenFilePicker({ 445 | types: [{ description: "YAML Data Contracts", accept: { "text/plain": [".yml", ".yaml", ".txt"]} }] 446 | }); 447 | const file = await fileHandle.getFile(); 448 | const content = await file.text(); 449 | this.editor.setValue(content); 450 | this.notifyUser('Datacontract loaded', 'Content loaded into the editor'); 451 | } else { 452 | const fileInput = document.createElement('input'); 453 | fileInput.setAttribute('type', 'file'); 454 | fileInput.setAttribute('class', 'hidden'); 455 | fileInput.addEventListener('change', async () => { 456 | const file = fileInput.files.item(0); 457 | const content = await file.text() 458 | this.editor.setValue(content); 459 | this.notifyUser('Datacontract loaded', 'Content loaded into the editor'); 460 | fileInput.remove(); 461 | }); 462 | document.body.appendChild(fileInput); 463 | fileInput.click(); 464 | } 465 | } 466 | 467 | handleLoadMinimal() { 468 | const content = getMinimal(); 469 | this.editor.setValue(content); 470 | this.toggleFileMenu(); 471 | } 472 | 473 | handleLoadExample() { 474 | const content = getExample(); 475 | this.editor.setValue(content); 476 | this.toggleFileMenu(); 477 | } 478 | 479 | async handleSave() { 480 | this.toggleFileMenu(); 481 | const fileContent = this.editor.getValue(); 482 | if (window.showSaveFilePicker) { 483 | const handle = await window.showSaveFilePicker({ 484 | types: [{ description: "YAML Data Contracts", accept: { "text/plain": [".yml", ".yaml", ".txt"]} }] 485 | }); 486 | let stream = await handle.createWritable(); 487 | try { 488 | await stream.write(fileContent); 489 | } finally { 490 | await stream.close(); 491 | this.notifyUser('Datacontract saved', 'File saved successfully'); 492 | } 493 | } else { 494 | const bb = new Blob([fileContent], { type: 'text/plain' }); 495 | const a = document.createElement('a'); 496 | a.download = 'datacontract.yaml'; 497 | a.href = window.URL.createObjectURL(bb); 498 | a.click(); 499 | a.remove(); 500 | } 501 | 502 | } 503 | 504 | handleShare() { 505 | 506 | 507 | encodeYamlCode(this.editor.getValue()).then((encodedYaml) => { 508 | const shareUrl = `${location.protocol}//${location.host}/?dc=${encodedYaml}`; 509 | navigator.clipboard.writeText(shareUrl); 510 | this.toggleFileMenu(); 511 | this.notifyUser('Sharing prepared', 'Sharelink copied to Clipboard'); 512 | }); 513 | } 514 | 515 | handleClear() { 516 | this.editor.setValue(""); 517 | this.toggleFileMenu(); 518 | } 519 | } 520 | customElements.define("dce-nav", NavElement); 521 | -------------------------------------------------------------------------------- /src/ui/elements/preview-pane-element.js: -------------------------------------------------------------------------------- 1 | import { LitElement, html } from "lit"; 2 | import { unsafeHTML } from 'lit/directives/unsafe-html.js'; 3 | import { renderParsingError } from "../../templates/parsing-error.js"; 4 | import { renderDataContract } from "../../templates/render.js"; 5 | 6 | import parserWorker from '../..//workers/parser.worker.js?worker'; 7 | 8 | export class PreviewPaneElement extends LitElement { 9 | static properties = { 10 | document: { type: String, attribute: false }, 11 | parsedContent: { type: String, state: true }, 12 | }; 13 | 14 | render() { 15 | return html`${unsafeHTML(this.parsedContent)}`; 16 | } 17 | 18 | // render in the Light DOM 19 | createRenderRoot() { 20 | return this; 21 | } 22 | 23 | connectedCallback() { 24 | super.connectedCallback(); 25 | this.parserWorker = new parserWorker(); 26 | this.parserWorker.onmessage = this.workerMessage.bind(this); 27 | } 28 | 29 | updated(changedProperties) { 30 | super.updated(changedProperties); 31 | if (changedProperties.has('document')) { 32 | this.parserWorker.postMessage({ 33 | command: "parse", 34 | dataContractYaml: this.document, 35 | }); 36 | } 37 | } 38 | 39 | workerMessage(message) { 40 | if (message.data.status === "error") { 41 | console.log(message.data.error); 42 | this.parsedContent = renderParsingError(message.data.error.message); 43 | } 44 | if (message.data.status === "success") { 45 | this.parsedContent = renderDataContract(message.data.json); 46 | } 47 | } 48 | } 49 | customElements.define("dce-preview-pane", PreviewPaneElement); 50 | -------------------------------------------------------------------------------- /src/workers/editor.worker.js: -------------------------------------------------------------------------------- 1 | import 'monaco-editor/esm/vs/editor/editor.worker.js'; 2 | 3 | -------------------------------------------------------------------------------- /src/workers/monaco.workers.js: -------------------------------------------------------------------------------- 1 | import editorWorker from './editor.worker.js?worker'; 2 | import yamlWorker from './yaml.worker.js?worker'; 3 | 4 | self.MonacoEnvironment = { 5 | getWorker(_, label) { 6 | if (label === 'yaml') { 7 | return new yamlWorker(); 8 | } 9 | return new editorWorker(); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /src/workers/parser.worker.js: -------------------------------------------------------------------------------- 1 | import yaml from "js-yaml"; 2 | 3 | /* 4 | * Parsing YAML takes time. We do not want to block the main rendering thread. 5 | * That's why we do the YAML parsing in a separate worker thread. 6 | */ 7 | 8 | self.onmessage = function(message) { 9 | if (message.data.command === "parse") { 10 | try { 11 | const jsonContent = yaml.load(message.data.dataContractYaml); 12 | 13 | postMessage({status: "success", json: jsonContent}); 14 | } catch (e) { 15 | postMessage({status: "error", error: e}); 16 | } 17 | } 18 | }; 19 | -------------------------------------------------------------------------------- /src/workers/yaml.worker.js: -------------------------------------------------------------------------------- 1 | import 'monaco-yaml/yaml.worker.js'; 2 | 3 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ["./src/**/*.{html,js}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [], 8 | } 9 | 10 | --------------------------------------------------------------------------------