@omicronenergy/oscd-shell 0.0.14 → 0.0.16

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.
Files changed (34) hide show
  1. package/README.md +11 -6
  2. package/dist/landing-page/landing-page.d.ts +3 -3
  3. package/dist/landing-page/landing-page.js.map +1 -1
  4. package/dist/landing-page/landing-page.spec.js +1 -1
  5. package/dist/landing-page/landing-page.spec.js.map +1 -1
  6. package/dist/localization.js +1 -1
  7. package/dist/localization.js.map +1 -1
  8. package/dist/menus/files-menu.d.ts +1 -1
  9. package/dist/menus/plugins-menu.d.ts +5 -5
  10. package/dist/menus/plugins-menu.js +2 -2
  11. package/dist/menus/plugins-menu.js.map +1 -1
  12. package/dist/oscd-shell-design-tokens.d.ts +1 -1
  13. package/dist/oscd-shell-design-tokens.js +12 -1
  14. package/dist/oscd-shell-design-tokens.js.map +1 -1
  15. package/dist/oscd-shell.d.ts +45 -17
  16. package/dist/oscd-shell.js +36 -12
  17. package/dist/oscd-shell.js.map +1 -1
  18. package/dist/side-panel/build-tree-nodes.spec.js.map +1 -1
  19. package/dist/side-panel/editor-plugins-panel.d.ts +6 -6
  20. package/dist/side-panel/editor-plugins-panel.js +6 -0
  21. package/dist/side-panel/editor-plugins-panel.js.map +1 -1
  22. package/dist/side-panel/editor-plugins-panel.spec.js +10 -7
  23. package/dist/side-panel/editor-plugins-panel.spec.js.map +1 -1
  24. package/dist/utils/plugin-utils.d.ts +28 -21
  25. package/dist/utils/plugin-utils.js +12 -19
  26. package/dist/utils/plugin-utils.js.map +1 -1
  27. package/dist/utils/plugin-utils.spec.js +30 -5
  28. package/dist/utils/plugin-utils.spec.js.map +1 -1
  29. package/dist/utils/testing/plugin-helpers.d.ts +6 -15
  30. package/dist/utils/testing/plugin-helpers.js +3 -3
  31. package/dist/utils/testing/plugin-helpers.js.map +1 -1
  32. package/dist/utils/testing/test-plugins.js +1 -1
  33. package/dist/utils/testing/test-plugins.js.map +1 -1
  34. package/package.json +18 -58
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-utils.spec.js","sourceRoot":"","sources":["../../src/utils/plugin-utils.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport {\n isPluginEntry,\n isSourcedPlugin,\n validatePlugin,\n filterBySearchTerm,\n filterByPinned,\n} from './plugin-utils.js';\nimport { PluginEntry, PluginGroup } from '../oscd-shell.js';\n\ndescribe('Plugin Utils', () => {\n describe('isPlugin', () => {\n it('should return true for a valid Plugin object', () => {\n const plugin = {\n tagName: 'test-plugin',\n name: 'Test Plugin',\n icon: 'test-icon',\n requireDoc: false,\n };\n expect(plugin).satisfies(isPluginEntry);\n });\n\n it('should return false for an object without tagName', () => {\n const plugin = {\n name: 'Test Plugin',\n icon: 'test-icon',\n requireDoc: false,\n };\n expect(plugin).to.not.satisfy(isPluginEntry);\n });\n\n it('should return false for a SourcePlugin', () => {\n const plugin = {\n name: 'Test Plugin',\n icon: 'test-icon',\n src: 'data:text/javascript;charset=utf-8,import%20%7B%20default%20as%20TestPlugin%20%7D%20from%20\"./test-plugin.js\";',\n };\n expect(plugin).to.not.satisfy(isPluginEntry);\n });\n });\n\n describe('isSourcePlugin', () => {\n it('should return true for a valid SourcePlugin object', () => {\n const plugin = {\n name: 'Test Plugin',\n src: 'data:text/javascript;charset=utf-8,import%20%7B%20default%20as%20TestPlugin%20%7D%20from%20\"./test-plugin.js\";',\n icon: 'test-icon',\n };\n expect(plugin).satisfies(isSourcedPlugin);\n });\n\n it('should return false for an object without a src field', () => {\n const plugin = {\n name: 'Test Plugin',\n icon: 'test-icon',\n };\n expect(plugin).not.to.satisfy(isSourcedPlugin);\n });\n\n it('should return false for an Plugin object (has tagName, but no src)', () => {\n const plugin = {\n name: 'Test Plugin',\n icon: 'test-icon',\n tagName: 'test-plugin',\n };\n expect(plugin).not.to.satisfy(isSourcedPlugin);\n });\n });\n});\n\ndescribe('validatePlugin', () => {\n it('returns a Plugin object, for a valid plugin', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n icon: 'coronavirus',\n tagName: 'test-tagless-plugin',\n };\n\n expect(plugin).satisfies(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition missing its \"tagName\" field', async () => {\n const plugin = {\n icon: 'coronavirus',\n name: 'Tagless, Sourceless, Hopeless Plugin',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition missing its \"name\" field', async () => {\n const plugin = {\n icon: 'coronavirus',\n tagName: 'test-tagless-plugin',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition missing its \"icon\" field', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n tagName: 'test-tagless-plugin',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition with invalid requireDoc field', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n tagName: 'test-tagless-plugin',\n requireDoc: 'not-a-boolean',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition with invalid translations field', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n tagName: 'test-tagless-plugin',\n translations: 'ops',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition with invalid translations', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n tagName: 'test-tagless-plugin',\n translations: {\n en: 'Tagless, Sourceless, Hopeless Plugin',\n fr: 123, // Invalid translation (not a string)\n },\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n});\n\ndescribe('filterBySearchTerm', () => {\n const leaf = (name: string, tagName: string): PluginEntry => ({\n name,\n tagName,\n icon: 'margin',\n });\n const group = (name: string, plugins: PluginEntry[]): PluginGroup => ({\n name,\n icon: 'folder',\n plugins,\n });\n\n const editors: (PluginEntry | PluginGroup)[] = [\n leaf('Substation Editor', 'oscd-substation'),\n leaf('Single Line Diagram', 'oscd-sld'),\n group('Communication', [\n leaf('GOOSE Editor', 'oscd-goose'),\n leaf('Sampled Values', 'oscd-smv'),\n ]),\n ];\n\n it('returns the plugins unchanged for an empty term', () => {\n expect(filterBySearchTerm(editors, '')).to.equal(editors);\n });\n\n it('returns the plugins unchanged for a whitespace-only term', () => {\n expect(filterBySearchTerm(editors, ' ')).to.equal(editors);\n });\n\n it('matches leaf plugin names case-insensitively', () => {\n const result = filterBySearchTerm(editors, 'EDITOR');\n const names = result.flatMap(item =>\n 'plugins' in item ? item.plugins.map(p => p.name) : [item.name],\n );\n expect(names).to.have.members(['Substation Editor', 'GOOSE Editor']);\n });\n\n it('matches anywhere within a plugin name, not just the start', () => {\n const result = filterBySearchTerm(editors, 'line');\n expect(result).to.have.lengthOf(1);\n expect((result[0] as PluginEntry).name).to.equal('Single Line Diagram');\n });\n\n it('preserves group structure and keeps only matching children', () => {\n const result = filterBySearchTerm(editors, 'goose');\n expect(result).to.have.lengthOf(1);\n const communication = result[0] as PluginGroup;\n expect(communication.name).to.equal('Communication');\n expect(communication.plugins.map(p => p.name)).to.deep.equal([\n 'GOOSE Editor',\n ]);\n });\n\n it('drops groups whose children do not match', () => {\n const result = filterBySearchTerm(editors, 'substation');\n expect(\n result.some(item => 'plugins' in item && item.name === 'Communication'),\n ).to.be.false;\n });\n\n it('does not match against group names', () => {\n expect(filterBySearchTerm(editors, 'Communication')).to.be.empty;\n });\n\n it('matches the localized label when a locale is given', () => {\n const localized: (PluginEntry | PluginGroup)[] = [\n {\n ...leaf('Substation Editor', 'oscd-substation'),\n translations: { de: 'Unterstation' },\n },\n leaf('Single Line Diagram', 'oscd-sld'),\n ];\n const result = filterBySearchTerm(localized, 'unterstation', 'de');\n expect(result).to.have.lengthOf(1);\n expect((result[0] as PluginEntry).tagName).to.equal('oscd-substation');\n });\n\n it('does not match the localized label when no locale is given', () => {\n const localized: (PluginEntry | PluginGroup)[] = [\n {\n ...leaf('Substation Editor', 'oscd-substation'),\n translations: { de: 'Unterstation' },\n },\n ];\n expect(filterBySearchTerm(localized, 'unterstation')).to.be.empty;\n });\n});\n\ndescribe('filterByPinned', () => {\n const leaf = (name: string, tagName: string): PluginEntry => ({\n name,\n tagName,\n icon: 'margin',\n });\n const editors: (PluginEntry | PluginGroup)[] = [\n leaf('Substation Editor', 'oscd-substation'),\n {\n name: 'Communication',\n icon: 'folder',\n plugins: [\n leaf('GOOSE Editor', 'oscd-goose'),\n leaf('Sampled Values', 'oscd-smv'),\n ],\n },\n ];\n\n it('returns flattened leaf entries whose tagName is pinned', () => {\n const result = filterByPinned(editors, ['oscd-substation', 'oscd-smv']);\n expect(result.map(p => p.tagName)).to.deep.equal([\n 'oscd-substation',\n 'oscd-smv',\n ]);\n });\n\n it('finds pinned plugins nested within groups', () => {\n const result = filterByPinned(editors, ['oscd-goose']);\n expect(result).to.have.lengthOf(1);\n expect(result[0].name).to.equal('GOOSE Editor');\n });\n\n it('returns an empty array when nothing is pinned', () => {\n expect(filterByPinned(editors, [])).to.be.empty;\n });\n\n it('ignores pinned ids that do not match any plugin', () => {\n expect(filterByPinned(editors, ['does-not-exist'])).to.be.empty;\n });\n});\n"]}
1
+ {"version":3,"file":"plugin-utils.spec.js","sourceRoot":"","sources":["../../src/utils/plugin-utils.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport {\n isTaggedPlugin,\n isSourcedPlugin,\n validatePlugin,\n filterBySearchTerm,\n filterByPinned,\n loadSourcedPlugins,\n} from './plugin-utils.js';\nimport { PluginGroup, ResolvedPlugin } from '../oscd-shell.js';\n\ndescribe('Plugin Utils', () => {\n describe('isTaggedPlugin', () => {\n it('should return true for a valid Plugin object', () => {\n const plugin = {\n tagName: 'test-plugin',\n name: 'Test Plugin',\n icon: 'test-icon',\n requireDoc: false,\n };\n expect(plugin).satisfies(isTaggedPlugin);\n });\n\n it('should return false for an object without tagName', () => {\n const plugin = {\n name: 'Test Plugin',\n icon: 'test-icon',\n requireDoc: false,\n };\n expect(plugin).to.not.satisfy(isTaggedPlugin);\n });\n\n it('should return false for a SourcePlugin', () => {\n const plugin = {\n name: 'Test Plugin',\n icon: 'test-icon',\n src: 'data:text/javascript;charset=utf-8,import%20%7B%20default%20as%20TestPlugin%20%7D%20from%20\"./test-plugin.js\";',\n };\n expect(plugin).to.not.satisfy(isTaggedPlugin);\n });\n });\n\n describe('isSourcePlugin', () => {\n it('should return true for a valid SourcePlugin object', () => {\n const plugin = {\n name: 'Test Plugin',\n src: 'data:text/javascript;charset=utf-8,import%20%7B%20default%20as%20TestPlugin%20%7D%20from%20\"./test-plugin.js\";',\n icon: 'test-icon',\n };\n expect(plugin).satisfies(isSourcedPlugin);\n });\n\n it('should return false for an object without a src field', () => {\n const plugin = {\n name: 'Test Plugin',\n icon: 'test-icon',\n };\n expect(plugin).not.to.satisfy(isSourcedPlugin);\n });\n\n it('should return false for an Plugin object (has tagName, but no src)', () => {\n const plugin = {\n name: 'Test Plugin',\n icon: 'test-icon',\n tagName: 'test-plugin',\n };\n expect(plugin).not.to.satisfy(isSourcedPlugin);\n });\n });\n});\n\ndescribe('validatePlugin', () => {\n it('returns a Plugin object, for a valid plugin', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n icon: 'coronavirus',\n tagName: 'test-tagless-plugin',\n };\n\n expect(plugin).satisfies(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition missing its \"tagName\" field', async () => {\n const plugin = {\n icon: 'coronavirus',\n name: 'Tagless, Sourceless, Hopeless Plugin',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition missing its \"name\" field', async () => {\n const plugin = {\n icon: 'coronavirus',\n tagName: 'test-tagless-plugin',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition missing its \"icon\" field', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n tagName: 'test-tagless-plugin',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition with invalid requireDoc field', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n tagName: 'test-tagless-plugin',\n requireDoc: 'not-a-boolean',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition with invalid translations field', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n tagName: 'test-tagless-plugin',\n translations: 'ops',\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n\n it('returns undefined, for a plugin definition with invalid translations', async () => {\n const plugin = {\n name: 'Tagless, Sourceless, Hopeless Plugin',\n tagName: 'test-tagless-plugin',\n translations: {\n en: 'Tagless, Sourceless, Hopeless Plugin',\n fr: 123, // Invalid translation (not a string)\n },\n };\n\n expect(plugin).not.to.satisfy(validatePlugin);\n });\n});\n\ndescribe('filterBySearchTerm', () => {\n const leaf = (name: string, tagName: string): ResolvedPlugin => ({\n name,\n tagName,\n icon: 'margin',\n });\n const group = (\n name: string,\n plugins: ResolvedPlugin[],\n ): PluginGroup<ResolvedPlugin> => ({\n name,\n icon: 'folder',\n plugins,\n });\n\n const editors: (ResolvedPlugin | PluginGroup<ResolvedPlugin>)[] = [\n leaf('Substation Editor', 'oscd-substation'),\n leaf('Single Line Diagram', 'oscd-sld'),\n group('Communication', [\n leaf('GOOSE Editor', 'oscd-goose'),\n leaf('Sampled Values', 'oscd-smv'),\n ]),\n ];\n\n it('returns the plugins unchanged for an empty term', () => {\n expect(filterBySearchTerm(editors, '')).to.equal(editors);\n });\n\n it('returns the plugins unchanged for a whitespace-only term', () => {\n expect(filterBySearchTerm(editors, ' ')).to.equal(editors);\n });\n\n it('matches leaf plugin names case-insensitively', () => {\n const result = filterBySearchTerm(editors, 'EDITOR');\n const names = result.flatMap(item =>\n 'plugins' in item ? item.plugins.map(p => p.name) : [item.name],\n );\n expect(names).to.have.members(['Substation Editor', 'GOOSE Editor']);\n });\n\n it('matches anywhere within a plugin name, not just the start', () => {\n const result = filterBySearchTerm(editors, 'line');\n expect(result).to.have.lengthOf(1);\n expect((result[0] as ResolvedPlugin).name).to.equal('Single Line Diagram');\n });\n\n it('preserves group structure and keeps only matching children', () => {\n const result = filterBySearchTerm(editors, 'goose');\n expect(result).to.have.lengthOf(1);\n const communication = result[0] as PluginGroup<ResolvedPlugin>;\n expect(communication.name).to.equal('Communication');\n expect(communication.plugins.map(p => p.name)).to.deep.equal([\n 'GOOSE Editor',\n ]);\n });\n\n it('drops groups whose children do not match', () => {\n const result = filterBySearchTerm(editors, 'substation');\n expect(\n result.some(item => 'plugins' in item && item.name === 'Communication'),\n ).to.be.false;\n });\n\n it('does not match against group names', () => {\n expect(filterBySearchTerm(editors, 'Communication')).to.be.empty;\n });\n\n it('matches the localized label when a locale is given', () => {\n const localized: (ResolvedPlugin | PluginGroup<ResolvedPlugin>)[] = [\n {\n ...leaf('Substation Editor', 'oscd-substation'),\n translations: { de: 'Unterstation' },\n },\n leaf('Single Line Diagram', 'oscd-sld'),\n ];\n const result = filterBySearchTerm(localized, 'unterstation', 'de');\n expect(result).to.have.lengthOf(1);\n expect((result[0] as ResolvedPlugin).tagName).to.equal('oscd-substation');\n });\n\n it('does not match the localized label when no locale is given', () => {\n const localized: (ResolvedPlugin | PluginGroup<ResolvedPlugin>)[] = [\n {\n ...leaf('Substation Editor', 'oscd-substation'),\n translations: { de: 'Unterstation' },\n },\n ];\n expect(filterBySearchTerm(localized, 'unterstation')).to.be.empty;\n });\n});\n\ndescribe('filterByPinned', () => {\n const leaf = (name: string, tagName: string): ResolvedPlugin => ({\n name,\n tagName,\n icon: 'margin',\n });\n const editors: (ResolvedPlugin | PluginGroup<ResolvedPlugin>)[] = [\n leaf('Substation Editor', 'oscd-substation'),\n {\n name: 'Communication',\n icon: 'folder',\n plugins: [\n leaf('GOOSE Editor', 'oscd-goose'),\n leaf('Sampled Values', 'oscd-smv'),\n ],\n },\n ];\n\n it('returns flattened leaf entries whose tagName is pinned', () => {\n const result = filterByPinned(editors, ['oscd-substation', 'oscd-smv']);\n expect(result.map(p => p.tagName)).to.deep.equal([\n 'oscd-substation',\n 'oscd-smv',\n ]);\n });\n\n it('finds pinned plugins nested within groups', () => {\n const result = filterByPinned(editors, ['oscd-goose']);\n expect(result).to.have.lengthOf(1);\n expect(result[0].name).to.equal('GOOSE Editor');\n });\n\n it('returns an empty array when nothing is pinned', () => {\n expect(filterByPinned(editors, [])).to.be.empty;\n });\n\n it('ignores pinned ids that do not match any plugin', () => {\n expect(filterByPinned(editors, ['does-not-exist'])).to.be.empty;\n });\n});\n\ndescribe('loadSourcedPlugins', () => {\n const src =\n 'data:text/javascript;charset=utf-8,export%20default%20class%20extends%20HTMLElement%20%7B%7D';\n\n it('derives a tagName from src and drops src from the render form', () => {\n const [resolved] = loadSourcedPlugins(\n [{ name: 'Sourced', icon: 'icon', src }],\n customElements,\n );\n\n expect(resolved.tagName).to.match(/^oscd-p/);\n expect(resolved).to.not.have.property('src');\n });\n\n it('derives the same tagName for the same src, so repeated loads are stable', () => {\n const [first] = loadSourcedPlugins(\n [{ name: 'Sourced', icon: 'icon', src }],\n customElements,\n );\n const [second] = loadSourcedPlugins(\n [{ name: 'Sourced', icon: 'icon', src }],\n customElements,\n );\n\n expect(second).to.deep.equal(first);\n });\n\n it('resolves from src when an entry carries both src and a stale tagName', () => {\n const [resolved] = loadSourcedPlugins(\n [{ name: 'Sourced', icon: 'icon', src, tagName: 'oscd-pSTALE' }],\n customElements,\n );\n\n expect(resolved.tagName).to.not.equal('oscd-pSTALE');\n });\n\n it('passes a tagName-only entry through unchanged', () => {\n const [resolved] = loadSourcedPlugins(\n [{ name: 'Tagged', icon: 'icon', tagName: 'oscd-tagged' }],\n customElements,\n );\n\n expect(resolved).to.deep.equal({\n name: 'Tagged',\n icon: 'icon',\n tagName: 'oscd-tagged',\n });\n });\n});\n"]}
@@ -1,19 +1,10 @@
1
- import { OscdShell, PluginEntry, PluginGroup } from '../../oscd-shell.js';
2
- export declare const sampleMenuPlugins: (PluginGroup<Omit<PluginEntry, 'tagName'> & {
3
- tagName?: string;
4
- src?: string;
5
- }> | (Omit<PluginEntry, 'tagName'> & {
6
- tagName?: string;
7
- src?: string;
8
- }))[];
9
- export declare const sampleEditorPlugins: (Omit<PluginEntry, 'tagName'> & {
10
- tagName?: string;
11
- src?: string;
12
- })[];
13
- export declare function findPluginByTagName(pluginSet: (PluginEntry | PluginGroup<PluginEntry>)[], tagName: string): PluginEntry | undefined;
1
+ import { OscdShell, OscdPlugin, PluginGroup, ResolvedPlugin } from '../../oscd-shell.js';
2
+ export declare const sampleMenuPlugins: (PluginGroup<OscdPlugin> | OscdPlugin)[];
3
+ export declare const sampleEditorPlugins: OscdPlugin[];
4
+ export declare function findPluginByTagName(pluginSet: (ResolvedPlugin | PluginGroup<ResolvedPlugin>)[], tagName: string): ResolvedPlugin | undefined;
14
5
  export declare const isPluginInstanciated: (pluginTagName: string, shell: OscdShell) => boolean;
15
- export declare const waitForPluginInstanciation: (plugin: PluginEntry, shell: OscdShell) => Promise<void>;
16
- export declare const waitForPluginsToInstantiate: (plugins: PluginEntry[], shell: OscdShell) => Promise<void[]>;
6
+ export declare const waitForPluginInstanciation: (plugin: ResolvedPlugin, shell: OscdShell) => Promise<void>;
7
+ export declare const waitForPluginsToInstantiate: (plugins: ResolvedPlugin[], shell: OscdShell) => Promise<void[]>;
17
8
  /**
18
9
  * Convienience function to wait for all applicable plugins to instantiate.
19
10
  * If a document is loaded, all plugins are waited for. If no document is loaded,
@@ -65,10 +65,10 @@ export const waitForPluginsToInstantiate = async (plugins, shell) => await Promi
65
65
  export const waitForAllPluginsToInstantiate = async (shell) => {
66
66
  const docLoaded = !!shell.docName;
67
67
  const editorPlugin = docLoaded && shell.selectedEditor
68
- ? findPluginByTagName(shell.plugins.editor, shell.selectedEditor.tagName)
68
+ ? findPluginByTagName(shell._resolvedPlugins.editor, shell.selectedEditor.tagName)
69
69
  : undefined;
70
- const menuPlugins = flattenPluginEntries(shell.plugins.menu).filter(plugin => !plugin.requireDoc || docLoaded);
71
- const backgroundPlugins = shell.plugins.background.filter(plugin => !plugin.requireDoc || docLoaded);
70
+ const menuPlugins = flattenPluginEntries(shell._resolvedPlugins.menu).filter(plugin => !plugin.requireDoc || docLoaded);
71
+ const backgroundPlugins = shell._resolvedPlugins.background.filter(plugin => !plugin.requireDoc || docLoaded);
72
72
  const allPlugins = [
73
73
  ...menuPlugins,
74
74
  ...backgroundPlugins,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-helpers.js","sourceRoot":"","sources":["../../../src/utils/testing/plugin-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import-x/no-extraneous-dependencies */\nimport { waitUntil } from '@open-wc/testing';\nimport { OscdShell, PluginEntry, PluginGroup } from '../../oscd-shell.js';\nimport { flattenPluginEntries } from '../plugin-utils.js';\n\nexport const sampleMenuPlugins: (\n | PluginGroup<\n Omit<PluginEntry, 'tagName'> & {\n tagName?: string;\n src?: string;\n }\n >\n | (Omit<PluginEntry, 'tagName'> & {\n tagName?: string;\n src?: string;\n })\n)[] = [\n {\n name: 'Test Menu Plugin',\n translations: { de: 'Test Menu Erweiterung' },\n tagName: 'test-menu-plugin1',\n icon: 'margin',\n requireDoc: false,\n },\n {\n name: 'Test Menu Plugin 2',\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestStrMenuPlugin2%20extends%20HTMLElement%20%7B%0D%0A%20%20async%20run%28%29%20%7B%0D%0A%20%20%20%20return%20true%3B%0D%0A%20%20%7D%0D%0A%7D',\n icon: 'margin',\n requireDoc: false,\n },\n {\n name: 'Test Menu Group 1',\n icon: 'margin',\n plugins: [\n {\n name: 'Test Menu Plugin 3',\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestStrMenuPlugin3%20extends%20HTMLElement%20%7B%0D%0A%20%20async%20run%28%29%20%7B%0D%0A%20%20%20%20return%20true%3B%0D%0A%20%20%7D%0D%0A%7D',\n icon: 'margin',\n requireDoc: false,\n },\n ],\n },\n];\n\nexport const sampleEditorPlugins: (Omit<PluginEntry, 'tagName'> & {\n tagName?: string;\n src?: string;\n})[] = [\n {\n name: 'Test Editor Plugin',\n translations: { de: 'Test Editor Erweiterung' },\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestEditorPlugin%20extends%20HTMLElement%20%7B%0D%0A%20%20constructor%20%28%29%20%7B%20super%28%29%3B%20this.innerHTML%20%3D%20%60%3Cp%3ETest%20Editor%20Plugin%3C%2Fp%3E%60%3B%20%7D%0D%0A%7D',\n icon: 'coronavirus',\n },\n {\n name: 'Test Editor Plugin 2',\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestEditorPlugin%20extends%20HTMLElement%20%7B%0D%0A%20%20constructor%20%28%29%20%7B%20super%28%29%3B%20this.innerHTML%20%3D%20%60%3Cp%3ETest%20Editor%20Plugin%3C%2Fp%3E%60%3B%20%7D%0D%0A%7D',\n icon: 'coronavirus',\n },\n];\n\nexport function findPluginByTagName(\n pluginSet: (PluginEntry | PluginGroup<PluginEntry>)[],\n tagName: string,\n): PluginEntry | undefined {\n return flattenPluginEntries(pluginSet).find(\n plugin => plugin.tagName === tagName,\n );\n}\n\nexport const isPluginInstanciated = (\n pluginTagName: string,\n shell: OscdShell,\n): boolean =>\n !!shell.registry?.get(pluginTagName) &&\n !!shell.shadowRoot?.querySelector(pluginTagName);\n\nexport const waitForPluginInstanciation = async (\n plugin: PluginEntry,\n shell: OscdShell,\n): Promise<void> =>\n waitUntil(\n () => isPluginInstanciated(plugin.tagName, shell),\n `Plugin: \"${plugin.name}\" <${plugin.tagName}> failed to load.\n CustomElements Registered: ${shell.registry?.get(plugin.tagName) ? 'Yes' : 'No (at least not in the OscdShell registry)'},\n Found in DOM: ${shell.shadowRoot?.querySelector(plugin.tagName) ? 'Yes' : 'No'},\n requiresDoc?: ${plugin.requireDoc}\n loadedDocName?: ${shell.docName}`,\n );\n\nexport const waitForPluginsToInstantiate = async (\n plugins: PluginEntry[],\n shell: OscdShell,\n) =>\n await Promise.all(\n plugins.map(plugin => waitForPluginInstanciation(plugin, shell)),\n );\n\n/**\n * Convienience function to wait for all applicable plugins to instantiate.\n * If a document is loaded, all plugins are waited for. If no document is loaded,\n * only plugins that do not require a document are waited for.\n * If no document is loaded, only menu and background plugins are considered, as\n * the landing page does not have an editor.\n *\n * @param shell - The instance of the OscdShell to check for plugin instantiation.\n * @returns Empty Promise that resolves when all applicable plugins have been instantiated.\n */\nexport const waitForAllPluginsToInstantiate = async (shell: OscdShell) => {\n const docLoaded = !!shell.docName;\n\n const editorPlugin =\n docLoaded && shell.selectedEditor\n ? findPluginByTagName(shell.plugins.editor, shell.selectedEditor.tagName)\n : undefined;\n\n const menuPlugins = flattenPluginEntries(shell.plugins.menu).filter(\n plugin => !plugin.requireDoc || docLoaded,\n );\n const backgroundPlugins = shell.plugins.background.filter(\n plugin => !plugin.requireDoc || docLoaded,\n );\n\n const allPlugins: PluginEntry[] = [\n ...menuPlugins,\n ...backgroundPlugins,\n ...(editorPlugin ? [editorPlugin] : []),\n ];\n\n return allPlugins.length > 0\n ? waitForPluginsToInstantiate(allPlugins, shell)\n : Promise.resolve();\n};\n\nexport const registerPlugin = (\n shell: OscdShell,\n tagName: string,\n pluginClass: CustomElementConstructor,\n) => {\n if (!shell.registry?.get(tagName)) {\n shell.registry?.define(tagName, pluginClass);\n }\n};\n"]}
