@omicronenergy/oscd-scl-dialogs 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/custom-elements.json +5 -1
- package/dist/OscdTextEditor.d.ts +3 -4
- package/dist/OscdTextEditor.js +19 -2
- package/dist/OscdTextEditor.js.map +1 -1
- package/package.json +3 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.9](https://github.com/OMICRONEnergyOSS/oscd-scl-dialogs/compare/oscd-scl-dialogs-v0.0.8...oscd-scl-dialogs-v0.0.9) (2026-02-16)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* ace-editor should not end up on the global customElement reg ([f8680ff](https://github.com/OMICRONEnergyOSS/oscd-scl-dialogs/commit/f8680ffb6414c1a3501029712effb7a412ca60c9))
|
|
9
|
+
|
|
3
10
|
## [0.0.8](https://github.com/OMICRONEnergyOSS/oscd-scl-dialogs/compare/oscd-scl-dialogs-v0.0.7...oscd-scl-dialogs-v0.0.8) (2026-02-15)
|
|
4
11
|
|
|
5
12
|
|
package/custom-elements.json
CHANGED
|
@@ -328,7 +328,7 @@
|
|
|
328
328
|
"text": "object"
|
|
329
329
|
},
|
|
330
330
|
"static": true,
|
|
331
|
-
"default": "{ 'ace-editor': AceEditor, }"
|
|
331
|
+
"default": "{ // Left here for clarity sake. We need to dyn-import this so we have a chance of overriding the customElements.define to prevent // ace-editor from being registered globally and causing issues with other instances of ace-editor in the same document. //'ace-editor': AceEditor, }"
|
|
332
332
|
},
|
|
333
333
|
{
|
|
334
334
|
"kind": "field",
|
|
@@ -394,6 +394,10 @@
|
|
|
394
394
|
"name": "styles",
|
|
395
395
|
"static": true,
|
|
396
396
|
"default": "css` :host { height: 100%; width: 100%; overflow: auto; } ace-editor { height: 100%; width: 100%; } `"
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
"kind": "field",
|
|
400
|
+
"name": "define"
|
|
397
401
|
}
|
|
398
402
|
],
|
|
399
403
|
"events": [
|
package/dist/OscdTextEditor.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import 'ace-builds/src-noconflict/ace.js';
|
|
|
4
4
|
import 'ace-builds/src-noconflict/theme-sqlserver.js';
|
|
5
5
|
import 'ace-builds/src-noconflict/mode-xml.js';
|
|
6
6
|
import 'ace-builds/src-noconflict/ext-searchbox.js';
|
|
7
|
-
import AceEditor from 'ace-custom-element';
|
|
7
|
+
import type AceEditor from 'ace-custom-element';
|
|
8
8
|
import { EditV2 } from '@openscd/oscd-api';
|
|
9
9
|
declare global {
|
|
10
10
|
interface Window {
|
|
@@ -25,9 +25,8 @@ declare class BaseElement extends BaseElement_base {
|
|
|
25
25
|
* Intent is to keep this generic so it can be migrated to oscd-ui.
|
|
26
26
|
*/
|
|
27
27
|
export default class OscdTextEditor extends BaseElement {
|
|
28
|
-
static scopedElements: {
|
|
29
|
-
|
|
30
|
-
};
|
|
28
|
+
static scopedElements: {};
|
|
29
|
+
constructor();
|
|
31
30
|
value: string | undefined;
|
|
32
31
|
aceEditor: AceEditor;
|
|
33
32
|
format(): void;
|
package/dist/OscdTextEditor.js
CHANGED
|
@@ -6,7 +6,6 @@ import 'ace-builds/src-noconflict/ace.js';
|
|
|
6
6
|
import 'ace-builds/src-noconflict/theme-sqlserver.js';
|
|
7
7
|
import 'ace-builds/src-noconflict/mode-xml.js';
|
|
8
8
|
import 'ace-builds/src-noconflict/ext-searchbox.js';
|
|
9
|
-
import AceEditor from 'ace-custom-element';
|
|
10
9
|
const serializer = new XMLSerializer();
|
|
11
10
|
const parser = new DOMParser();
|
|
12
11
|
const ACE_DEFAULT_OPTIONS = {
|
|
@@ -133,6 +132,22 @@ class BaseElement extends ScopedElementsMixin(LitElement) {
|
|
|
133
132
|
* Intent is to keep this generic so it can be migrated to oscd-ui.
|
|
134
133
|
*/
|
|
135
134
|
class OscdTextEditor extends BaseElement {
|
|
135
|
+
constructor() {
|
|
136
|
+
super();
|
|
137
|
+
// Special handling to prevent ace-editor from being registered globally, which would cause issues with multiple instances in the same document.
|
|
138
|
+
// This will all go away once the oscd-ui version is implemented and this project is migrated to oscd-ui
|
|
139
|
+
const customElementsDefineFn = window.customElements.define;
|
|
140
|
+
window.customElements.define = (name, constructor) => {
|
|
141
|
+
if (name !== 'ace-editor') {
|
|
142
|
+
return customElementsDefineFn(name, constructor);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
import('ace-custom-element').then(AceEditor => {
|
|
146
|
+
if (!this.registry?.get('ace-editor')) {
|
|
147
|
+
this.registry?.define('ace-editor', AceEditor.default);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
136
151
|
format() {
|
|
137
152
|
const rawXml = this.aceEditor?.editor?.getSelectedText() || this.aceEditor.value;
|
|
138
153
|
let initialIndent = '';
|
|
@@ -198,7 +213,9 @@ class OscdTextEditor extends BaseElement {
|
|
|
198
213
|
}
|
|
199
214
|
}
|
|
200
215
|
OscdTextEditor.scopedElements = {
|
|
201
|
-
|
|
216
|
+
// Left here for clarity sake. We need to dyn-import this so we have a chance of overriding the customElements.define to prevent
|
|
217
|
+
// ace-editor from being registered globally and causing issues with other instances of ace-editor in the same document.
|
|
218
|
+
//'ace-editor': AceEditor,
|
|
202
219
|
};
|
|
203
220
|
OscdTextEditor.styles = css `
|
|
204
221
|
:host {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OscdTextEditor.js","sourceRoot":"","sources":["../OscdTextEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css, type PropertyValueMap } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements/lit-element.js';\nimport type * as AceGlobal from 'ace-builds';\nimport 'ace-builds/src-noconflict/ace.js';\nimport 'ace-builds/src-noconflict/theme-sqlserver.js';\nimport 'ace-builds/src-noconflict/mode-xml.js';\nimport 'ace-builds/src-noconflict/ext-searchbox.js';\nimport AceEditor from 'ace-custom-element';\nimport { EditV2 } from '@openscd/oscd-api';\n\ndeclare global {\n interface Window {\n ace: typeof AceGlobal;\n }\n}\n\nconst serializer = new XMLSerializer();\nconst parser = new DOMParser();\n\nconst ACE_DEFAULT_OPTIONS = {\n fontSize: '14',\n theme: 'ace/theme/sqlserver',\n mode: 'ace/mode/xml',\n};\nconst storageKey = 'oscd:ace-options';\n\nconst getStoredAceOptions = (): Omit<\n Partial<AceGlobal.Ace.EditorOptions>,\n 'theme' | 'mode'\n> &\n Pick<AceGlobal.Ace.EditorOptions, 'theme' | 'mode'> => {\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n return {\n ...ACE_DEFAULT_OPTIONS,\n ...JSON.parse(stored),\n };\n }\n } catch (error) {\n console.warn('Failed to retrieve Ace options from storage:', error);\n }\n return ACE_DEFAULT_OPTIONS;\n};\n\nlet aceOptions = getStoredAceOptions();\n\nfunction manageAceOptionChange(editor: AceGlobal.Ace.Editor) {\n editor.setOptions(aceOptions);\n\n const originalSetOption = editor.setOption.bind(editor);\n const originalSetOptions = editor.setOptions.bind(editor);\n const persistOptions = () => {\n try {\n aceOptions = {\n ...ACE_DEFAULT_OPTIONS,\n ...editor.getOptions(),\n };\n localStorage.setItem(storageKey, JSON.stringify(aceOptions));\n } catch (error) {\n console.warn('Failed to store Ace options:', error);\n }\n };\n\n editor.setOption = (name: string, value: unknown) => {\n originalSetOption(\n name as keyof AceGlobal.Ace.EditorOptions,\n value as never,\n );\n persistOptions();\n };\n\n editor.setOptions = (options: Partial<AceGlobal.Ace.EditorOptions>) => {\n originalSetOptions(options);\n persistOptions();\n };\n}\n\nexport function parseXml(xml: string): XMLDocument {\n const parsed = parser.parseFromString(xml, 'application/xml');\n const parseError = parsed.querySelector('parsererror');\n if (parseError) {\n const error = new Error(parseError.textContent ?? 'Invalid XML');\n console.error('XML Parsing Error:', error);\n }\n return parsed;\n}\n\nexport function serializeXml(xml: XMLDocument | Element): string {\n return serializer.serializeToString(xml);\n}\n\nexport function formatXml(\n rawXml: string | undefined,\n initialIndent: string = '',\n): string {\n if (!rawXml) {\n return '';\n }\n\n // Trim leading and trailing whitespace to avoid injecting extra < or >\n const xml = rawXml.trim();\n\n let formatted = '';\n let indent = '';\n\n const tab = '\\t';\n const nodes = xml.split(/>\\s*</);\n nodes.forEach(function (node, index) {\n // Remove leading < from first node and trailing > from last node. Allow for selection leading or trailing whitespace.\n if (index === 0) {\n node = node.replace(/^\\s*</, '');\n }\n if (index === nodes.length - 1) {\n node = node.replace(/>\\s*$/, '');\n }\n\n if (node.match(/^\\/\\w/)) {\n indent = indent.substring(tab!.length);\n }\n formatted += initialIndent + indent + '<' + node + '>\\r\\n';\n if (node.match(/^<?\\w[^>]*[^/]$/)) {\n indent += tab;\n }\n });\n\n return formatted.trim();\n}\n\nexport function newOscdTextEditV2({\n element,\n newText,\n}: {\n element: Element;\n newText: string;\n}): EditV2[] | null {\n let newDoc: XMLDocument | null = null;\n try {\n newDoc = newText ? parseXml(newText) : null;\n } catch (error) {\n console.error('Failed to parse XML:', error);\n return null;\n }\n if (element) {\n // get the parent and if we don't have a parent, use the documentElement\n const parent = element.parentElement ?? element.ownerDocument;\n const nextSibling = element.nextSibling ?? null;\n const newElement = newDoc\n ? element.ownerDocument.importNode(newDoc?.documentElement, true)\n : null;\n\n return [\n { node: element },\n ...(newElement\n ? [\n {\n node: newElement,\n parent,\n reference: nextSibling,\n },\n ]\n : []),\n ] as EditV2[];\n }\n return null;\n}\n\nclass BaseElement extends ScopedElementsMixin(LitElement) {}\n\n/**\n * Intent is to keep this generic so it can be migrated to oscd-ui.\n */\nexport default class OscdTextEditor extends BaseElement {\n static scopedElements = {\n 'ace-editor': AceEditor,\n };\n\n @property()\n value: string | undefined;\n\n @query('ace-editor')\n aceEditor!: AceEditor;\n\n public format() {\n const rawXml =\n this.aceEditor?.editor?.getSelectedText() || this.aceEditor.value;\n\n let initialIndent = '';\n if (this.aceEditor?.editor?.getSelectedText()) {\n const range = this.aceEditor.editor.getSelectionRange();\n // Get the starting line of the selection and detect its leading whitespace\n const startLine = range.start.row;\n const lineContent = this.aceEditor.editor.session.getLine(startLine);\n initialIndent = lineContent.match(/^(\\s*)/)?.[1] || '';\n }\n\n const formatted = formatXml(rawXml, initialIndent);\n if (this.aceEditor?.editor?.getSelectedText()) {\n const range = this.aceEditor.editor.getSelectionRange();\n // Remove the trailing \\r\\n\n this.aceEditor.editor.session.replace(\n range,\n formatted.substring(0, formatted.length - 2),\n );\n } else {\n this.value = formatted;\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n window.ace?.config?.addEventListener?.('editor', manageAceOptionChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n window.ace?.config?.removeEventListener?.('editor', manageAceOptionChange);\n }\n\n private handleAceChange(e: CustomEvent<string>): void {\n if (typeof e.detail !== 'string') {\n return;\n }\n\n if (this.value !== e.detail) {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: e.detail,\n }),\n );\n }\n }\n\n protected updated(changedProps: PropertyValueMap<OscdTextEditor>): void {\n if (changedProps.has('value')) {\n // Clear selection when content updates\n setTimeout(() => {\n if (this.aceEditor?.editor) {\n /* For reasons unknown the ace editor initially selects all code, so we need to clear that*/\n this.aceEditor.editor.selection.clearSelection();\n this.aceEditor.editor.moveCursorTo(0, 0);\n }\n }, 10);\n }\n }\n\n render() {\n return html`\n <ace-editor\n .value=${this.value}\n mode=${aceOptions.mode}\n theme=${aceOptions.theme}\n @change=${(e: CustomEvent<string>) => {\n this.handleAceChange(e);\n }}\n >\n </ace-editor>\n `;\n }\n\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n overflow: auto;\n }\n\n ace-editor {\n height: 100%;\n width: 100%;\n }\n `;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"OscdTextEditor.js","sourceRoot":"","sources":["../OscdTextEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css, type PropertyValueMap } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements/lit-element.js';\nimport type * as AceGlobal from 'ace-builds';\nimport 'ace-builds/src-noconflict/ace.js';\nimport 'ace-builds/src-noconflict/theme-sqlserver.js';\nimport 'ace-builds/src-noconflict/mode-xml.js';\nimport 'ace-builds/src-noconflict/ext-searchbox.js';\nimport type AceEditor from 'ace-custom-element';\n\nimport { EditV2 } from '@openscd/oscd-api';\n\ndeclare global {\n interface Window {\n ace: typeof AceGlobal;\n }\n}\n\nconst serializer = new XMLSerializer();\nconst parser = new DOMParser();\n\nconst ACE_DEFAULT_OPTIONS = {\n fontSize: '14',\n theme: 'ace/theme/sqlserver',\n mode: 'ace/mode/xml',\n};\nconst storageKey = 'oscd:ace-options';\n\nconst getStoredAceOptions = (): Omit<\n Partial<AceGlobal.Ace.EditorOptions>,\n 'theme' | 'mode'\n> &\n Pick<AceGlobal.Ace.EditorOptions, 'theme' | 'mode'> => {\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n return {\n ...ACE_DEFAULT_OPTIONS,\n ...JSON.parse(stored),\n };\n }\n } catch (error) {\n console.warn('Failed to retrieve Ace options from storage:', error);\n }\n return ACE_DEFAULT_OPTIONS;\n};\n\nlet aceOptions = getStoredAceOptions();\n\nfunction manageAceOptionChange(editor: AceGlobal.Ace.Editor) {\n editor.setOptions(aceOptions);\n\n const originalSetOption = editor.setOption.bind(editor);\n const originalSetOptions = editor.setOptions.bind(editor);\n const persistOptions = () => {\n try {\n aceOptions = {\n ...ACE_DEFAULT_OPTIONS,\n ...editor.getOptions(),\n };\n localStorage.setItem(storageKey, JSON.stringify(aceOptions));\n } catch (error) {\n console.warn('Failed to store Ace options:', error);\n }\n };\n\n editor.setOption = (name: string, value: unknown) => {\n originalSetOption(\n name as keyof AceGlobal.Ace.EditorOptions,\n value as never,\n );\n persistOptions();\n };\n\n editor.setOptions = (options: Partial<AceGlobal.Ace.EditorOptions>) => {\n originalSetOptions(options);\n persistOptions();\n };\n}\n\nexport function parseXml(xml: string): XMLDocument {\n const parsed = parser.parseFromString(xml, 'application/xml');\n const parseError = parsed.querySelector('parsererror');\n if (parseError) {\n const error = new Error(parseError.textContent ?? 'Invalid XML');\n console.error('XML Parsing Error:', error);\n }\n return parsed;\n}\n\nexport function serializeXml(xml: XMLDocument | Element): string {\n return serializer.serializeToString(xml);\n}\n\nexport function formatXml(\n rawXml: string | undefined,\n initialIndent: string = '',\n): string {\n if (!rawXml) {\n return '';\n }\n\n // Trim leading and trailing whitespace to avoid injecting extra < or >\n const xml = rawXml.trim();\n\n let formatted = '';\n let indent = '';\n\n const tab = '\\t';\n const nodes = xml.split(/>\\s*</);\n nodes.forEach(function (node, index) {\n // Remove leading < from first node and trailing > from last node. Allow for selection leading or trailing whitespace.\n if (index === 0) {\n node = node.replace(/^\\s*</, '');\n }\n if (index === nodes.length - 1) {\n node = node.replace(/>\\s*$/, '');\n }\n\n if (node.match(/^\\/\\w/)) {\n indent = indent.substring(tab!.length);\n }\n formatted += initialIndent + indent + '<' + node + '>\\r\\n';\n if (node.match(/^<?\\w[^>]*[^/]$/)) {\n indent += tab;\n }\n });\n\n return formatted.trim();\n}\n\nexport function newOscdTextEditV2({\n element,\n newText,\n}: {\n element: Element;\n newText: string;\n}): EditV2[] | null {\n let newDoc: XMLDocument | null = null;\n try {\n newDoc = newText ? parseXml(newText) : null;\n } catch (error) {\n console.error('Failed to parse XML:', error);\n return null;\n }\n if (element) {\n // get the parent and if we don't have a parent, use the documentElement\n const parent = element.parentElement ?? element.ownerDocument;\n const nextSibling = element.nextSibling ?? null;\n const newElement = newDoc\n ? element.ownerDocument.importNode(newDoc?.documentElement, true)\n : null;\n\n return [\n { node: element },\n ...(newElement\n ? [\n {\n node: newElement,\n parent,\n reference: nextSibling,\n },\n ]\n : []),\n ] as EditV2[];\n }\n return null;\n}\n\nclass BaseElement extends ScopedElementsMixin(LitElement) {}\n\n/**\n * Intent is to keep this generic so it can be migrated to oscd-ui.\n */\nexport default class OscdTextEditor extends BaseElement {\n static scopedElements = {\n // Left here for clarity sake. We need to dyn-import this so we have a chance of overriding the customElements.define to prevent\n // ace-editor from being registered globally and causing issues with other instances of ace-editor in the same document.\n //'ace-editor': AceEditor,\n };\n\n constructor() {\n super();\n // Special handling to prevent ace-editor from being registered globally, which would cause issues with multiple instances in the same document.\n // This will all go away once the oscd-ui version is implemented and this project is migrated to oscd-ui\n const customElementsDefineFn = window.customElements.define;\n window.customElements.define = (name, constructor) => {\n if (name !== 'ace-editor') {\n return customElementsDefineFn(name, constructor);\n }\n };\n import('ace-custom-element').then(AceEditor => {\n if (!this.registry?.get('ace-editor')) {\n this.registry?.define('ace-editor', AceEditor.default);\n }\n });\n }\n\n @property()\n value: string | undefined;\n\n @query('ace-editor')\n aceEditor!: AceEditor;\n\n public format() {\n const rawXml =\n this.aceEditor?.editor?.getSelectedText() || this.aceEditor.value;\n\n let initialIndent = '';\n if (this.aceEditor?.editor?.getSelectedText()) {\n const range = this.aceEditor.editor.getSelectionRange();\n // Get the starting line of the selection and detect its leading whitespace\n const startLine = range.start.row;\n const lineContent = this.aceEditor.editor.session.getLine(startLine);\n initialIndent = lineContent.match(/^(\\s*)/)?.[1] || '';\n }\n\n const formatted = formatXml(rawXml, initialIndent);\n if (this.aceEditor?.editor?.getSelectedText()) {\n const range = this.aceEditor.editor.getSelectionRange();\n // Remove the trailing \\r\\n\n this.aceEditor.editor.session.replace(\n range,\n formatted.substring(0, formatted.length - 2),\n );\n } else {\n this.value = formatted;\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n window.ace?.config?.addEventListener?.('editor', manageAceOptionChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n window.ace?.config?.removeEventListener?.('editor', manageAceOptionChange);\n }\n\n private handleAceChange(e: CustomEvent<string>): void {\n if (typeof e.detail !== 'string') {\n return;\n }\n\n if (this.value !== e.detail) {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: e.detail,\n }),\n );\n }\n }\n\n protected updated(changedProps: PropertyValueMap<OscdTextEditor>): void {\n if (changedProps.has('value')) {\n // Clear selection when content updates\n setTimeout(() => {\n if (this.aceEditor?.editor) {\n /* For reasons unknown the ace editor initially selects all code, so we need to clear that*/\n this.aceEditor.editor.selection.clearSelection();\n this.aceEditor.editor.moveCursorTo(0, 0);\n }\n }, 10);\n }\n }\n\n render() {\n return html`\n <ace-editor\n .value=${this.value}\n mode=${aceOptions.mode}\n theme=${aceOptions.theme}\n @change=${(e: CustomEvent<string>) => {\n this.handleAceChange(e);\n }}\n >\n </ace-editor>\n `;\n }\n\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n overflow: auto;\n }\n\n ace-editor {\n height: 100%;\n width: 100%;\n }\n `;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@omicronenergy/oscd-scl-dialogs",
|
|
3
3
|
"description": "Provides a resuable dialog for adding and editing SCL elements in OpenSCD.",
|
|
4
4
|
"displayName": "OpenSCD Edit Dialog",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.9",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/OMICRONEnergyOSS/oscd-scl-dialogs.git"
|
|
@@ -44,7 +44,6 @@
|
|
|
44
44
|
"analyze": "cem analyze",
|
|
45
45
|
"start": "rimraf dist && tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds --watch --node-resolve\"",
|
|
46
46
|
"start:bundle": "npm run bundle && concurrently -k -r \"rollup -c rollup.config.js --watch\" \"wds --watch --root-dir ./dist\"",
|
|
47
|
-
"start:vite": "vite",
|
|
48
47
|
"build": "rimraf dist && tsc && npm run analyze -- --exclude dist",
|
|
49
48
|
"build:watch": "rimraf dist && npm run analyze -- --exclude dist && tsc --watch --preserveWatchOutput",
|
|
50
49
|
"bundle": "rimraf dist && rollup -c rollup.config.js",
|
|
@@ -58,6 +57,7 @@
|
|
|
58
57
|
"prepare": "husky"
|
|
59
58
|
},
|
|
60
59
|
"dependencies": {
|
|
60
|
+
"@omicronenergy/oscd-editor-source": "^0.0.3",
|
|
61
61
|
"@omicronenergy/oscd-shell": "^0.0.11",
|
|
62
62
|
"@open-wc/scoped-elements": "^3.0.6",
|
|
63
63
|
"@openenergytools/filterable-lists": "^1.2.0",
|
|
@@ -115,8 +115,7 @@
|
|
|
115
115
|
"rollup-plugin-copy": "^3.5.0",
|
|
116
116
|
"sinon": "^21.0.1",
|
|
117
117
|
"typedoc": "^0.28.16",
|
|
118
|
-
"typescript": "^5.9.3"
|
|
119
|
-
"vite": "^7.3.1"
|
|
118
|
+
"typescript": "^5.9.3"
|
|
120
119
|
},
|
|
121
120
|
"customElements": "custom-elements.json",
|
|
122
121
|
"prettier": {
|