arcane-os 0.42.1 → 0.42.2
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 +11 -0
- package/README.md +1 -1
- package/docs/reference/runtime-modules.md +4 -3
- package/package.json +1 -1
- package/runtime/arcane/components/browser-ai-setup.html +1 -1
- package/runtime/arcane/components/calculator.html +1 -1
- package/runtime/arcane/components/chart.html +1 -1
- package/runtime/arcane/components/chat.html +2 -2
- package/runtime/arcane/components/conversation-view.html +1 -1
- package/runtime/arcane/components/dashboard-config.html +4 -4
- package/runtime/arcane/components/data-maintenance.html +3 -3
- package/runtime/arcane/components/data-view.html +3 -3
- package/runtime/arcane/components/directory-picker.html +2 -2
- package/runtime/arcane/components/file-drop.html +1 -1
- package/runtime/arcane/components/file-inspector.html +1 -1
- package/runtime/arcane/components/file-manager.html +3 -3
- package/runtime/arcane/components/integration-settings.html +1 -1
- package/runtime/arcane/components/local-ai-status.html +1 -1
- package/runtime/arcane/components/markdown-document.html +4 -4
- package/runtime/arcane/components/markdown-editor.html +2 -2
- package/runtime/arcane/components/media-embed.html +1 -1
- package/runtime/arcane/components/modal.html +1 -1
- package/runtime/arcane/components/output-panel.html +1 -1
- package/runtime/arcane/components/preferences-form.html +1 -1
- package/runtime/arcane/components/pwa-install.html +2 -2
- package/runtime/arcane/components/screen-capture.html +1 -1
- package/runtime/arcane/components/source-code-viewer.html +3 -3
- package/runtime/arcane/components/speech.html +1 -1
- package/runtime/arcane/components/summary-strip.html +1 -1
- package/runtime/arcane/components/table.html +1 -1
- package/runtime/arcane/components/task-progress.html +1 -1
- package/runtime/arcane/components/terminal-workspace.html +1 -1
- package/runtime/arcane/components/theme-editor.html +1 -1
- package/runtime/arcane/components/unified-inbox.html +1 -1
- package/runtime/arcane/components/voice-transcription.html +2 -2
- package/runtime/arcane/components/weather-widget.html +1 -1
- package/runtime/arcane/components/web-navigator.html +2 -2
- package/runtime/arcane/modules/ArcaneNavigationPolicy.js +1 -1
- package/runtime/arcane/modules/CommunicationAppController.js +2 -2
- package/runtime/arcane/modules/CommunicationHub.js +1 -1
- package/runtime/arcane/modules/ConversationClosingReport.js +1 -1
- package/runtime/arcane/modules/Errors.js +1 -1
- package/runtime/arcane/modules/HTMLImport.js +19 -38
- package/runtime/arcane/modules/LocalAIReadinessController.js +1 -1
- package/runtime/arcane/modules/ScamRiskPolicy.js +1 -1
- package/src/dev-server.mjs +2 -2
- package/src/import-map.mjs +66 -145
- package/src/packager/core.mjs +3 -4
- package/src/templates/workspace-template.mjs +5 -5
- package/src/workspace-runtime.mjs +6 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.42.2
|
|
4
|
+
|
|
5
|
+
- Stop generating SDK cache suffixes in import maps, materialized runtime,
|
|
6
|
+
source serving, packaged resources, scaffold references and shared components.
|
|
7
|
+
Remove retired local `arcaneVersion` fields while preserving complete
|
|
8
|
+
functional queries, including caller-owned `v`, URL spelling and fragments.
|
|
9
|
+
- Preserve external URLs and resources under an external document base,
|
|
10
|
+
public method signatures, semantic version metadata, conditional HTTP caching
|
|
11
|
+
and stable application caches. Regenerate managed references through the
|
|
12
|
+
public package workflow after updating the SDK.
|
|
13
|
+
|
|
3
14
|
## 0.42.1
|
|
4
15
|
|
|
5
16
|
- Keep Enter as native newline input on phones and tablets using the shared
|
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ version-locked SDK runtime, while an integrated Arcane checkout uses its live
|
|
|
19
19
|
`arcane/` runtime. Both profiles share the theme, packaging, event, cancellation,
|
|
20
20
|
and browser run contracts while retaining their selected application layout.
|
|
21
21
|
|
|
22
|
-
This checkout defines the `0.42.
|
|
22
|
+
This checkout defines the `0.42.2` SDK contract. Applications pin one exact npm
|
|
23
23
|
version and lockfile; registry state is deliberately not baked into application
|
|
24
24
|
artifacts.
|
|
25
25
|
|
|
@@ -2444,9 +2444,10 @@ module URLs reuse and export the registered constructor, including overlapping
|
|
|
2444
2444
|
application startup and developer error-dialog imports. Existing component
|
|
2445
2445
|
instances, loading, readiness events, and teardown keep that same constructor.
|
|
2446
2446
|
|
|
2447
|
-
Local component resources use
|
|
2448
|
-
|
|
2449
|
-
remain intact.
|
|
2447
|
+
Local component resources use stable URLs. The loader removes retired SDK-owned
|
|
2448
|
+
`arcaneVersion` fields and adds no cache suffix. Functional query fields,
|
|
2449
|
+
including caller-owned `v` fields, and fragments remain intact. External resource
|
|
2450
|
+
URLs retain their complete query. Ordinary HTTP conditional caching is unchanged.
|
|
2450
2451
|
|
|
2451
2452
|
Exact exports: `default`.
|
|
2452
2453
|
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/theme.css"><link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>:host{display:block;max-width:34rem}.calculator{display:grid;gap:var(--arcane-space-3);padding:var(--arcane-space-4)}.display{display:grid;gap:var(--arcane-space-2)}.display input{font:600 1.3rem/1.4 ui-monospace,monospace;text-align:right}.result{min-height:2.5rem;margin:0;text-align:right;font-size:1.8rem;font-weight:750;overflow-wrap:anywhere}.keys{display:grid;gap:var(--arcane-space-2);grid-template-columns:repeat(5,1fr)}.keys button{min-width:0;padding:.7rem .35rem}.status{min-height:1.4rem;margin:0;color:var(--arcane-muted)}@media(max-width:28rem){.keys{grid-template-columns:repeat(4,1fr)}}</style>
|
|
3
3
|
<section class="calculator arcane-card"><div class="display arcane-field"><label for="expression">Expression</label><input id="expression" inputmode="decimal" autocomplete="off" spellcheck="false" value=""><p id="result" class="result" aria-live="polite">0</p></div><div id="keys" class="keys" aria-label="Calculator keypad"></div><p id="status" class="status" role="status"></p></section>
|
|
4
4
|
<script type="module">const host=this,root=host.shadowRoot,input=root.querySelector('#expression'),result=root.querySelector('#result'),status=root.querySelector('#status'),keys=root.querySelector('#keys');const {default:CalculatorEngine}=await import('../modules/CalculatorEngine.js');const {createArcaneEventSource,projectArcaneDOMEvent}=await import('arcane-os/event-manager');const events=createArcaneEventSource(host,{source:'arcane.component.calculator',eventTypes:['calculation-complete','calculation-error','calculator-ready']}),lifecycleController=new AbortController();const engine=new CalculatorEngine(),definitions=['7','8','9','/','sqrt(','4','5','6','*','^','1','2','3','-','%','0','.','(',')','+','pi','e','C','⌫','='];let destroyed=false,operationSequence=0;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/layout.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/layout.css" />
|
|
2
2
|
<style>
|
|
3
3
|
:host {
|
|
4
4
|
display: block;
|
|
@@ -842,7 +842,7 @@
|
|
|
842
842
|
speechImport.id='speech';
|
|
843
843
|
speechImport.setAttribute(
|
|
844
844
|
'href',
|
|
845
|
-
new URL('./speech.html
|
|
845
|
+
new URL('./speech.html',componentURL).href
|
|
846
846
|
);
|
|
847
847
|
speechMount.replaceWith(speechImport);
|
|
848
848
|
const events=createArcaneEventSource(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{display:block;min-width:0;height:100%}.shell{display:grid;grid-template-rows:auto 1fr auto;height:100%;min-height:32rem}.heading{align-items:center;display:flex;gap:.75rem;justify-content:space-between;padding:1rem;border-bottom:1px solid var(--border-color,#ccd4df)}.heading h2,.heading p{margin:0}.heading p{color:var(--muted-text-color,#607080)}.badge{border:1px solid var(--border-color,#ccd4df);border-radius:999px;padding:.25rem .55rem;font-size:.72rem;text-transform:uppercase}.messages{display:flex;flex-direction:column;gap:.8rem;overflow:auto;padding:1rem}.message{align-self:flex-start;max-width:min(78%,42rem);padding:.75rem .9rem;border:1px solid var(--border-color,#ccd4df);border-radius:.9rem;background:var(--modal-background,#fff)}.message.outbound{align-self:flex-end;color:var(--button-text-color,#fff);background:var(--primary-color,#172238)}.message p{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}.message footer{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.4rem;font-size:.7rem;opacity:.72}.advisory{display:grid;gap:.45rem;margin-top:.7rem;padding:.7rem;border:2px solid var(--border-color,#ccd4df);border-radius:.65rem;background:var(--background-color,#f5f7fa);color:var(--text-color,#172238)}.advisory[data-level="critical"],.advisory[data-level="high"]{border-color:rgb(174,48,52)}.advisory[data-level="caution"]{border-color:rgb(190,120,34)}.advisory strong,.advisory p{margin:0}.advisory ul{margin:.1rem 0;padding-left:1.2rem}.advisory button{justify-self:start}.composer{display:grid;gap:.6rem;padding:1rem;border-top:1px solid var(--border-color,#ccd4df)}textarea{min-height:5rem;resize:vertical}.composer-row{align-items:center;display:flex;gap:.75rem;justify-content:space-between}.status{color:var(--muted-text-color,#607080);margin:0}.blank{display:grid;place-items:center;height:100%;padding:2rem;text-align:center}.blank p{color:var(--muted-text-color,#607080)}
|
|
4
4
|
</style>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/layout.css
|
|
2
|
-
<link rel="stylesheet" href="./arcane/css/dashboard-config.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/layout.css">
|
|
2
|
+
<link rel="stylesheet" href="./arcane/css/dashboard-config.css">
|
|
3
3
|
<style>
|
|
4
4
|
:host{
|
|
5
5
|
display:block;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
</style>
|
|
8
8
|
|
|
9
9
|
<button id="openConfig" type="button" aria-haspopup="dialog" disabled></button>
|
|
10
|
-
<html-import id="configModal" class="modal" href="./arcane/components/modal.html
|
|
10
|
+
<html-import id="configModal" class="modal" href="./arcane/components/modal.html"></html-import>
|
|
11
11
|
|
|
12
12
|
<script type="module">
|
|
13
13
|
const {default:Is}=await import('strong-type');
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
const items=document.createElement('section');
|
|
234
234
|
|
|
235
235
|
styles.rel='stylesheet';
|
|
236
|
-
styles.href=new URL('../css/dashboard-config.css
|
|
236
|
+
styles.href=new URL('../css/dashboard-config.css',componentHref).href;
|
|
237
237
|
heading.dataset.dashboardConfigHeading='';
|
|
238
238
|
message.dataset.dashboardConfigDescription='';
|
|
239
239
|
empty.className='dashboard-config-empty';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/layout.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/layout.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{
|
|
4
4
|
display:block;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
</style>
|
|
11
11
|
|
|
12
12
|
<button id="openMaintenance" type="button" aria-haspopup="dialog">Maintenance</button>
|
|
13
|
-
<html-import id="maintenanceModal" class="modal" href="./arcane/components/modal.html
|
|
13
|
+
<html-import id="maintenanceModal" class="modal" href="./arcane/components/modal.html"></html-import>
|
|
14
14
|
|
|
15
15
|
<script type="module">
|
|
16
16
|
const {arcaneLogging}=await import('arcane-os/logging');
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
const openButton=host.shadowRoot.querySelector('#openMaintenance');
|
|
20
20
|
const maintenanceModal=host.shadowRoot.querySelector('#maintenanceModal');
|
|
21
21
|
const {default:waitForComponent}=await import('../modules/WaitForComponent.js');
|
|
22
|
-
const {clearEmptyChatsAndMemories}=await import('../modules/DataMaintenance.js
|
|
22
|
+
const {clearEmptyChatsAndMemories}=await import('../modules/DataMaintenance.js');
|
|
23
23
|
const {createArcaneEventSource,projectArcaneDOMEvent}=await import('arcane-os/event-manager');
|
|
24
24
|
const events=createArcaneEventSource(host,{source:'arcane.component.data-maintenance',eventTypes:['data-maintenance-complete','data-maintenance-ready']});
|
|
25
25
|
const lifecycleController=new AbortController();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/layout.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/layout.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{
|
|
4
4
|
display:flex;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
</style>
|
|
12
12
|
|
|
13
13
|
<button id="openData" type="button" aria-haspopup="dialog"></button>
|
|
14
|
-
<html-import id="dataModal" class="modal" href="./arcane/components/modal.html
|
|
14
|
+
<html-import id="dataModal" class="modal" href="./arcane/components/modal.html"></html-import>
|
|
15
15
|
|
|
16
16
|
<script type="module">
|
|
17
17
|
const {default:Is}=await import('strong-type');
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
fileManager.dataset.layout=host.dataset.layout||'files';
|
|
91
91
|
fileManager.setAttribute(
|
|
92
92
|
'href',
|
|
93
|
-
new URL('./file-manager.html
|
|
93
|
+
new URL('./file-manager.html',componentHref).href
|
|
94
94
|
);
|
|
95
95
|
|
|
96
96
|
content.append(heading,fileManager);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
2
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/theme.css">
|
|
2
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
3
3
|
<style>
|
|
4
4
|
:host{display:block;min-width:0}
|
|
5
5
|
.directory-picker{min-width:0}
|
|
@@ -435,9 +435,9 @@
|
|
|
435
435
|
|
|
436
436
|
<input id="fileUpload" type="file" hidden multiple>
|
|
437
437
|
|
|
438
|
-
<html-import id="directoryModal" class="modal" href="./arcane/components/modal.html
|
|
439
|
-
<html-import id="fileModal" class="modal" href="./arcane/components/modal.html
|
|
440
|
-
<html-import id="deleteModal" class="modal" href="./arcane/components/modal.html
|
|
438
|
+
<html-import id="directoryModal" class="modal" href="./arcane/components/modal.html"></html-import>
|
|
439
|
+
<html-import id="fileModal" class="modal" href="./arcane/components/modal.html"></html-import>
|
|
440
|
+
<html-import id="deleteModal" class="modal" href="./arcane/components/modal.html"></html-import>
|
|
441
441
|
|
|
442
442
|
<script type="module">
|
|
443
443
|
const {default:Is}=await import('strong-type');
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{display:block}.heading{align-items:flex-start;display:flex;gap:1rem;justify-content:space-between}.heading h2,.heading p{margin:0}.services{display:grid;gap:.75rem}.service{display:grid;gap:.65rem;padding:1rem;border:1px solid var(--border-color,#ccd4df);border-radius:.7rem}.service-head{align-items:flex-start;display:flex;gap:.75rem}.service-head input{height:1.25rem;width:1.25rem}.service-copy{flex:1}.service-copy strong{display:block}.service-copy p{color:var(--muted-text-color,#607080);margin:.2rem 0 0}.fields{display:grid;gap:.6rem;grid-template-columns:repeat(auto-fit,minmax(13rem,1fr))}.status{border-radius:999px;padding:.2rem .55rem;background:var(--secondary-color,#e8edf4);font-size:.72rem}.actions{display:flex;gap:.5rem;justify-content:flex-end}.notice{padding:.75rem;border-left:.25rem solid var(--focus-color,#7657d5);background:var(--secondary-color,#e8edf4)}
|
|
4
4
|
</style>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/layout.css
|
|
2
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
3
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/layout.css">
|
|
2
|
+
<link rel="stylesheet" href="./arcane/css/theme.css">
|
|
3
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
4
4
|
|
|
5
5
|
<style>
|
|
6
6
|
:host{
|
|
@@ -219,7 +219,7 @@
|
|
|
219
219
|
const host=this;
|
|
220
220
|
host.ready=false;
|
|
221
221
|
|
|
222
|
-
const {default:MD}=await import('../modules/MD.js
|
|
222
|
+
const {default:MD}=await import('../modules/MD.js');
|
|
223
223
|
const {createArcaneEventSource,projectArcaneDOMEvent}=await import('arcane-os/event-manager');
|
|
224
224
|
const events=createArcaneEventSource(host,{source:'arcane.component.markdown-document',eventTypes:['markdown-document-state','markdown-document-empty','markdown-document-error','markdown-document-loading','markdown-document-rendered','markdown-document-navigate','markdown-document-ready']});
|
|
225
225
|
const lifecycleController=new AbortController();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/layout.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/layout.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{
|
|
4
4
|
display:block;
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
const {arcaneLogging}=await import('arcane-os/logging');
|
|
130
130
|
|
|
131
131
|
const host=this;
|
|
132
|
-
const {default:MD}=await import('../modules/MD.js
|
|
132
|
+
const {default:MD}=await import('../modules/MD.js');
|
|
133
133
|
const {
|
|
134
134
|
applyMarkdownFormat,
|
|
135
135
|
normalizeMarkdownOptions
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/theme.css"><link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>:host{display:block}.player-shell{display:grid;gap:var(--arcane-space-4)}.loader{display:flex;gap:var(--arcane-space-2)}.loader input{min-width:0;width:100%}.player{aspect-ratio:16/9;display:grid;place-items:center;background:var(--arcane-surface-muted);border:1px solid var(--arcane-border);border-radius:var(--arcane-radius-large)}iframe{width:100%;height:100%;border:0}.empty{text-align:center;color:var(--arcane-muted);padding:var(--arcane-space-5)}.footer{align-items:center;display:flex;gap:var(--arcane-space-3);justify-content:space-between}.status{margin:0;color:var(--arcane-muted)}@media(max-width:36rem){.loader,.footer{align-items:stretch;flex-direction:column}}</style>
|
|
3
3
|
<section class="player-shell"><form id="loader" class="loader"><label class="visually-hidden" for="mediaUrl">Video or playlist address</label><input id="mediaUrl" type="text" inputmode="url" autocomplete="off" spellcheck="false" placeholder="Paste a YouTube video or playlist URL"><button class="arcane-button" type="submit">Play</button></form><div class="player"><div id="empty" class="empty"><strong>Choose something to play</strong><p>Paste a YouTube or YouTube Music video or playlist address.</p></div><iframe id="frame" title="Embedded media player" hidden allow="autoplay; encrypted-media; picture-in-picture; fullscreen" allowfullscreen></iframe></div><div class="footer"><p id="status" class="status" role="status" aria-live="polite">Nothing loaded.</p><button id="platform" class="arcane-button arcane-button--secondary" type="button">Open platform</button></div></section>
|
|
4
4
|
<script type="module">const host=this,root=host.shadowRoot,form=root.querySelector('#loader'),input=root.querySelector('#mediaUrl'),frame=root.querySelector('#frame'),empty=root.querySelector('#empty'),status=root.querySelector('#status');const {parseYouTubeMedia,youtubeEmbedUrl}=await import('../modules/YouTubeMedia.js');const {createArcaneEventSource,projectArcaneDOMEvent}=await import('arcane-os/event-manager');const events=createArcaneEventSource(host,{source:'arcane.component.media-embed',eventTypes:['media-open-platform','media-load','media-error','media-embed-ready']}),lifecycleController=new AbortController();let platformUrl='https://www.youtube.com/',privacyEnhanced=false,destroyed=false,operationSequence=0;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
2
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/theme.css">
|
|
2
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
3
3
|
<style>
|
|
4
4
|
:host{
|
|
5
5
|
display:block;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/theme.css"><link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>:host{display:block}.capture{display:grid;gap:var(--arcane-space-4)}.actions{display:grid;gap:var(--arcane-space-3);grid-template-columns:repeat(3,minmax(0,1fr))}.action{display:grid;gap:var(--arcane-space-2);padding:var(--arcane-space-4);text-align:left}.action strong{font-size:1.05rem}.action span{color:var(--arcane-muted);font-size:.85rem}.recording{align-items:center;display:flex;gap:var(--arcane-space-3);justify-content:space-between;padding:var(--arcane-space-3);border:1px solid var(--arcane-border);border-radius:var(--arcane-radius-medium)}.preview{display:grid;place-items:center;min-height:16rem;overflow:auto;background:var(--arcane-surface-muted);border:1px solid var(--arcane-border);border-radius:var(--arcane-radius-large)}.preview :where(img,video){display:block}.empty{color:var(--arcane-muted);text-align:center}.status{margin:0;color:var(--arcane-muted)}@media(max-width:44rem){.actions{grid-template-columns:1fr}}</style>
|
|
3
3
|
<section class="capture"><div class="actions"><button class="action arcane-card" type="button" data-capture="image"><strong>Screenshot</strong><span>Capture the selected display as PNG.</span></button><button class="action arcane-card" type="button" data-capture="video"><strong>Record video</strong><span>Record the selected display in a browser-supported video format.</span></button><button class="action arcane-card" type="button" data-capture="gif"><strong>Record GIF</strong><span>Record the selected display as an animated GIF.</span></button></div><div id="recording" class="recording" hidden><span id="recordingLabel">Recording…</span><button id="stop" class="arcane-button" type="button">Stop recording</button></div><div id="preview" class="preview"><div class="empty"><strong>No capture yet</strong><p>Your capture remains on this device unless you choose to save it.</p></div></div><p id="status" class="status" role="status" aria-live="polite">Choose a capture type. Your browser will ask which display to share.</p></section>
|
|
4
4
|
<script type="module">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/layout.css
|
|
2
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
3
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/layout.css">
|
|
2
|
+
<link rel="stylesheet" href="./arcane/css/theme.css">
|
|
3
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
4
4
|
|
|
5
5
|
<style>
|
|
6
6
|
:host{
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{display:block;height:100%;min-height:18rem;--terminal-bg:var(--background,rgb(244, 246, 251));--terminal-fg:var(--text-color,rgb(23, 34, 56));--terminal-muted:var(--muted-text-color,rgb(95, 107, 130));--terminal-accent:var(--focus-color,rgb(118, 87, 213));--terminal-danger:var(--danger-color,rgb(165, 56, 56));--terminal-font:ui-monospace,"Cascadia Code","SFMono-Regular",Consolas,monospace;--terminal-font-size:14px;--terminal-line-height:1.55;--terminal-opacity:1}
|
|
4
4
|
*{box-sizing:border-box}.workspace{background:color-mix(in srgb,var(--terminal-bg) calc(var(--terminal-opacity)*100%),transparent);border:1px solid color-mix(in srgb,var(--terminal-accent) 20%,transparent);border-radius:.85rem;color:var(--terminal-fg);display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;height:100%;overflow:visible;box-shadow:0 1.5rem 5rem rgba(0,0,0,.28)}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{display:block;min-width:0}.intro{display:grid;gap:var(--arcane-space-1)}.intro p{margin:0}.editor{display:grid;gap:var(--arcane-space-4)}.identity{display:grid;gap:var(--arcane-space-4);grid-template-columns:2fr 1fr}.colors{display:grid;gap:var(--arcane-space-3);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr))}.color-field{align-items:center;display:grid;gap:.65rem;grid-template-columns:2.5rem minmax(0,1fr)}.color-field input{height:2.5rem;padding:.15rem;width:2.5rem}.color-field label{font-weight:650}.status{margin-right:auto;min-height:1.4em}.preview{border:1px solid var(--border-color);border-radius:var(--arcane-radius-medium);display:flex;gap:.6rem;padding:.8rem;background:var(--background);color:var(--text-color)}.preview span{border-radius:.4rem;padding:.5rem .7rem;background:var(--secondary-color)}.preview strong{border-radius:.4rem;padding:.5rem .7rem;background:var(--primary-color);color:var(--button-text-color)}@media(max-width:36rem){.identity{grid-template-columns:1fr}}
|
|
4
4
|
</style>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{display:block;min-width:0}.toolbar{display:grid;gap:.75rem;padding:1rem;border-bottom:1px solid var(--border-color,#ccd4df)}.toolbar-row{display:flex;gap:.5rem}.toolbar input{min-width:0;width:100%}.filters{display:flex;flex-wrap:wrap;gap:.4rem}.filters button{overflow-wrap:anywhere}.list{display:grid}.thread{display:grid;gap:.35rem;width:100%;padding:1rem;border:0;border-bottom:1px solid var(--border-color,#ccd4df);color:inherit;background:transparent;text-align:left}.thread:hover,.thread[aria-current="true"]{background:var(--secondary-color,#e8edf4)}.thread:focus-visible{outline:.18rem solid var(--focus-color,#7657d5);outline-offset:-.2rem}.line{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;justify-content:space-between}.title{font-weight:750;overflow-wrap:anywhere}.preview{color:var(--muted-text-color,#607080);overflow-wrap:anywhere}.meta{align-items:center;display:flex;flex-wrap:wrap;gap:.4rem;font-size:.75rem}.badge{border:1px solid var(--border-color,#ccd4df);border-radius:999px;padding:.15rem .45rem;text-transform:uppercase}.unread{display:grid;place-items:center;min-width:1.4rem;height:1.4rem;border-radius:999px;color:var(--button-text-color,#fff);background:var(--focus-color,#7657d5);font-weight:800}.empty{padding:2rem;text-align:center}.empty p{color:var(--muted-text-color,#607080)}
|
|
4
4
|
</style>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/layout.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/layout.css">
|
|
2
2
|
<style>
|
|
3
3
|
:host{
|
|
4
4
|
display:block;
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
{requestAIRuntimeIntent,subscribeAIRuntimeState},
|
|
139
139
|
{default:ContinuousVoiceCapture}
|
|
140
140
|
]=await Promise.all([
|
|
141
|
-
import('../modules/MD.js
|
|
141
|
+
import('../modules/MD.js'),
|
|
142
142
|
import('../modules/ComponentContracts.js'),
|
|
143
143
|
import('../modules/AIRuntimeState.js'),
|
|
144
144
|
import('../modules/ContinuousVoiceCapture.js')
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/theme.css"><link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
2
2
|
<style>:host{display:block}.widget{display:grid;gap:var(--arcane-space-4)}.current{align-items:center;display:grid;gap:var(--arcane-space-4);grid-template-columns:auto 1fr auto}.symbol{font-size:clamp(2.5rem,8vw,5rem);line-height:1}.temperature{font-size:clamp(2.2rem,7vw,4.5rem);font-weight:760;line-height:1}.location h2,.location p{margin:0}.location p,.details{color:var(--arcane-muted)}.details{display:grid;gap:var(--arcane-space-1);text-align:right}.forecast{display:grid;gap:var(--arcane-space-2);grid-template-columns:repeat(7,minmax(5.5rem,1fr));overflow:auto}.day{display:grid;gap:var(--arcane-space-2);padding:var(--arcane-space-3);text-align:center;background:var(--arcane-surface-muted);border:1px solid var(--arcane-border);border-radius:var(--arcane-radius-medium)}.day strong{white-space:nowrap}.day-symbol{font-size:1.8rem}.empty{padding:var(--arcane-space-6);text-align:center;color:var(--arcane-muted)}.footer{display:flex;align-items:center;justify-content:space-between;gap:var(--arcane-space-3)}@media(max-width:36rem){.current{grid-template-columns:auto 1fr}.details{grid-column:1/-1;text-align:left;grid-template-columns:repeat(3,1fr)}}</style>
|
|
3
3
|
<section class="widget arcane-card"><div id="empty" class="empty"><strong>Weather is ready for a location</strong><p>Search for a city or postal code to load current conditions and the forecast.</p></div><div id="content" hidden><div class="arcane-card__body current"><span id="symbol" class="symbol" aria-hidden="true"></span><div class="location"><h2 id="location" class="arcane-section-heading"></h2><p id="condition"></p><div><span id="temperature" class="temperature"></span></div></div><div class="details"><span id="feels"></span><span id="humidity"></span><span id="wind"></span></div></div><div id="forecast" class="arcane-card__body forecast"></div><footer class="arcane-card__footer footer"><span id="source" class="arcane-help"></span><button id="refresh" class="arcane-button arcane-button--secondary" type="button">Refresh</button></footer></div></section>
|
|
4
4
|
<script type="module">const host=this,root=host.shadowRoot,empty=root.querySelector('#empty'),content=root.querySelector('#content'),forecast=root.querySelector('#forecast');const {createArcaneEventSource,projectArcaneDOMEvent}=await import('arcane-os/event-manager');const events=createArcaneEventSource(host,{source:'arcane.component.weather-widget',eventTypes:['weather-refresh','weather-widget-ready']});let weather=null,destroyed=false;const conditions=new Map([[0,['Clear','☀️']],[1,['Mostly clear','🌤️']],[2,['Partly cloudy','⛅']],[3,['Overcast','☁️']],[45,['Fog','🌫️']],[48,['Freezing fog','🌫️']],[51,['Light drizzle','🌦️']],[53,['Drizzle','🌦️']],[55,['Heavy drizzle','🌧️']],[61,['Light rain','🌦️']],[63,['Rain','🌧️']],[65,['Heavy rain','🌧️']],[71,['Light snow','🌨️']],[73,['Snow','🌨️']],[75,['Heavy snow','❄️']],[80,['Rain showers','🌦️']],[81,['Rain showers','🌧️']],[82,['Heavy showers','⛈️']],[95,['Thunderstorm','⛈️']],[96,['Thunderstorm with hail','⛈️']],[99,['Severe thunderstorm','⛈️']]]);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<link rel="stylesheet" href="./arcane/css/theme.css
|
|
2
|
-
<link rel="stylesheet" href="./arcane/css/primitives.css
|
|
1
|
+
<link rel="stylesheet" href="./arcane/css/theme.css">
|
|
2
|
+
<link rel="stylesheet" href="./arcane/css/primitives.css">
|
|
3
3
|
<style>
|
|
4
4
|
:host{display:block;height:100%;min-height:30rem}
|
|
5
5
|
.navigator{display:grid;grid-template-rows:auto 1fr auto;height:100%;min-height:30rem}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import Is from 'strong-type';
|
|
2
2
|
const is=new Is(false);
|
|
3
3
|
|
|
4
|
-
import * as ArcaneNetworkPolicy from './ArcaneNetworkPolicy.js
|
|
4
|
+
import * as ArcaneNetworkPolicy from './ArcaneNetworkPolicy.js';
|
|
5
5
|
|
|
6
6
|
function completeText(value,fallback){
|
|
7
7
|
return is.string(value)&&value.length>0?value:fallback;
|
|
@@ -3,13 +3,13 @@ const is=new Is(false);
|
|
|
3
3
|
|
|
4
4
|
import { arcaneLogging } from 'arcane-os/logging';
|
|
5
5
|
import ArcaneCommunicationBridge from './ArcaneCommunicationBridge.js';
|
|
6
|
-
import CommunicationHub from './CommunicationHub.js
|
|
6
|
+
import CommunicationHub from './CommunicationHub.js';
|
|
7
7
|
import CommunicationPreferences from './CommunicationPreferences.js';
|
|
8
8
|
import {loadAndApplyTheme} from './ThemeManager.js';
|
|
9
9
|
import {
|
|
10
10
|
inspectMessageRecords,
|
|
11
11
|
unavailableMessageInspection
|
|
12
|
-
} from './MessageAdvisory.js
|
|
12
|
+
} from './MessageAdvisory.js';
|
|
13
13
|
|
|
14
14
|
export const COMMUNICATION_APP_CONTROLLER_ERROR_CODES={
|
|
15
15
|
destroyed:'ARCANE_COMMUNICATION_APP_CONTROLLER_DESTROYED'
|
|
@@ -4,7 +4,7 @@ const is=new Is(false);
|
|
|
4
4
|
import {createArcaneEventSource} from 'arcane-os/event-manager';
|
|
5
5
|
import CommunicationMessage from '../entities/CommunicationMessage.js';
|
|
6
6
|
import CommunicationThread from '../entities/CommunicationThread.js';
|
|
7
|
-
import CommunicationProviderRegistry from './CommunicationProviderRegistry.js
|
|
7
|
+
import CommunicationProviderRegistry from './CommunicationProviderRegistry.js';
|
|
8
8
|
|
|
9
9
|
const communicationHubEvents={
|
|
10
10
|
refreshCancelled:'communications-refresh-cancelled',
|
|
@@ -4,7 +4,7 @@ const is=new Is(false);
|
|
|
4
4
|
import {
|
|
5
5
|
CONVERSATION_ACTION_ITEM_BASES,
|
|
6
6
|
normalizeRememberedConversationActions
|
|
7
|
-
} from './ConversationActionItems.js
|
|
7
|
+
} from './ConversationActionItems.js';
|
|
8
8
|
|
|
9
9
|
const DEFAULT_TOOL_NAME='prepare_conversation_closing_report';
|
|
10
10
|
const TOOL_NAME_PATTERN=/^[a-z][a-z0-9_]*$/;
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
const DEFAULT_DELAY_MS=2_000;
|
|
12
12
|
const LEDGER_STORAGE_KEY='arcane-global-errors-v1';
|
|
13
13
|
const HANDLER_MARKER=Symbol.for('arcane.global-errors.handler');
|
|
14
|
-
const DEVELOPER_MODAL_HREF=new URL('../components/modal.html
|
|
14
|
+
const DEVELOPER_MODAL_HREF=new URL('../components/modal.html',import.meta.url).href;
|
|
15
15
|
const ERROR_EVENT_TYPES={
|
|
16
16
|
browserErrorCaptured:'arcane-error-captured',
|
|
17
17
|
unhandledRejectionCaptured:'arcane-unhandled-rejection-captured'
|
|
@@ -17,15 +17,9 @@ globalThis[htmlImportHostRegistryKey]=htmlImportHostRegistry;
|
|
|
17
17
|
let htmlImportScriptId=0;
|
|
18
18
|
|
|
19
19
|
const htmlImportModuleURL=new URL(import.meta.url);
|
|
20
|
-
const htmlImportAssetVersion=htmlImportModuleURL.searchParams.get('arcaneVersion');
|
|
21
20
|
|
|
22
|
-
function
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function versionComponentResource(value,baseHref){
|
|
27
|
-
const clean=pwaResourceUrlsEnabled();
|
|
28
|
-
if((!htmlImportAssetVersion&&!clean)||!is.string(value)||!value||value.startsWith('#')){
|
|
21
|
+
function cleanComponentResource(value,baseHref){
|
|
22
|
+
if(!is.string(value)||!value||value.startsWith('#')){
|
|
29
23
|
return value;
|
|
30
24
|
}
|
|
31
25
|
let resolvedURL;
|
|
@@ -43,32 +37,20 @@ function versionComponentResource(value,baseHref){
|
|
|
43
37
|
const fragment=fragmentIndex<0?'':value.slice(fragmentIndex);
|
|
44
38
|
const resource=fragmentIndex<0?value:value.slice(0,fragmentIndex);
|
|
45
39
|
const queryIndex=resource.indexOf('?');
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
const fields=query?query.split('&').map(function versionQueryField(field){
|
|
51
|
-
const parameter=new URLSearchParams(field);
|
|
52
|
-
if(parameter.has('v'))return null;
|
|
53
|
-
if(!parameter.has('arcaneVersion'))return field;
|
|
54
|
-
if(clean||replaced)return null;
|
|
55
|
-
replaced=true;
|
|
40
|
+
if(queryIndex<0)return value;
|
|
41
|
+
const pathname=resource.slice(0,queryIndex);
|
|
42
|
+
const query=resource.slice(queryIndex+1);
|
|
43
|
+
const fields=query.split('&').filter(function retainQueryField(field){
|
|
56
44
|
const equals=field.indexOf('=');
|
|
57
45
|
const key=equals<0?field:field.slice(0,equals);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
if(!replaced){
|
|
68
|
-
if(fields.at(-1)==='')fields[fields.length-1]=versionField;
|
|
69
|
-
else fields.push(versionField);
|
|
70
|
-
}
|
|
71
|
-
return `${pathname}?${fields.join('&')}${fragment}`;
|
|
46
|
+
let decodedKey=key;
|
|
47
|
+
try{decodedKey=decodeURIComponent(key.replaceAll('+',' '));}
|
|
48
|
+
catch{decodedKey=key;}
|
|
49
|
+
return decodedKey!=='arcaneVersion';
|
|
50
|
+
});
|
|
51
|
+
return fields.length>0
|
|
52
|
+
?`${pathname}?${fields.join('&')}${fragment}`
|
|
53
|
+
:`${pathname}${fragment}`;
|
|
72
54
|
}
|
|
73
55
|
|
|
74
56
|
function componentRuntimeRoot(resolvedHref){
|
|
@@ -91,7 +73,6 @@ function resolveComponentResource(value,runtimeRoot){
|
|
|
91
73
|
}
|
|
92
74
|
|
|
93
75
|
function resolveComponentStyleResources(styleText,runtimeRoot){
|
|
94
|
-
if(!runtimeRoot&&!htmlImportAssetVersion&&!pwaResourceUrlsEnabled())return styleText;
|
|
95
76
|
const parts=[];
|
|
96
77
|
let copiedThrough=0;
|
|
97
78
|
let index=0;
|
|
@@ -149,7 +130,7 @@ function resolveComponentStyleResources(styleText,runtimeRoot){
|
|
|
149
130
|
const resourcePath=styleText.slice(start,end);
|
|
150
131
|
// CSS escapes retain their original spelling until their URL syntax is decoded.
|
|
151
132
|
if(resourcePath.includes('\\'))return;
|
|
152
|
-
const resolved=
|
|
133
|
+
const resolved=cleanComponentResource(
|
|
153
134
|
resolveComponentResource(resourcePath,runtimeRoot),
|
|
154
135
|
document.baseURI
|
|
155
136
|
);
|
|
@@ -237,7 +218,7 @@ function createComponentFragment(html,resolvedHref){
|
|
|
237
218
|
const resolved=resolveComponentResource(value,runtimeRoot);
|
|
238
219
|
const navigation=attribute==='href'
|
|
239
220
|
&&['a','area','base'].includes(element.localName);
|
|
240
|
-
const versioned=navigation?resolved:
|
|
221
|
+
const versioned=navigation?resolved:cleanComponentResource(
|
|
241
222
|
resolved,
|
|
242
223
|
element.localName==='script'?resolvedHref:document.baseURI
|
|
243
224
|
);
|
|
@@ -257,7 +238,7 @@ function resolveRelativeDynamicImports(source,baseHref){
|
|
|
257
238
|
return source.replace(
|
|
258
239
|
/\bimport\s*\(\s*(['"])(\.{1,2}\/[^'"]+)\1\s*\)/gu,
|
|
259
240
|
function resolveDynamicImport(_match,_quote,specifier){
|
|
260
|
-
const resolved=
|
|
241
|
+
const resolved=cleanComponentResource(new URL(specifier,baseHref).href,baseHref);
|
|
261
242
|
return `import(${JSON.stringify(resolved)})`;
|
|
262
243
|
}
|
|
263
244
|
);
|
|
@@ -327,7 +308,7 @@ class HTMLImport extends HTMLElement {
|
|
|
327
308
|
|
|
328
309
|
try{
|
|
329
310
|
const resolvedURL=new URL(href,document.baseURI);
|
|
330
|
-
resolvedHref=
|
|
311
|
+
resolvedHref=cleanComponentResource(resolvedURL.href,document.baseURI);
|
|
331
312
|
const response=await fetch(resolvedHref,{
|
|
332
313
|
cache:'default',
|
|
333
314
|
method:'GET',
|
|
@@ -497,7 +478,7 @@ class HTMLImport extends HTMLElement {
|
|
|
497
478
|
let sourceBaseHref=contentBaseHref;
|
|
498
479
|
const scriptSource=script.getAttribute('src');
|
|
499
480
|
if(scriptSource!==null){
|
|
500
|
-
const requestedScriptHref=
|
|
481
|
+
const requestedScriptHref=cleanComponentResource(
|
|
501
482
|
new URL(scriptSource,contentBaseHref).href,
|
|
502
483
|
contentBaseHref
|
|
503
484
|
);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {analyzeRiskSignals} from './RiskSignalAnalyzer.js';
|
|
2
|
-
import {canonicalNetworkHostname,emptyArcaneNetworkPolicy,findDeniedDomainRule,loadArcaneNetworkPolicy} from './ArcaneNetworkPolicy.js
|
|
2
|
+
import {canonicalNetworkHostname,emptyArcaneNetworkPolicy,findDeniedDomainRule,loadArcaneNetworkPolicy} from './ArcaneNetworkPolicy.js';
|
|
3
3
|
|
|
4
4
|
export const scamRiskSignals=[
|
|
5
5
|
{id:'urgency',label:'Urgency or secrecy pressure',weight:18,pattern:/\b(urgent|immediately|act now|do not tell|keep (?:this|it) secret|stay on the line)\b/i,guidance:'Pause. A legitimate organization will let you verify independently.'},
|
package/src/dev-server.mjs
CHANGED
|
@@ -1270,7 +1270,7 @@ async function startOwnedDevServer({
|
|
|
1270
1270
|
}
|
|
1271
1271
|
}catch{ /* Non-URL values remain under their existing owner. */ }
|
|
1272
1272
|
};
|
|
1273
|
-
const selectedVersion = rewrite && mode === 'source' ?
|
|
1273
|
+
const selectedVersion = rewrite && mode === 'source' ? null : undefined;
|
|
1274
1274
|
const pwaEntry = mode === 'source' && pwaEnabled && entryDocument;
|
|
1275
1275
|
const transformed = pwaEntry || (selectedVersion !== undefined
|
|
1276
1276
|
&& /\.(?:m?js|html?|css|json)$/iu.test(extension));
|
|
@@ -1285,7 +1285,7 @@ async function startOwnedDevServer({
|
|
|
1285
1285
|
pwaEntry,
|
|
1286
1286
|
onReference,
|
|
1287
1287
|
lastModified: transformed
|
|
1288
|
-
? sourceRepresentationModifiedAt(opened,
|
|
1288
|
+
? sourceRepresentationModifiedAt(opened, assetVersion, pwaEntry)
|
|
1289
1289
|
: undefined
|
|
1290
1290
|
}
|
|
1291
1291
|
);
|
package/src/import-map.mjs
CHANGED
|
@@ -820,12 +820,13 @@ function moduleImportsFromTokens(tokens,importer){
|
|
|
820
820
|
}
|
|
821
821
|
|
|
822
822
|
export function versionAssetUrl(value,version=SDK_VERSION){
|
|
823
|
+
// Keep the version argument accepted; SDK versions no longer identify resource URLs.
|
|
823
824
|
if(!is.string(value))return value;
|
|
824
825
|
return applyReferenceEdits(value,assetUrlVersionEdits(value,version));
|
|
825
826
|
}
|
|
826
827
|
|
|
827
828
|
function assetUrlVersionEdits(value,version){
|
|
828
|
-
if(!is.string(value)||!value||
|
|
829
|
+
if(!is.string(value)||!value||value.startsWith('#')
|
|
829
830
|
||value.startsWith('//')||/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(value)
|
|
830
831
|
||/^\s/u.test(value))return [];
|
|
831
832
|
const fragmentStart=value.indexOf('#');
|
|
@@ -833,14 +834,10 @@ function assetUrlVersionEdits(value,version){
|
|
|
833
834
|
const queryStart=address.indexOf('?');
|
|
834
835
|
const pathname=queryStart<0?address:address.slice(0,queryStart);
|
|
835
836
|
if(!pathname)return [];
|
|
836
|
-
|
|
837
|
-
if(clean&&queryStart<0)return [];
|
|
838
|
-
const versionValue=clean?'':encodeURIComponent(String(version));
|
|
839
|
-
if(queryStart<0)return [{start:address.length,end:address.length,value:`?arcaneVersion=${versionValue}`}];
|
|
837
|
+
if(queryStart<0)return [];
|
|
840
838
|
const query=address.slice(queryStart+1);
|
|
841
839
|
const edits=[];
|
|
842
840
|
const parameters=[];
|
|
843
|
-
let versionFound=false;
|
|
844
841
|
let offset=queryStart+1;
|
|
845
842
|
for(const parameter of query.split('&')){
|
|
846
843
|
const equals=parameter.indexOf('=');
|
|
@@ -848,19 +845,11 @@ function assetUrlVersionEdits(value,version){
|
|
|
848
845
|
let decodedKey=key;
|
|
849
846
|
try{decodedKey=decodeURIComponent(key.replaceAll('+',' '));}
|
|
850
847
|
catch{decodedKey=key;}
|
|
851
|
-
const remove=decodedKey==='arcaneVersion'
|
|
848
|
+
const remove=decodedKey==='arcaneVersion';
|
|
852
849
|
parameters.push({start:offset,end:offset+parameter.length,remove});
|
|
853
|
-
if(decodedKey==='arcaneVersion'&&!versionFound&&!clean){
|
|
854
|
-
versionFound=true;
|
|
855
|
-
edits.push({
|
|
856
|
-
start:offset+(equals<0?parameter.length:equals+1),
|
|
857
|
-
end:offset+parameter.length,
|
|
858
|
-
value:`${equals<0?'=':''}${versionValue}`
|
|
859
|
-
});
|
|
860
|
-
}
|
|
861
850
|
offset+=parameter.length+1;
|
|
862
851
|
}
|
|
863
|
-
if(
|
|
852
|
+
if(parameters.every(function removesSdkField(parameter){
|
|
864
853
|
return parameter.remove;
|
|
865
854
|
}))return [{start:queryStart,end:address.length,value:''}];
|
|
866
855
|
// Remove adjacent SDK version fields together, including only their separator.
|
|
@@ -875,11 +864,6 @@ function assetUrlVersionEdits(value,version){
|
|
|
875
864
|
value:''
|
|
876
865
|
});
|
|
877
866
|
}
|
|
878
|
-
if(!clean&&!versionFound)edits.push({
|
|
879
|
-
start:address.length,
|
|
880
|
-
end:address.length,
|
|
881
|
-
value:`&arcaneVersion=${versionValue}`
|
|
882
|
-
});
|
|
883
867
|
return edits;
|
|
884
868
|
}
|
|
885
869
|
|
|
@@ -1126,7 +1110,7 @@ function cssReferenceEdits(source,version,onReference,versionReference=versionAs
|
|
|
1126
1110
|
return edits;
|
|
1127
1111
|
}
|
|
1128
1112
|
|
|
1129
|
-
function importMapReferenceEdits(source,version,onReference){
|
|
1113
|
+
function importMapReferenceEdits(source,version,onReference,rewrite=true){
|
|
1130
1114
|
const tokens=tokenize(source);
|
|
1131
1115
|
const edits=[];
|
|
1132
1116
|
function objectProperties(start){
|
|
@@ -1151,115 +1135,62 @@ function importMapReferenceEdits(source,version,onReference){
|
|
|
1151
1135
|
}
|
|
1152
1136
|
return properties;
|
|
1153
1137
|
}
|
|
1154
|
-
function
|
|
1155
|
-
if(
|
|
1156
|
-
const
|
|
1157
|
-
|
|
1158
|
-
keys.add(alias);
|
|
1159
|
-
aliases.push(`${keyEdit.value}: ${value}`);
|
|
1160
|
-
}
|
|
1161
|
-
function prependAliases(start,aliases,selectedEdits){
|
|
1162
|
-
if(aliases.length===0)return;
|
|
1163
|
-
// Authored keys retain priority even when different spellings normalize to one URL.
|
|
1164
|
-
const offset=tokens[start].end;
|
|
1165
|
-
selectedEdits.push({start:offset,end:offset,value:`${aliases.join(', ')}, `});
|
|
1166
|
-
}
|
|
1167
|
-
function addImports(start){
|
|
1168
|
-
const selectedEdits=[];
|
|
1169
|
-
const aliases=[];
|
|
1170
|
-
const properties=objectProperties(start);
|
|
1171
|
-
const keys=new Set(properties.map(function importKey(property){return property.key;}));
|
|
1138
|
+
function cleanProperties(properties,{scopes=false}={}){
|
|
1139
|
+
if(!rewrite)return properties;
|
|
1140
|
+
const groups=new Map();
|
|
1141
|
+
const removed=new Set();
|
|
1172
1142
|
for(const property of properties){
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
}
|
|
1188
|
-
if(version===null){
|
|
1189
|
-
function cleanProperties(properties,{scopes=false}={}){
|
|
1190
|
-
const groups=new Map();
|
|
1191
|
-
const removed=new Set();
|
|
1192
|
-
for(const property of properties){
|
|
1193
|
-
const key=scopes
|
|
1194
|
-
?versionImportMapUrl(property.key,null)
|
|
1195
|
-
:versionImportMapSpecifier(property.key,null);
|
|
1196
|
-
if(!groups.has(key))groups.set(key,[]);
|
|
1197
|
-
groups.get(key).push(property);
|
|
1198
|
-
}
|
|
1199
|
-
for(const [key,group] of groups){
|
|
1200
|
-
if(group.every(function unchangedKey(property){return property.key===key;}))continue;
|
|
1201
|
-
// An authored clean key owns the target when old generated aliases converge.
|
|
1202
|
-
const selected=group.findLast(function existingCleanKey(property){
|
|
1203
|
-
return property.key===key;
|
|
1204
|
-
})??group.at(-1);
|
|
1205
|
-
for(const property of group){
|
|
1206
|
-
if(property!==selected)removed.add(property);
|
|
1207
|
-
}
|
|
1208
|
-
const edit=stringReferenceEdit(
|
|
1209
|
-
source,
|
|
1210
|
-
selected.keyToken,
|
|
1211
|
-
null,
|
|
1212
|
-
importMapUrlVersionEdits(selected.key,null)
|
|
1213
|
-
);
|
|
1214
|
-
if(edit)edits.push(edit);
|
|
1215
|
-
}
|
|
1216
|
-
for(let index=0;index<properties.length;index+=1){
|
|
1217
|
-
if(!removed.has(properties[index]))continue;
|
|
1218
|
-
const first=index;
|
|
1219
|
-
while(removed.has(properties[index+1]))index+=1;
|
|
1220
|
-
edits.push({
|
|
1221
|
-
start:first===0?properties[first].keyToken.start:properties[first-1].end,
|
|
1222
|
-
end:first===0&&index<properties.length-1
|
|
1223
|
-
?properties[index+1].keyToken.start:properties[index].end,
|
|
1224
|
-
value:''
|
|
1225
|
-
});
|
|
1226
|
-
}
|
|
1227
|
-
return properties.filter(function retainedProperty(property){return !removed.has(property);});
|
|
1228
|
-
}
|
|
1229
|
-
function cleanImports(start){
|
|
1230
|
-
const properties=cleanProperties(objectProperties(start));
|
|
1231
|
-
for(const property of properties){
|
|
1232
|
-
if(property.value.type!=='string'||property.key.endsWith('/'))continue;
|
|
1233
|
-
reportAssetReference(onReference,property.value.value,'import');
|
|
1234
|
-
if(property.value.value.split(/[?#]/u)[0].endsWith('/'))continue;
|
|
1235
|
-
const edit=stringReferenceEdit(source,property.value,null);
|
|
1236
|
-
if(edit)edits.push(edit);
|
|
1143
|
+
const key=scopes
|
|
1144
|
+
?versionImportMapUrl(property.key,null)
|
|
1145
|
+
:versionImportMapSpecifier(property.key,null);
|
|
1146
|
+
if(!groups.has(key))groups.set(key,[]);
|
|
1147
|
+
groups.get(key).push(property);
|
|
1148
|
+
}
|
|
1149
|
+
for(const [key,group] of groups){
|
|
1150
|
+
if(group.every(function unchangedKey(property){return property.key===key;}))continue;
|
|
1151
|
+
// An authored clean key owns the target when old generated aliases converge.
|
|
1152
|
+
const selected=group.findLast(function existingCleanKey(property){
|
|
1153
|
+
return property.key===key;
|
|
1154
|
+
})??group.at(-1);
|
|
1155
|
+
for(const property of group){
|
|
1156
|
+
if(property!==selected)removed.add(property);
|
|
1237
1157
|
}
|
|
1158
|
+
const edit=stringReferenceEdit(
|
|
1159
|
+
source,
|
|
1160
|
+
selected.keyToken,
|
|
1161
|
+
null,
|
|
1162
|
+
importMapUrlVersionEdits(selected.key,null)
|
|
1163
|
+
);
|
|
1164
|
+
if(edit)edits.push(edit);
|
|
1238
1165
|
}
|
|
1239
|
-
for(
|
|
1240
|
-
if(
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1166
|
+
for(let index=0;index<properties.length;index+=1){
|
|
1167
|
+
if(!removed.has(properties[index]))continue;
|
|
1168
|
+
const first=index;
|
|
1169
|
+
while(removed.has(properties[index+1]))index+=1;
|
|
1170
|
+
edits.push({
|
|
1171
|
+
start:first===0?properties[first].keyToken.start:properties[first-1].end,
|
|
1172
|
+
end:first===0&&index<properties.length-1
|
|
1173
|
+
?properties[index+1].keyToken.start:properties[index].end,
|
|
1174
|
+
value:''
|
|
1175
|
+
});
|
|
1176
|
+
}
|
|
1177
|
+
return properties.filter(function retainedProperty(property){return !removed.has(property);});
|
|
1178
|
+
}
|
|
1179
|
+
function cleanImports(start){
|
|
1180
|
+
const properties=cleanProperties(objectProperties(start));
|
|
1181
|
+
for(const property of properties){
|
|
1182
|
+
if(property.value.type!=='string'||property.key.endsWith('/'))continue;
|
|
1183
|
+
reportAssetReference(onReference,property.value.value,'import');
|
|
1184
|
+
if(!rewrite||property.value.value.split(/[?#]/u)[0].endsWith('/'))continue;
|
|
1185
|
+
const edit=stringReferenceEdit(source,property.value,null);
|
|
1186
|
+
if(edit)edits.push(edit);
|
|
1245
1187
|
}
|
|
1246
|
-
return edits;
|
|
1247
1188
|
}
|
|
1248
1189
|
for(const property of objectProperties(0)){
|
|
1249
|
-
if(property.key==='imports')
|
|
1190
|
+
if(property.key==='imports')cleanImports(property.valueIndex);
|
|
1250
1191
|
if(property.key==='scopes'){
|
|
1251
|
-
const scopes=objectProperties(property.valueIndex);
|
|
1252
|
-
const
|
|
1253
|
-
const keys=new Set(scopes.map(function scopeKey(scope){return scope.key;}));
|
|
1254
|
-
for(const scope of scopes){
|
|
1255
|
-
const scopeEdits=addImports(scope.valueIndex);
|
|
1256
|
-
edits.push(...scopeEdits);
|
|
1257
|
-
const value=applyReferenceEdits(source.slice(scope.value.start,scope.end),scopeEdits.map(function scopeRelativeEdit(edit){
|
|
1258
|
-
return {...edit,start:edit.start-scope.value.start,end:edit.end-scope.value.start};
|
|
1259
|
-
}));
|
|
1260
|
-
if(!scope.key.endsWith('/'))addAlias(scope,keys,value,aliases,versionImportMapUrl(scope.key,version));
|
|
1261
|
-
}
|
|
1262
|
-
prependAliases(property.valueIndex,aliases,edits);
|
|
1192
|
+
const scopes=cleanProperties(objectProperties(property.valueIndex),{scopes:true});
|
|
1193
|
+
for(const scope of scopes)cleanImports(scope.valueIndex);
|
|
1263
1194
|
}
|
|
1264
1195
|
}
|
|
1265
1196
|
return edits;
|
|
@@ -1312,12 +1243,7 @@ function versionImportMapUrl(value,version){
|
|
|
1312
1243
|
}
|
|
1313
1244
|
|
|
1314
1245
|
function importMapUrlVersionEdits(value,version){
|
|
1315
|
-
|
|
1316
|
-
const authority=/^(?:[A-Za-z][A-Za-z0-9+.-]*:)?\/\/[^/?#]*/u.exec(value)?.[0];
|
|
1317
|
-
const offset=authority?.length??0;
|
|
1318
|
-
return assetUrlVersionEdits(value.slice(offset),version).map(function absoluteKeyEdit(edit){
|
|
1319
|
-
return {...edit,start:edit.start+offset,end:edit.end+offset};
|
|
1320
|
-
});
|
|
1246
|
+
return assetUrlVersionEdits(value,version);
|
|
1321
1247
|
}
|
|
1322
1248
|
|
|
1323
1249
|
function validateInventory(files){
|
|
@@ -1471,12 +1397,12 @@ async function physicalRuntime(workspaceRoot,signal){
|
|
|
1471
1397
|
return {files};
|
|
1472
1398
|
}
|
|
1473
1399
|
|
|
1474
|
-
async function managedImportMapBuild(resolvedWorkspace,resolvedApp,signal
|
|
1400
|
+
async function managedImportMapBuild(resolvedWorkspace,resolvedApp,signal){
|
|
1475
1401
|
const installed=await readInstalledSdkLayout(resolvedWorkspace);
|
|
1476
|
-
const
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1402
|
+
const runtime=await (installed
|
|
1403
|
+
?installedRuntimeFiles(resolvedWorkspace,installed,signal)
|
|
1404
|
+
:physicalRuntime(resolvedWorkspace,signal));
|
|
1405
|
+
const version=null;
|
|
1480
1406
|
const built=await buildImportMap({files:runtime.files,signal,version});
|
|
1481
1407
|
if(installed?.direct){
|
|
1482
1408
|
const imports={};
|
|
@@ -2055,11 +1981,12 @@ function htmlReferenceEdits(source,version,onReference){
|
|
|
2055
1981
|
const linkResources=new Set(['stylesheet','modulepreload','preload','icon','manifest']);
|
|
2056
1982
|
const base=structure.bases[0];
|
|
2057
1983
|
const baseHref=base?structuralAttribute(parseTagAttributes(base.open),'href','base'):null;
|
|
2058
|
-
|
|
1984
|
+
const externalBase=baseHref&&(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(baseHref)||baseHref.startsWith('//'));
|
|
2059
1985
|
function reportHtmlReference(reference){
|
|
2060
1986
|
if(is.function(onReference))onReference({...reference,baseHref});
|
|
2061
1987
|
}
|
|
2062
1988
|
function addNestedEdits(offset,nested){
|
|
1989
|
+
if(externalBase)return;
|
|
2063
1990
|
for(const edit of nested)edits.push({...edit,start:offset+edit.start,end:offset+edit.end});
|
|
2064
1991
|
}
|
|
2065
1992
|
for(const element of structure.elements){
|
|
@@ -2091,6 +2018,7 @@ function htmlReferenceEdits(source,version,onReference){
|
|
|
2091
2018
|
if(view)reportAssetReference(reportHtmlReference,view.decoded,kind,
|
|
2092
2019
|
(name==='href'||name==='src')&&view.decoded.startsWith('./arcane/')
|
|
2093
2020
|
?'component-runtime':undefined);
|
|
2021
|
+
if(externalBase)continue;
|
|
2094
2022
|
const value=versionHtmlAttribute(original,version);
|
|
2095
2023
|
if(value===original)continue;
|
|
2096
2024
|
const position=attributes.positions.get(name);
|
|
@@ -2110,7 +2038,7 @@ function htmlReferenceEdits(source,version,onReference){
|
|
|
2110
2038
|
if(attributes.has('src'))continue;
|
|
2111
2039
|
const type=scriptType(attributes);
|
|
2112
2040
|
const body=source.slice(script.openEnd,script.contentEnd);
|
|
2113
|
-
if(type==='importmap')addNestedEdits(script.openEnd,importMapReferenceEdits(body,version,reportHtmlReference));
|
|
2041
|
+
if(type==='importmap')addNestedEdits(script.openEnd,importMapReferenceEdits(body,version,reportHtmlReference,!externalBase));
|
|
2114
2042
|
else if(['','module','text/javascript','application/javascript'].includes(type)){
|
|
2115
2043
|
addNestedEdits(script.openEnd,javascriptReferenceEdits(body,version,reportHtmlReference));
|
|
2116
2044
|
}
|
|
@@ -2868,14 +2796,7 @@ async function generateImportMapUnlocked({
|
|
|
2868
2796
|
renderManagedHtml(html,'{"imports":{}}\n',baseHref);
|
|
2869
2797
|
documentStates.push({filePath:documentPath,html,label,baseHref});
|
|
2870
2798
|
}
|
|
2871
|
-
|
|
2872
|
-
try{
|
|
2873
|
-
const packageSource=await readFileFromDisk(path.join(resolvedApp,'arcane-package.json'),'utf8');
|
|
2874
|
-
pwaEnabled=JSON.parse(packageSource)?.pwa?.enabled===true;
|
|
2875
|
-
}catch(error){
|
|
2876
|
-
if(error?.code!=='ENOENT')throw error;
|
|
2877
|
-
}
|
|
2878
|
-
const {built,json,version}=await managedImportMapBuild(resolvedWorkspace,resolvedApp,signal,pwaEnabled);
|
|
2799
|
+
const {built,json,version}=await managedImportMapBuild(resolvedWorkspace,resolvedApp,signal);
|
|
2879
2800
|
const renderedDocuments=documentStates.map(item=>({
|
|
2880
2801
|
...item,
|
|
2881
2802
|
content:rewriteAssetReferences(renderManagedHtml(item.html,json,item.baseHref),{
|
package/src/packager/core.mjs
CHANGED
|
@@ -883,7 +883,6 @@ async function packageWithContext(context,options={}){
|
|
|
883
883
|
// Traverse actual browser resources after the adapter finishes. Files
|
|
884
884
|
// included only as application documents retain their original content.
|
|
885
885
|
const assetVersion=await readWorkspaceAssetVersion(context.workspaceRoot);
|
|
886
|
-
const version=pwaEnabled?null:assetVersion;
|
|
887
886
|
const inventory=new Set(files);
|
|
888
887
|
const offlineInventory=pwaEnabled?new Set(selectPwaFiles(files,context.config.pwa,appPath)):null;
|
|
889
888
|
const offlineReferences=new Set();
|
|
@@ -929,7 +928,7 @@ async function packageWithContext(context,options={}){
|
|
|
929
928
|
for(const file of files){
|
|
930
929
|
if((sharedFiles.has(file)||/^arcane\/(?:modules|entities|components|css|sdk|dependencies)\//u.test(file))
|
|
931
930
|
&&/\.(?:m?js|html?|css)$/iu.test(file))pending.push({file,documentUrl});
|
|
932
|
-
if(
|
|
931
|
+
if(path.posix.basename(file)==='arcane.importmap.json'){
|
|
933
932
|
pending.push({file,documentUrl});
|
|
934
933
|
}
|
|
935
934
|
}
|
|
@@ -954,7 +953,7 @@ async function packageWithContext(context,options={}){
|
|
|
954
953
|
const contextKey=`${relative}\n${current.documentUrl.href}`;
|
|
955
954
|
if(visited.has(contextKey)||!inventory.has(relative)
|
|
956
955
|
||(!/\.(?:m?js|html?|css)$/iu.test(relative)
|
|
957
|
-
|
|
956
|
+
&&path.posix.basename(relative)!=='arcane.importmap.json'))continue;
|
|
958
957
|
visited.add(contextKey);
|
|
959
958
|
const filePath=path.join(stagingRoot,...relative.split('/'));
|
|
960
959
|
let resource=resources.get(relative);
|
|
@@ -962,7 +961,7 @@ async function packageWithContext(context,options={}){
|
|
|
962
961
|
const original=pwaDocumentSources.get(relative)?.source??await readFile(filePath,'utf8');
|
|
963
962
|
const references=[];
|
|
964
963
|
const content=rewriteAssetReferences(original,{
|
|
965
|
-
filePath:relative,version,onReference:reference=>references.push(reference)
|
|
964
|
+
filePath:relative,version:null,onReference:reference=>references.push(reference)
|
|
966
965
|
});
|
|
967
966
|
if(content!==original)await writeFile(filePath,content,'utf8');
|
|
968
967
|
resource={references,...(pwaDocumentSources.has(relative)?{content}:{})};
|
|
@@ -133,7 +133,7 @@ appropriate.
|
|
|
133
133
|
</script>
|
|
134
134
|
`:'';
|
|
135
135
|
const bootstrapMarkup=namedImports?'':
|
|
136
|
-
` <script type="module" src="${runtimePrefix}/modules/ThemeBootstrap.js
|
|
136
|
+
` <script type="module" src="${runtimePrefix}/modules/ThemeBootstrap.js"></script>\n`;
|
|
137
137
|
const files=new Map();
|
|
138
138
|
files.set('.gitignore',[
|
|
139
139
|
'node_modules/',
|
|
@@ -322,9 +322,9 @@ ${importMapMarkup} <meta name="viewport" content="width=device-width, initial
|
|
|
322
322
|
<meta name="theme-color" content="rgb(23, 34, 56)">
|
|
323
323
|
<title>${html(name)}</title>
|
|
324
324
|
<link rel="manifest" href="./${html(appPrefix)}manifest.json">
|
|
325
|
-
<link rel="stylesheet" href="${runtimePrefix}/css/theme.css
|
|
326
|
-
<link rel="stylesheet" href="${runtimePrefix}/css/primitives.css
|
|
327
|
-
<link rel="stylesheet" href="./${html(appPrefix)}${html(appId)}.css
|
|
325
|
+
<link rel="stylesheet" href="${runtimePrefix}/css/theme.css">
|
|
326
|
+
<link rel="stylesheet" href="${runtimePrefix}/css/primitives.css">
|
|
327
|
+
<link rel="stylesheet" href="./${html(appPrefix)}${html(appId)}.css">
|
|
328
328
|
${bootstrapMarkup}</head>
|
|
329
329
|
<body>
|
|
330
330
|
<main class="app-shell">
|
|
@@ -341,7 +341,7 @@ ${bootstrapMarkup}</head>
|
|
|
341
341
|
</div>
|
|
342
342
|
</section>
|
|
343
343
|
</main>
|
|
344
|
-
<script type="module" src="./${html(appPrefix)}modules/App.js
|
|
344
|
+
<script type="module" src="./${html(appPrefix)}modules/App.js"></script>
|
|
345
345
|
</body>
|
|
346
346
|
</html>
|
|
347
347
|
`);
|
|
@@ -52,14 +52,14 @@ async function realDirectory(location,label){
|
|
|
52
52
|
return canonical;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
async function copyCompleteEntry(source,destination,label,signal
|
|
55
|
+
async function copyCompleteEntry(source,destination,label,signal){
|
|
56
56
|
throwIfAborted(signal);
|
|
57
57
|
const info=await lstat(source);
|
|
58
58
|
if(info.isSymbolicLink())fail(`${label} must not contain a symbolic link or junction.`);
|
|
59
59
|
if(info.isFile()){
|
|
60
60
|
if(/\.(?:m?js|html?|css)$/iu.test(source)){
|
|
61
61
|
const original=await readFile(source,'utf8');
|
|
62
|
-
const content=rewriteAssetReferences(original,{filePath:source,version});
|
|
62
|
+
const content=rewriteAssetReferences(original,{filePath:source,version:null});
|
|
63
63
|
await writeFile(destination,content,'utf8');
|
|
64
64
|
}else{
|
|
65
65
|
await copyFile(source,destination);
|
|
@@ -76,8 +76,7 @@ async function copyCompleteEntry(source,destination,label,signal,version){
|
|
|
76
76
|
path.join(source,entry.name),
|
|
77
77
|
path.join(destination,entry.name),
|
|
78
78
|
`${label}/${entry.name}`,
|
|
79
|
-
signal
|
|
80
|
-
version
|
|
79
|
+
signal
|
|
81
80
|
);
|
|
82
81
|
}
|
|
83
82
|
}
|
|
@@ -113,14 +112,13 @@ export async function materializeWorkspaceRuntimeContent({
|
|
|
113
112
|
|
|
114
113
|
await mkdir(stagingRoot);
|
|
115
114
|
try{
|
|
116
|
-
await copyCompleteEntry(runtimeArcane,stagingRoot,'SDK Arcane runtime',signal
|
|
115
|
+
await copyCompleteEntry(runtimeArcane,stagingRoot,'SDK Arcane runtime',signal);
|
|
117
116
|
await mkdir(path.join(stagingRoot,'dependencies'),{recursive:true});
|
|
118
117
|
await copyCompleteEntry(
|
|
119
118
|
runtimeStrongType,
|
|
120
119
|
path.join(stagingRoot,'dependencies','strong-type'),
|
|
121
120
|
'SDK strong-type runtime',
|
|
122
|
-
signal
|
|
123
|
-
sdkVersion
|
|
121
|
+
signal
|
|
124
122
|
);
|
|
125
123
|
const sdkDestination=path.join(stagingRoot,'sdk');
|
|
126
124
|
await mkdir(sdkDestination,{recursive:true});
|
|
@@ -132,8 +130,7 @@ export async function materializeWorkspaceRuntimeContent({
|
|
|
132
130
|
path.join(browserRuntime,entry.name),
|
|
133
131
|
path.join(sdkDestination,entry.name),
|
|
134
132
|
`SDK browser runtime/${entry.name}`,
|
|
135
|
-
signal
|
|
136
|
-
sdkVersion
|
|
133
|
+
signal
|
|
137
134
|
);
|
|
138
135
|
}
|
|
139
136
|
|