@omicronenergy/oscd-shell 0.0.5 → 0.0.7

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 (121) hide show
  1. package/dist/foundation/cyrb64.d.ts +6 -0
  2. package/dist/foundation/cyrb64.js +26 -0
  3. package/dist/foundation/cyrb64.js.map +1 -0
  4. package/dist/foundation.d.ts +1 -0
  5. package/dist/foundation.js +2 -0
  6. package/dist/foundation.js.map +1 -0
  7. package/dist/locales/de.d.ts +10 -0
  8. package/dist/locales/de.js +15 -0
  9. package/dist/locales/de.js.map +1 -0
  10. package/dist/locales.d.ts +13 -0
  11. package/dist/locales.js +21 -0
  12. package/dist/locales.js.map +1 -0
  13. package/dist/oscd-shell.d.ts +115 -0
  14. package/dist/oscd-shell.js +732 -0
  15. package/dist/oscd-shell.js.map +1 -0
  16. package/package.json +32 -29
  17. package/.editorconfig +0 -22
  18. package/.github/actions/setup-node-env/action.yml +0 -49
  19. package/.github/workflows/release-please.yml +0 -84
  20. package/.github/workflows/test.yml +0 -18
  21. package/.github/workflows/update-screenshots.yml +0 -29
  22. package/.husky/commit-msg +0 -1
  23. package/.husky/pre-commit +0 -1
  24. package/.release-please-manifest.json +0 -1
  25. package/CHANGELOG.md +0 -73
  26. package/CONTRIBUTING.md +0 -393
  27. package/commitlint.config.js +0 -1
  28. package/demo/AddPlugins.js +0 -42
  29. package/demo/DemoPluginSrc.js +0 -9
  30. package/demo/embedded.html +0 -17
  31. package/demo/index.html +0 -95
  32. package/foundation/cyrb64.ts +0 -27
  33. package/foundation/edit-event.ts +0 -273
  34. package/foundation/open-event.ts +0 -21
  35. package/foundation.ts +0 -28
  36. package/lit-localize.json +0 -15
  37. package/localization/de.xlf +0 -75
  38. package/oscd-shell.editing.spec.ts +0 -813
  39. package/oscd-shell.plugging.spec.ts +0 -78
  40. package/oscd-shell.spec.ts +0 -431
  41. package/oscd-shell.test.ts +0 -382
  42. package/oscd-shell.ts +0 -906
  43. package/release-please-config.json +0 -21
  44. package/rollup.config.js +0 -51
  45. package/screenshots/Chromium/baseline/app-bar-de.png +0 -0
  46. package/screenshots/Chromium/baseline/app-bar-en.png +0 -0
  47. package/screenshots/Chromium/baseline/document-name-de.png +0 -0
  48. package/screenshots/Chromium/baseline/document-name-en.png +0 -0
  49. package/screenshots/Chromium/baseline/editor-plugins-de.png +0 -0
  50. package/screenshots/Chromium/baseline/editor-plugins-en.png +0 -0
  51. package/screenshots/Chromium/baseline/editor-plugins-selected-de.png +0 -0
  52. package/screenshots/Chromium/baseline/editor-plugins-selected-en.png +0 -0
  53. package/screenshots/Chromium/baseline/editor-plugins-with-doc-de.png +0 -0
  54. package/screenshots/Chromium/baseline/editor-plugins-with-doc-en.png +0 -0
  55. package/screenshots/Chromium/baseline/log-entries-de.png +0 -0
  56. package/screenshots/Chromium/baseline/log-entries-en.png +0 -0
  57. package/screenshots/Chromium/baseline/log-entries-redone-de.png +0 -0
  58. package/screenshots/Chromium/baseline/log-entries-redone-en.png +0 -0
  59. package/screenshots/Chromium/baseline/log-entries-undone-de.png +0 -0
  60. package/screenshots/Chromium/baseline/log-entries-undone-en.png +0 -0
  61. package/screenshots/Chromium/baseline/log-screen-de.png +0 -0
  62. package/screenshots/Chromium/baseline/log-screen-en.png +0 -0
  63. package/screenshots/Chromium/baseline/menu-drawer-de.png +0 -0
  64. package/screenshots/Chromium/baseline/menu-drawer-en.png +0 -0
  65. package/screenshots/Chromium/baseline/menu-plugins-de.png +0 -0
  66. package/screenshots/Chromium/baseline/menu-plugins-en.png +0 -0
  67. package/screenshots/Chromium/baseline/menu-plugins-triggered-de.png +0 -0
  68. package/screenshots/Chromium/baseline/menu-plugins-triggered-en.png +0 -0
  69. package/screenshots/Firefox/baseline/app-bar-de.png +0 -0
  70. package/screenshots/Firefox/baseline/app-bar-en.png +0 -0
  71. package/screenshots/Firefox/baseline/document-name-de.png +0 -0
  72. package/screenshots/Firefox/baseline/document-name-en.png +0 -0
  73. package/screenshots/Firefox/baseline/editor-plugins-de.png +0 -0
  74. package/screenshots/Firefox/baseline/editor-plugins-en.png +0 -0
  75. package/screenshots/Firefox/baseline/editor-plugins-selected-de.png +0 -0
  76. package/screenshots/Firefox/baseline/editor-plugins-selected-en.png +0 -0
  77. package/screenshots/Firefox/baseline/editor-plugins-with-doc-de.png +0 -0
  78. package/screenshots/Firefox/baseline/editor-plugins-with-doc-en.png +0 -0
  79. package/screenshots/Firefox/baseline/log-entries-de.png +0 -0
  80. package/screenshots/Firefox/baseline/log-entries-en.png +0 -0
  81. package/screenshots/Firefox/baseline/log-entries-redone-de.png +0 -0
  82. package/screenshots/Firefox/baseline/log-entries-redone-en.png +0 -0
  83. package/screenshots/Firefox/baseline/log-entries-undone-de.png +0 -0
  84. package/screenshots/Firefox/baseline/log-entries-undone-en.png +0 -0
  85. package/screenshots/Firefox/baseline/log-screen-de.png +0 -0
  86. package/screenshots/Firefox/baseline/log-screen-en.png +0 -0
  87. package/screenshots/Firefox/baseline/menu-drawer-de.png +0 -0
  88. package/screenshots/Firefox/baseline/menu-drawer-en.png +0 -0
  89. package/screenshots/Firefox/baseline/menu-plugins-de.png +0 -0
  90. package/screenshots/Firefox/baseline/menu-plugins-en.png +0 -0
  91. package/screenshots/Firefox/baseline/menu-plugins-triggered-de.png +0 -0
  92. package/screenshots/Firefox/baseline/menu-plugins-triggered-en.png +0 -0
  93. package/screenshots/Webkit/baseline/app-bar-de.png +0 -0
  94. package/screenshots/Webkit/baseline/app-bar-en.png +0 -0
  95. package/screenshots/Webkit/baseline/document-name-de.png +0 -0
  96. package/screenshots/Webkit/baseline/document-name-en.png +0 -0
  97. package/screenshots/Webkit/baseline/editor-plugins-de.png +0 -0
  98. package/screenshots/Webkit/baseline/editor-plugins-en.png +0 -0
  99. package/screenshots/Webkit/baseline/editor-plugins-selected-de.png +0 -0
  100. package/screenshots/Webkit/baseline/editor-plugins-selected-en.png +0 -0
  101. package/screenshots/Webkit/baseline/editor-plugins-with-doc-de.png +0 -0
  102. package/screenshots/Webkit/baseline/editor-plugins-with-doc-en.png +0 -0
  103. package/screenshots/Webkit/baseline/log-entries-de.png +0 -0
  104. package/screenshots/Webkit/baseline/log-entries-en.png +0 -0
  105. package/screenshots/Webkit/baseline/log-entries-redone-de.png +0 -0
  106. package/screenshots/Webkit/baseline/log-entries-redone-en.png +0 -0
  107. package/screenshots/Webkit/baseline/log-entries-undone-de.png +0 -0
  108. package/screenshots/Webkit/baseline/log-entries-undone-en.png +0 -0
  109. package/screenshots/Webkit/baseline/log-screen-de.png +0 -0
  110. package/screenshots/Webkit/baseline/log-screen-en.png +0 -0
  111. package/screenshots/Webkit/baseline/menu-drawer-de.png +0 -0
  112. package/screenshots/Webkit/baseline/menu-drawer-en.png +0 -0
  113. package/screenshots/Webkit/baseline/menu-plugins-de.png +0 -0
  114. package/screenshots/Webkit/baseline/menu-plugins-en.png +0 -0
  115. package/screenshots/Webkit/baseline/menu-plugins-triggered-de.png +0 -0
  116. package/screenshots/Webkit/baseline/menu-plugins-triggered-en.png +0 -0
  117. package/tsconfig.json +0 -23
  118. package/utils/testing.spec.ts +0 -210
  119. package/utils/testing.ts +0 -65
  120. package/web-dev-server.config.js +0 -24
  121. package/web-test-runner.config.js +0 -180