1
+ {"version":3,"file":"plugin-helpers.js","sourceRoot":"","sources":["../../../src/utils/testing/plugin-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import-x/no-extraneous-dependencies */\nimport { waitUntil } from '@open-wc/testing';\nimport {\n OscdShell,\n OscdPlugin,\n PluginGroup,\n ResolvedPlugin,\n} from '../../oscd-shell.js';\nimport { flattenPluginEntries } from '../plugin-utils.js';\n\nexport const sampleMenuPlugins: (PluginGroup<OscdPlugin> | OscdPlugin)[] = [\n {\n name: 'Test Menu Plugin',\n translations: { de: 'Test Menu Erweiterung' },\n tagName: 'test-menu-plugin1',\n icon: 'margin',\n requireDoc: false,\n },\n {\n name: 'Test Menu Plugin 2',\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestStrMenuPlugin2%20extends%20HTMLElement%20%7B%0D%0A%20%20async%20run%28%29%20%7B%0D%0A%20%20%20%20return%20true%3B%0D%0A%20%20%7D%0D%0A%7D',\n icon: 'margin',\n requireDoc: false,\n },\n {\n name: 'Test Menu Group 1',\n icon: 'margin',\n plugins: [\n {\n name: 'Test Menu Plugin 3',\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestStrMenuPlugin3%20extends%20HTMLElement%20%7B%0D%0A%20%20async%20run%28%29%20%7B%0D%0A%20%20%20%20return%20true%3B%0D%0A%20%20%7D%0D%0A%7D',\n icon: 'margin',\n requireDoc: false,\n },\n ],\n },\n];\n\nexport const sampleEditorPlugins: OscdPlugin[] = [\n {\n name: 'Test Editor Plugin',\n translations: { de: 'Test Editor Erweiterung' },\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestEditorPlugin%20extends%20HTMLElement%20%7B%0D%0A%20%20constructor%20%28%29%20%7B%20super%28%29%3B%20this.innerHTML%20%3D%20%60%3Cp%3ETest%20Editor%20Plugin%3C%2Fp%3E%60%3B%20%7D%0D%0A%7D',\n icon: 'coronavirus',\n },\n {\n name: 'Test Editor Plugin 2',\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestEditorPlugin%20extends%20HTMLElement%20%7B%0D%0A%20%20constructor%20%28%29%20%7B%20super%28%29%3B%20this.innerHTML%20%3D%20%60%3Cp%3ETest%20Editor%20Plugin%3C%2Fp%3E%60%3B%20%7D%0D%0A%7D',\n icon: 'coronavirus',\n },\n];\n\nexport function findPluginByTagName(\n pluginSet: (ResolvedPlugin | PluginGroup<ResolvedPlugin>)[],\n tagName: string,\n): ResolvedPlugin | undefined {\n return flattenPluginEntries(pluginSet).find(\n plugin => plugin.tagName === tagName,\n );\n}\n\nexport const isPluginInstanciated = (\n pluginTagName: string,\n shell: OscdShell,\n): boolean =>\n !!shell.registry?.get(pluginTagName) &&\n !!shell.shadowRoot?.querySelector(pluginTagName);\n\nexport const waitForPluginInstanciation = async (\n plugin: ResolvedPlugin,\n shell: OscdShell,\n): Promise<void> =>\n waitUntil(\n () => isPluginInstanciated(plugin.tagName, shell),\n `Plugin: \"${plugin.name}\" <${plugin.tagName}> failed to load.\n CustomElements Registered: ${shell.registry?.get(plugin.tagName) ? 'Yes' : 'No (at least not in the OscdShell registry)'},\n Found in DOM: ${shell.shadowRoot?.querySelector(plugin.tagName) ? 'Yes' : 'No'},\n requiresDoc?: ${plugin.requireDoc}\n loadedDocName?: ${shell.docName}`,\n );\n\nexport const waitForPluginsToInstantiate = async (\n plugins: ResolvedPlugin[],\n shell: OscdShell,\n) =>\n await Promise.all(\n plugins.map(plugin => waitForPluginInstanciation(plugin, shell)),\n );\n\n/**\n * Convienience function to wait for all applicable plugins to instantiate.\n * If a document is loaded, all plugins are waited for. If no document is loaded,\n * only plugins that do not require a document are waited for.\n * If no document is loaded, only menu and background plugins are considered, as\n * the landing page does not have an editor.\n *\n * @param shell - The instance of the OscdShell to check for plugin instantiation.\n * @returns Empty Promise that resolves when all applicable plugins have been instantiated.\n */\nexport const waitForAllPluginsToInstantiate = async (shell: OscdShell) => {\n const docLoaded = !!shell.docName;\n\n const editorPlugin =\n docLoaded && shell.selectedEditor\n ? findPluginByTagName(\n shell._resolvedPlugins.editor,\n shell.selectedEditor.tagName,\n )\n : undefined;\n\n const menuPlugins = flattenPluginEntries(shell._resolvedPlugins.menu).filter(\n plugin => !plugin.requireDoc || docLoaded,\n );\n const backgroundPlugins = shell._resolvedPlugins.background.filter(\n plugin => !plugin.requireDoc || docLoaded,\n );\n\n const allPlugins: ResolvedPlugin[] = [\n ...menuPlugins,\n ...backgroundPlugins,\n ...(editorPlugin ? [editorPlugin] : []),\n ];\n\n return allPlugins.length > 0\n ? waitForPluginsToInstantiate(allPlugins, shell)\n : Promise.resolve();\n};\n\nexport const registerPlugin = (\n shell: OscdShell,\n tagName: string,\n pluginClass: CustomElementConstructor,\n) => {\n if (!shell.registry?.get(tagName)) {\n shell.registry?.define(tagName, pluginClass);\n }\n};\n"]}
@@ -18,7 +18,7 @@ __decorate([
18
18
  export class TestBackgroundPlugin extends HTMLElement {
19
19
  constructor() {
20
20
  super();
21
- document.addEventListener('test-tx', event => {
21
+ document.addEventListener('test-tx', (event) => {
22
22
  document.dispatchEvent(new CustomEvent('test-rx', {
23
23
  detail: event.detail,
24
24
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"test-plugins.js","sourceRoot":"","sources":["../../../src/utils/testing/test-plugins.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAA/C;;QAEE,eAAU,GAAG,CAAC,CAAC;IAOjB,CAAC;IALC,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAI,IAAI,CAAC,WAAW,EAAiB,CAAC,IAAiB,CAAC;QACpE,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAPC;IADC,QAAQ,CAAC,EAAE,CAAC;mDACE;AASjB,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IACnD;QACE,KAAK,EAAE,CAAC;QACR,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;YAC3C,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,SAAS,EAAE;gBACzB,MAAM,EAAG,KAAqB,CAAC,MAAM;aACtC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,yBAAyB;IAC/B,YAAY,EAAE,EAAE,EAAE,EAAE,6BAA6B,EAAE;IACnD,OAAO,EAAE,mBAAmB;IAC5B,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,yBAAyB;IAC/B,YAAY,EAAE,EAAE,EAAE,EAAE,+BAA+B,EAAE;IACrD,GAAG,EAAE,6QAA6Q;IAClR,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,oBAAoB;IAC1B,YAAY,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE;IAC/C,GAAG,EAAE,8PAA8P;IACnQ,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,KAAK;CAClB,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,sBAAsB;IAC5B,YAAY,EAAE,EAAE,EAAE,EAAE,2BAA2B,EAAE;IACjD,GAAG,EAAE,gQAAgQ;IACrQ,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;CACjB,CAAC","sourcesContent":["import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { OscdShell } from '../../oscd-shell.js';\n\nexport class TestMenuPlugin1 extends LitElement {\n @property({})\n docVersion = 0;\n\n async run() {\n const editor = (this.getRootNode() as ShadowRoot).host as OscdShell;\n editor.undo();\n return true;\n }\n}\n\nexport class TestBackgroundPlugin extends HTMLElement {\n constructor() {\n super();\n document.addEventListener('test-tx', event => {\n document.dispatchEvent(\n new CustomEvent('test-rx', {\n detail: (event as CustomEvent).detail,\n }),\n );\n });\n }\n}\n\nexport const testMenuPlugin1 = {\n name: 'Test Undo Menu Plugin 1',\n translations: { de: 'Test Rückgängig-Menü-Plugin' },\n tagName: 'test-menu-plugin1',\n icon: 'undo',\n requireDoc: false,\n};\n\nexport const testMenuPlugin2 = {\n name: 'Test Undo Menu Plugin 2',\n translations: { de: 'Test Rückgängig-Menü-Plugin 2' },\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestPlugin%20extends%20HTMLElement%20%7B%0D%0A%20%20async%20run()%20%7B%0D%0A%20%20const%20editor2%20=%20(this.getRootNode()).host;%20%0D%0A%20editor2.undo();%0D%0A%20return%20true;%0D%0A%20%20%7D%0D%0A%7D',\n icon: 'undo',\n requireDoc: true,\n};\n\nexport const testEditorPlugin = {\n name: 'Test Editor Plugin',\n translations: { de: 'Test Editor Erweiterung' },\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestEditorPlugin%20extends%20HTMLElement%20%7B%0D%0A%20%20constructor%20%28%29%20%7B%20super%28%29%3B%20this.innerHTML%20%3D%20%60%3Cp%3ETest%20Editor%20Plugin%3C%2Fp%3E%60%3B%20%7D%0D%0A%7D',\n icon: 'edit',\n requireDoc: false,\n};\nexport const testEditorPlugin2 = {\n name: 'Test Editor Plugin 2',\n translations: { de: 'Test Editor Erweiterung 2' },\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestEditorPlugin2%20extends%20HTMLElement%20%7B%0D%0A%20%20constructor%20%28%29%20%7B%20super%28%29%3B%20this.innerHTML%20%3D%20%60%3Cp%3ETest%20Editor%20Plugin2%3C%2Fp%3E%60%3B%20%7D%0D%0A%7D',\n icon: 'edit',\n requireDoc: true,\n};\n"]}
1
+ {"version":3,"file":"test-plugins.js","sourceRoot":"","sources":["../../../src/utils/testing/test-plugins.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAA/C;;QAEE,eAAU,GAAG,CAAC,CAAC;IAOjB,CAAC;IALC,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAI,IAAI,CAAC,WAAW,EAAiB,CAAC,IAAiB,CAAC;QACpE,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAPC;IADC,QAAQ,CAAC,EAAE,CAAC;mDACE;AASjB,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IACnD;QACE,KAAK,EAAE,CAAC;QACR,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7C,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,SAAS,EAAE;gBACzB,MAAM,EAAG,KAAqB,CAAC,MAAM;aACtC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,yBAAyB;IAC/B,YAAY,EAAE,EAAE,EAAE,EAAE,6BAA6B,EAAE;IACnD,OAAO,EAAE,mBAAmB;IAC5B,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,yBAAyB;IAC/B,YAAY,EAAE,EAAE,EAAE,EAAE,+BAA+B,EAAE;IACrD,GAAG,EAAE,6QAA6Q;IAClR,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,oBAAoB;IAC1B,YAAY,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE;IAC/C,GAAG,EAAE,8PAA8P;IACnQ,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,KAAK;CAClB,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,sBAAsB;IAC5B,YAAY,EAAE,EAAE,EAAE,EAAE,2BAA2B,EAAE;IACjD,GAAG,EAAE,gQAAgQ;IACrQ,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;CACjB,CAAC","sourcesContent":["import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { OscdShell } from '../../oscd-shell.js';\n\nexport class TestMenuPlugin1 extends LitElement {\n @property({})\n docVersion = 0;\n\n async run() {\n const editor = (this.getRootNode() as ShadowRoot).host as OscdShell;\n editor.undo();\n return true;\n }\n}\n\nexport class TestBackgroundPlugin extends HTMLElement {\n constructor() {\n super();\n document.addEventListener('test-tx', (event) => {\n document.dispatchEvent(\n new CustomEvent('test-rx', {\n detail: (event as CustomEvent).detail,\n }),\n );\n });\n }\n}\n\nexport const testMenuPlugin1 = {\n name: 'Test Undo Menu Plugin 1',\n translations: { de: 'Test Rückgängig-Menü-Plugin' },\n tagName: 'test-menu-plugin1',\n icon: 'undo',\n requireDoc: false,\n};\n\nexport const testMenuPlugin2 = {\n name: 'Test Undo Menu Plugin 2',\n translations: { de: 'Test Rückgängig-Menü-Plugin 2' },\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestPlugin%20extends%20HTMLElement%20%7B%0D%0A%20%20async%20run()%20%7B%0D%0A%20%20const%20editor2%20=%20(this.getRootNode()).host;%20%0D%0A%20editor2.undo();%0D%0A%20return%20true;%0D%0A%20%20%7D%0D%0A%7D',\n icon: 'undo',\n requireDoc: true,\n};\n\nexport const testEditorPlugin = {\n name: 'Test Editor Plugin',\n translations: { de: 'Test Editor Erweiterung' },\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestEditorPlugin%20extends%20HTMLElement%20%7B%0D%0A%20%20constructor%20%28%29%20%7B%20super%28%29%3B%20this.innerHTML%20%3D%20%60%3Cp%3ETest%20Editor%20Plugin%3C%2Fp%3E%60%3B%20%7D%0D%0A%7D',\n icon: 'edit',\n requireDoc: false,\n};\nexport const testEditorPlugin2 = {\n name: 'Test Editor Plugin 2',\n translations: { de: 'Test Editor Erweiterung 2' },\n src: 'data:text/javascript;charset=utf-8,export%20default%20class%20TestEditorPlugin2%20extends%20HTMLElement%20%7B%0D%0A%20%20constructor%20%28%29%20%7B%20super%28%29%3B%20this.innerHTML%20%3D%20%60%3Cp%3ETest%20Editor%20Plugin2%3C%2Fp%3E%60%3B%20%7D%0D%0A%7D',\n icon: 'edit',\n requireDoc: true,\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omicronenergy/oscd-shell",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "description": "The shell component of OpenSCD, where plugins are loaded and the application is initialized.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,22 +32,22 @@
32
32
  "!/dist/*.test.*"
33
33
  ],
34
34
  "scripts": {
35
- "lint": "eslint .",
36
- "format": "eslint . --fix",
35
+ "lint": "oscd lint",
36
+ "format": "oscd lint --format",
37
37
  "extract": "lit-localize extract",
38
38
  "localize": "lit-localize build",
39
- "build": "rimraf dist && mkdir dist && npm run extract && npm run localize && npm run analyze -- --exclude dist && tsc ",
40
- "bundle": "rimraf dist && npm run extract && npm run localize && rollup -c rollup.config.js",
41
- "start": "npm run build && concurrently -k \"tsc --watch --preserveWatchOutput\" \"wds --open '/demo/' --node-resolve\"",
42
- "start:bundle": "npm run bundle && concurrently -k -r \"rollup -c rollup.config.js --watch\" \"wds --root-dir dist --app-index demo/index.html --open '/demo/' --watch\"",
43
- "test": "npm run build && wtr --coverage --group unit",
44
- "test:watch": "npm run build && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --coverage --watch --group unit\"",
45
- "analyze": "cem analyze --litelement --exclude demo/* --exclude dist/* --exclude *.spec.ts --exclude *.test.ts --exclude coverage/*",
39
+ "build": "npm run extract && npm run localize && oscd build --analyze",
40
+ "bundle": "npm run extract && npm run localize && oscd bundle --analyze",
41
+ "start": "npm run build && oscd start",
42
+ "start:bundle": "npm run bundle && oscd start-bundle",
43
+ "test": "npm run extract && npm run localize && oscd test",
44
+ "test:watch": "npm run extract && npm run localize && oscd test --watch",
45
+ "analyze": "oscd analyze",
46
46
  "doc": "npm run analyze -- --exclude dist && typedoc --out dist/doc src/oscd-shell.ts src/foundation.ts",
47
- "test:visual": "npm run build && wtr --group visual",
48
- "test:update": "npm run build && wtr --group visual --update-visual-baseline",
49
- "deploy": "npm run bundle && npm run doc && gh-pages --dist 'dist' --nojekyll",
50
- "prepare": "husky"
47
+ "test:visual": "npm run extract && npm run localize && oscd test --visual",
48
+ "test:update": "npm run extract && npm run localize && oscd test --update",
49
+ "deploy": "npm run bundle && npm run doc && oscd deploy",
50
+ "prepare": "oscd install-hooks"
51
51
  },
52
52
  "dependencies": {
53
53
  "@lit/localize": "^0.12.2",
@@ -66,71 +66,31 @@
66
66
  "tslib": "^2.8.1"
67
67
  },
68
68
  "devDependencies": {
69
- "@commitlint/cli": "^20.5.0",
70
- "@commitlint/config-conventional": "^20.5.0",
71
- "@custom-elements-manifest/analyzer": "^0.11.0",
72
- "@eslint/eslintrc": "^3.3.5",
73
- "@eslint/js": "~9.34.0",
74
69
  "@lit/localize-tools": "^0.8.1",
70
+ "@omicronenergy/oscd-tooling": "^0.0.6",
75
71
  "@open-wc/dev-server-hmr": "^0.2.0",
76
- "@open-wc/eslint-config": "^13.0.0",
77
- "@open-wc/testing": "^4.0.0",
72
+ "@open-wc/testing": "^5.0.0",
78
73
  "@rollup/plugin-node-resolve": "^16.0.3",
79
74
  "@rollup/plugin-typescript": "^12.3.0",
80
75
  "@types/mocha": "^10.0.10",
81
- "@typescript-eslint/eslint-plugin": "^8.58.0",
82
- "@typescript-eslint/parser": "^8.58.0",
83
76
  "@ungap/structured-clone": "^1.3.0",
84
- "@web/dev-server": "^0.4.6",
85
77
  "@web/dev-server-polyfill": "^1.0.6",
86
78
  "@web/rollup-plugin-html": "^3.1.0",
87
79
  "@web/rollup-plugin-import-meta-assets": "^2.3.3",
88
- "@web/test-runner": "^0.20.2",
89
- "@web/test-runner-commands": "^0.9.0",
90
80
  "@web/test-runner-playwright": "^0.11.1",
91
81
  "@web/test-runner-visual-regression": "^0.10.0",
92
- "concurrently": "^9.2.1",
93
- "eslint": "~9.34.0",
94
- "eslint-config-prettier": "^10.1.8",
95
- "eslint-plugin-html": "^8.1.4",
96
- "eslint-plugin-lit": "^2.2.1",
97
- "eslint-plugin-lit-a11y": "^5.1.1",
98
- "eslint-plugin-no-only-tests": "^3.3.0",
99
- "eslint-plugin-prettier": "^5.5.5",
100
- "eslint-plugin-tsdoc": "^0.5.2",
101
- "eslint-plugin-wc": "^3.1.0",
102
- "gh-pages": "^6.3.0",
103
- "husky": "^9.1.7",
104
- "lint-staged": "^16.4.0",
105
82
  "pixelmatch": "^7.1.0",
106
83
  "pngjs": "^7.0.0",
107
- "prettier": "^3.8.1",
108
- "rimraf": "^6.1.3",
109
84
  "rollup": "^4.60.1",
110
85
  "rollup-plugin-copy": "^3.5.0",
111
86
  "sinon": "^21.0.3",
112
87
  "typedoc": "^0.28.18",
113
- "typescript": "^6.0.2"
88
+ "typescript": "~6.0.3"
114
89
  },
115
90
  "overrides": {
116
91
  "@web/test-runner-playwright": {
117
92
  "playwright": "1.59.1"
118
93
  }
119
94
  },
120
- "customElements": "custom-elements.json",
121
- "prettier": {
122
- "singleQuote": true,
123
- "arrowParens": "avoid"
124
- },
125
- "husky": {
126
- "hooks": {
127
- "pre-commit": "lint-staged"
128
- }
129
- },
130
- "lint-staged": {
131
- "*.ts": [
132
- "eslint --fix",
133
- "eslint"
134
- ]
135
- }
95
+ "customElements": "custom-elements.json"
136
96
  }