@@ -1,21 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
3
- "release-type": "node",
4
- "bump-minor-pre-major": true,
5
- "bump-patch-for-minor-pre-major": true,
6
- "packages": {
7
- ".": {}
8
- },
9
- "changelog-sections": [
10
- { "type": "feat", "section": "Features" },
11
- { "type": "fix", "section": "Bug Fixes" },
12
- { "type": "perf", "section": "Performance Improvements" },
13
- { "type": "style", "section": "Styles" },
14
- { "type": "docs", "section": "Documentation", "hidden": true },
15
- { "type": "chore", "section": "Miscellaneous Chores", "hidden": true },
16
- { "type": "refactor", "section": "Code Refactoring", "hidden": true },
17
- { "type": "test", "section": "Tests", "hidden": true },
18
- { "type": "build", "section": "Build System", "hidden": true },
19
- { "type": "ci", "section": "Continuous Integration", "hidden": true }
20
- ]
21
- }
package/rollup.config.js DELETED
@@ -1,51 +0,0 @@
1
- import nodeResolve from '@rollup/plugin-node-resolve';
2
- import typescript from '@rollup/plugin-typescript';
3
-
4
- import { readdirSync } from 'fs';
5
-
6
- const locales = readdirSync('locales').map(locale => ({
7
- input: `locales/${locale}`,
8
- output: {
9
- sourcemap: true, // Add source map to build output
10
- format: 'es', // ES module type export
11
- file: `dist/locales/${locale}`.slice(0, -3) + '.js', // Keep filename
12
- },
13
- preserveEntrySignatures: 'strict', // leaves export of the plugin entry point
14
-
15
- plugins: [nodeResolve(), typescript()],
16
- }));
17
-
18
- export default [
19
- {
20
- input: 'oscd-shell.ts',
21
- output: {
22
- sourcemap: true, // Add source map to build output
23
- format: 'es', // ES module type export
24
- dir: 'dist', // The build output folder
25
- // preserveModules: true, // Keep directory structure and files
26
- },
27
- preserveEntrySignatures: 'strict', // leaves export of the plugin entry point
28
-
29
- plugins: [
30
- /** Resolve bare module imports */
31
- nodeResolve(),
32
- typescript(),
33
- ],
34
- },
35
- {
36
- input: 'foundation.ts',
37
- output: {
38
- sourcemap: true, // Add source map to build output
39
- format: 'es', // ES module type export
40
- dir: 'dist', // The build output folder
41
- preserveModules: true, // Keep directory structure and files
42
- },
43
- preserveEntrySignatures: 'strict', // leaves export of the plugin entry point
44
-
45
- plugins: [
46
- /** Resolve bare module imports */
47
- nodeResolve(),
48
- typescript(),
49
- ],
50
- },
51
- ].concat(locales);
package/tsconfig.json DELETED
@@ -1,23 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2018",
4
- "module": "esnext",
5
- "moduleResolution": "node",
6
- "noEmitOnError": true,
7
- "lib": ["es2018", "dom"],
8
- "strict": true,
9
- "esModuleInterop": false,
10
- "allowSyntheticDefaultImports": true,
11
- "experimentalDecorators": true,
12
- "importHelpers": true,
13
- "outDir": "dist",
14
- "sourceMap": true,
15
- "inlineSources": true,
16
- "rootDir": "./",
17
- "tsBuildInfoFile": ".tsbuildinfo",
18
- "declaration": true,
19
- "incremental": true,
20
- "skipLibCheck": true
21
- },
22
- "include": ["**/*.ts"]
23
- }
@@ -1,210 +0,0 @@
1
- import { expect, fixture, html } from '@open-wc/testing';
2
- import sinon from 'sinon';
3
-
4
- import {
5
- findButtonByIcon,
6
- getFirstTextNodeContent,
7
- querySelectorContainingText,
8
- simulateKeypressOnElement,
9
- waitForDialogState,
10
- } from './testing.js';
11
-
12
- describe('querySelectorContainingText', () => {
13
- it('returns the element matching selector and exact text', async () => {
14
- const el = await fixture<HTMLDivElement>(html`
15
- <div>
16
- <span class="item">Apple</span>
17
- <span class="item">Banana</span>
18
- <span class="item">Cherry</span>
19
- </div>
20
- `);
21
-
22
- const result = querySelectorContainingText(el, '.item', 'Banana');
23
- expect(result).to.exist;
24
- expect(result?.textContent?.trim()).to.equal('Banana');
25
- });
26
-
27
- it('returns undefined if no element matches the text', async () => {
28
- const el = await fixture<HTMLDivElement>(html`
29
- <div>
30
- <span class="item">Apple</span>
31
- <span class="item">Banana</span>
32
- </div>
33
- `);
34
-
35
- const result = querySelectorContainingText(el, '.item', 'Orange');
36
- expect(result).to.be.undefined;
37
- });
38
-
39
- it('returns undefined if no element matches the selector', async () => {
40
- const el = await fixture<HTMLDivElement>(html`
41
- <div>
42
- <span class="item">Apple</span>
43
- </div>
44
- `);
45
-
46
- const result = querySelectorContainingText(el, '.notfound', 'Apple');
47
- expect(result).to.be.undefined;
48
- });
49
-
50
- it('matches only the first text node content', async () => {
51
- const el = await fixture<HTMLDivElement>(html`
52
- <div>
53
- <span class="item">Apple <b>Bold</b></span>
54
- <span class="item">Banana</span>
55
- </div>
56
- `);
57
-
58
- const result = querySelectorContainingText(el, '.item', 'Apple');
59
- expect(result).to.exist;
60
- expect(result?.textContent?.includes('Apple')).to.be.true;
61
- });
62
-
63
- it('ignores whitespace differences in text nodes', async () => {
64
- const el = await fixture<HTMLDivElement>(html`
65
- <div>
66
- <span class="item"> Apple </span>
67
- </div>
68
- `);
69
-
70
- const result = querySelectorContainingText(el, '.item', 'Apple');
71
- expect(result).to.exist;
72
- });
73
- });
74
- describe('getFirstTextNodeContent', () => {
75
- it('returns the trimmed text content of the first text node', async () => {
76
- const el = document.createElement('div');
77
- el.appendChild(document.createTextNode(' Hello '));
78
- el.appendChild(document.createElement('span'));
79
- expect(getFirstTextNodeContent(el)).to.equal('Hello');
80
- });
81
-
82
- it('returns undefined if there are no text nodes', () => {
83
- const el = document.createElement('div');
84
- el.appendChild(document.createElement('span'));
85
- expect(getFirstTextNodeContent(el)).to.be.undefined;
86
- });
87
-
88
- it('returns empty string if element is null', () => {
89
- expect(getFirstTextNodeContent(null)).to.equal('');
90
- });
91
-
92
- it('ignores empty text nodes', () => {
93
- const el = document.createElement('div');
94
- el.appendChild(document.createTextNode(' '));
95
- el.appendChild(document.createTextNode('Text'));
96
- expect(getFirstTextNodeContent(el)).to.equal('Text');
97
- });
98
-
99
- it('returns an empty string if no element is passed in', () => {
100
- expect(getFirstTextNodeContent(null)).to.equal('');
101
- });
102
- });
103
-
104
- describe('simulateKeypressOnElement', () => {
105
- it('dispatches a keydown event with the correct key and ctrlKey', () => {
106
- const spy = sinon.spy();
107
- document.addEventListener('keydown', spy, { once: true });
108
- simulateKeypressOnElement('a', true);
109
- expect(spy.calledOnce).to.be.true;
110
- const event = spy.firstCall.args[0];
111
- expect(event).to.have.property('key', 'a');
112
- expect(event).to.have.property('ctrlKey', true);
113
- });
114
- });
115
-
116
- describe('waitForDialogState', () => {
117
- it('resolves immediately if dialog is already open', async () => {
118
- const dialog = document.createElement('dialog');
119
- dialog.setAttribute('open', '');
120
- let resolved = false;
121
- await waitForDialogState(dialog, 'open').then(() => {
122
- resolved = true;
123
- });
124
- expect(resolved).to.be.true;
125
- });
126
-
127
- it('waits for dialog to become open', async () => {
128
- const dialog = document.createElement('dialog');
129
- setTimeout(() => dialog.setAttribute('open', ''), 10);
130
- await waitForDialogState(dialog, 'open');
131
- expect(dialog.hasAttribute('open')).to.be.true;
132
- });
133
-
134
- it('resolves immediately if dialog is already closed', async () => {
135
- const dialog = document.createElement('dialog');
136
- let resolved = false;
137
- await waitForDialogState(dialog, 'closed').then(() => {
138
- resolved = true;
139
- });
140
- expect(resolved).to.be.true;
141
- });
142
-
143
- it('waits for dialog to emit closed event', async () => {
144
- const dialog = document.createElement('dialog');
145
- dialog.setAttribute('open', '');
146
- setTimeout(() => {
147
- dialog.removeAttribute('open');
148
- dialog.dispatchEvent(new Event('closed'));
149
- }, 10);
150
- await waitForDialogState(dialog, 'closed');
151
- expect(dialog.hasAttribute('open')).to.be.false;
152
- });
153
- });
154
-
155
- describe('findButtonByIcon', () => {
156
- it('returns the button with the matching icon name', () => {
157
- const root = document.createElement('div');
158
- const btn1 = document.createElement('button');
159
- btn1.classList.add('icon-btn');
160
- const icon1 = document.createElement('oscd-icon');
161
- icon1.textContent = 'foo';
162
- btn1.appendChild(icon1);
163
-
164
- const btn2 = document.createElement('button');
165
- btn2.classList.add('icon-btn');
166
- const icon2 = document.createElement('oscd-icon');
167
- icon2.textContent = 'bar';
168
- btn2.appendChild(icon2);
169
-
170
- root.appendChild(btn1);
171
- root.appendChild(btn2);
172
-
173
- const found = findButtonByIcon(root, '.icon-btn', 'bar');
174
- expect(found).to.equal(btn2);
175
- });
176
-
177
- it('returns null if no button matches the icon name', () => {
178
- const root = document.createElement('div');
179
- const btn = document.createElement('oscd-icon-button');
180
- const icon = document.createElement('oscd-icon');
181
- icon.textContent = 'foo';
182
- btn.appendChild(icon);
183
- root.appendChild(btn);
184
-
185
- const found = findButtonByIcon(root, 'oscd-icon-button', 'bar');
186
- expect(found).to.be.undefined;
187
- });
188
-
189
- it('returns null if no button matches the selector', () => {
190
- const root = document.createElement('div');
191
- const btn = document.createElement('oscd-text-button');
192
- const icon = document.createElement('oscd-icon');
193
- icon.textContent = 'foo';
194
- root.appendChild(btn);
195
-
196
- const found = findButtonByIcon(root, 'oscd-icon-button', 'foo');
197
- expect(found).to.be.undefined;
198
- });
199
-
200
- it('returns null if oscd-icon is missing', () => {
201
- const root = document.createElement('div');
202
- const btn = document.createElement('oscd-text-button');
203
- const icon = document.createElement('oscd-emoji');
204
- icon.textContent = 'foo';
205
- root.appendChild(btn);
206
-
207
- const found = findButtonByIcon(root, 'oscd-text-button', 'foo');
208
- expect(found).to.be.undefined;
209
- });
210
- });
package/utils/testing.ts DELETED
@@ -1,65 +0,0 @@
1
- import { OscdDialog } from '@omicronenergy/oscd-ui/dialog/oscd-dialog.js';
2
- // eslint-disable-next-line import/no-extraneous-dependencies
3
- import { waitUntil } from '@open-wc/testing';
4
-
5
- export function getFirstTextNodeContent(
6
- element: Element | null,
7
- ): string | undefined {
8
- if (!element) {
9
- return '';
10
- }
11
- return Array.from(element.childNodes)
12
- .filter(node => node.nodeType === Node.TEXT_NODE)
13
- .map(node => node.textContent?.trim())
14
- .filter(node => node !== '')[0];
15
- }
16
-
17
- export function querySelectorContainingText(
18
- scope: Element,
19
- selector: string,
20
- text: string,
21
- ) {
22
- const elements = Array.from(scope.querySelectorAll(selector));
23
- return elements.find(e => {
24
- const textContent = getFirstTextNodeContent(e);
25
- return textContent === text;
26
- });
27
- }
28
-
29
- export function simulateKeypressOnElement(key: string, ctrlKey: boolean) {
30
- const event = new KeyboardEvent('keydown', {
31
- key,
32
- ctrlKey,
33
- });
34
- document.dispatchEvent(event);
35
- }
36
-
37
- export async function waitForDialogState(
38
- dialog: Element,
39
- state: 'open' | 'closed',
40
- ) {
41
- await waitUntil(
42
- () => (dialog as OscdDialog)?.open === (state === 'open'),
43
- `Dialog did not ${state} within the expected time`,
44
- );
45
- return dialog;
46
- }
47
-
48
- /**
49
- * Finds a control, typically a button (but in theory could be some other component) by selector + enclosed icon name (inside an oscd-icon).
50
- * @param root The root element to search within.
51
- * @param buttonSelector The selector (e.g. 'oscd-filled-icon-button').
52
- * @param iconName The icon name to match (text content of enclosed oscd-icon).
53
- * @returns The matching button element or null.
54
- */
55
- export function findButtonByIcon(
56
- root: ParentNode,
57
- buttonSelector: string,
58
- iconName: string,
59
- ): HTMLElement | null {
60
- const buttons = Array.from(root.querySelectorAll(buttonSelector));
61
- return buttons.find(btn => {
62
- const icon = btn.querySelector('oscd-icon');
63
- return icon && icon.textContent?.trim() === iconName;
64
- }) as HTMLElement | null;
65
- }
@@ -1,24 +0,0 @@
1
- // import { hmrPlugin, presets } from '@open-wc/dev-server-hmr';
2
-
3
- /** Use Hot Module replacement by adding --hmr to the start command */
4
- const hmr = process.argv.includes('--hmr');
5
-
6
- export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
7
- open: '/demo/',
8
- /** Use regular watch mode if HMR is not enabled. */
9
- watch: !hmr,
10
- /** Resolve bare module imports */
11
- nodeResolve: {
12
- exportConditions: ['browser', 'development'],
13
- },
14
-
15
- /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
16
- // esbuildTarget: 'auto'
17
-
18
- plugins: [
19
- /** Use Hot Module Replacement by uncommenting. Requires @open-wc/dev-server-hmr plugin */
20
- // hmr && hmrPlugin({ exclude: ['**/*/node_modules/**/*'], presets: [presets.litElement] }),
21
- ],
22
-
23
- // See documentation for all available options
24
- });