@wenathlan/devthink 2.0.13 → 2.0.15
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 +27 -0
- package/accounts.ts +2087 -0
- package/agent.ts +2331 -0
- package/antigravity.ts +2139 -0
- package/apifreeze.ts +4146 -0
- package/auth.ts +642 -0
- package/background.ts +16837 -0
- package/bridge.ts +2080 -0
- package/build.ts +54 -0
- package/bun.ts +26 -0
- package/capture.ts +1614 -0
- package/checksecrets.ts +72 -0
- package/cjs.ts +9 -0
- package/cli.ts +3500 -0
- package/commands.ts +1101 -0
- package/companion.ts +450 -0
- package/compatibility.ts +37 -0
- package/config.ts +3137 -0
- package/constants.ts +943 -0
- package/core.ts +1473 -0
- package/crossbrowser.ts +1359 -0
- package/dashdone.ts +605 -0
- package/data.ts +943 -0
- package/database.ts +133 -0
- package/debug.ts +850 -0
- package/deno.ts +27 -0
- package/devthink.ts +707 -0
- package/dist/accounts.d.ts +409 -0
- package/dist/agent.d.ts +837 -0
- package/dist/antigravity.d.ts +380 -0
- package/dist/apifreeze.d.ts +113 -0
- package/dist/auth.d.ts +224 -0
- package/{bridge.d.ts → dist/bridge.d.ts} +1 -1
- package/dist/capture.d.ts +595 -0
- package/dist/cjs.d.ts +6 -0
- package/{cli.js → dist/cli.js} +2 -2
- package/dist/commands.d.ts +310 -0
- package/dist/compatibility.d.ts +17 -0
- package/dist/config.d.ts +1853 -0
- package/dist/constants.d.ts +637 -0
- package/dist/core.d.ts +361 -0
- package/dist/data.d.ts +330 -0
- package/dist/database.d.ts +24 -0
- package/dist/debug.d.ts +270 -0
- package/dist/engine.d.ts +74 -0
- package/dist/environments.d.ts +244 -0
- package/dist/evidence.d.ts +277 -0
- package/dist/export.d.ts +311 -0
- package/dist/fingerprint.d.ts +594 -0
- package/dist/flow.d.ts +300 -0
- package/dist/gates.d.ts +103 -0
- package/dist/identity.d.ts +51 -0
- package/dist/ids.d.ts +7 -0
- package/dist/llm.d.ts +652 -0
- package/dist/models.d.ts +1807 -0
- package/dist/net.d.ts +325 -0
- package/dist/neutral.d.ts +41 -0
- package/dist/oauth.d.ts +703 -0
- package/dist/page.d.ts +1166 -0
- package/dist/perf.d.ts +481 -0
- package/dist/plan.d.ts +134 -0
- package/dist/project.d.ts +395 -0
- package/dist/providers.d.ts +37 -0
- package/dist/quota.d.ts +453 -0
- package/dist/recovery.d.ts +621 -0
- package/dist/request.d.ts +1492 -0
- package/dist/run.d.ts +779 -0
- package/dist/runtime.d.ts +212 -0
- package/dist/search.d.ts +375 -0
- package/dist/security.d.ts +534 -0
- package/dist/serve.d.ts +136 -0
- package/dist/session.d.ts +296 -0
- package/dist/storage.d.ts +53 -0
- package/dist/streaming.d.ts +1119 -0
- package/dist/swarm.d.ts +328 -0
- package/dist/tools.d.ts +170 -0
- package/dist/types.d.ts +8357 -0
- package/dist/utils.d.ts +82 -0
- package/dist/version.d.ts +7 -0
- package/dist/versionregistry.d.ts +406 -0
- package/dist/views.d.ts +579 -0
- package/dist/workbenchsession.d.ts +69 -0
- package/dist/workflow.d.ts +649 -0
- package/docs/readme.md +92 -0
- package/docs/schemas/antigravity.json +192 -0
- package/engine.ts +1524 -0
- package/environments.ts +1005 -0
- package/evidence.ts +643 -0
- package/export.ts +889 -0
- package/fingerprint.ts +1458 -0
- package/flow.ts +1190 -0
- package/gates.ts +307 -0
- package/gateway.ts +34 -0
- package/hardening.ts +191 -0
- package/headless.ts +369 -0
- package/http.ts +2110 -0
- package/identity.ts +246 -0
- package/ids.ts +26 -0
- package/index.ts +369 -0
- package/llm.ts +2682 -0
- package/mcp.ts +1835 -0
- package/{memory.js → memory.ts} +3834 -2310
- package/models.ts +3805 -0
- package/modes.ts +43 -0
- package/net.ts +1214 -0
- package/neutral.ts +362 -0
- package/node.ts +26 -0
- package/oauth.ts +2216 -0
- package/offscreen.ts +170 -0
- package/pack.ts +956 -0
- package/package.json +175 -82
- package/page.ts +7824 -0
- package/pagebridge.ts +1116 -0
- package/perf.ts +957 -0
- package/plan.ts +672 -0
- package/plugin.ts +76 -0
- package/{policy.js → policy.ts} +5073 -4679
- package/prisma.config.ts +27 -0
- package/progress.ts +1308 -0
- package/project.ts +1291 -0
- package/protocol.ts +4187 -0
- package/providers.ts +246 -0
- package/quota.ts +1887 -0
- package/recovery.ts +2433 -0
- package/request.ts +4482 -0
- package/run.ts +2135 -0
- package/runtime.ts +526 -0
- package/search.ts +1760 -0
- package/security.ts +1673 -0
- package/serve.ts +419 -0
- package/server.ts +5538 -0
- package/session.ts +1162 -0
- package/storage.ts +182 -0
- package/streaming.ts +4101 -0
- package/swarm.ts +884 -0
- package/sync.ts +56 -0
- package/tests/agentcert.test.ts +128 -0
- package/tests/agentfleet.test.ts +214 -0
- package/tests/agentreview.test.ts +241 -0
- package/tests/agentstream.test.ts +335 -0
- package/tests/agentwork.test.ts +356 -0
- package/tests/apifreeze.test.ts +290 -0
- package/tests/apimap.test.ts +112 -0
- package/tests/approvalgate.test.ts +175 -0
- package/tests/artifactmanifest.test.ts +204 -0
- package/tests/attentionfeed.test.ts +163 -0
- package/tests/backgroundruns.test.ts +100 -0
- package/tests/batchscheduling.test.ts +131 -0
- package/tests/blackboard.test.ts +238 -0
- package/tests/bridge.test.ts +1088 -0
- package/tests/browsercoverage.test.ts +134 -0
- package/tests/browserpolyfills.test.ts +124 -0
- package/tests/build.mjs +1260 -0
- package/tests/clientauth.test.ts +223 -0
- package/tests/clitools.test.ts +578 -0
- package/tests/confirmgates.test.ts +190 -0
- package/tests/containerpack.test.ts +143 -0
- package/tests/controlflow.test.ts +2120 -0
- package/tests/coordination.test.ts +345 -0
- package/tests/copyscreen.test.ts +139 -0
- package/tests/core.test.ts +417 -0
- package/tests/costcert.test.ts +95 -0
- package/tests/crossbrowser.test.ts +115 -0
- package/tests/cspaudit.test.ts +79 -0
- package/tests/dashdone.test.ts +615 -0
- package/tests/datagrid.test.ts +137 -0
- package/tests/doccheck.test.ts +107 -0
- package/tests/dombatch.test.ts +109 -0
- package/tests/emulation.test.ts +282 -0
- package/tests/environments.test.ts +259 -0
- package/tests/evidenceviews.test.ts +88 -0
- package/tests/exporttools.test.ts +185 -0
- package/tests/firefoxprep.test.ts +134 -0
- package/tests/flowlibrary.test.ts +242 -0
- package/tests/flowrun.test.ts +303 -0
- package/tests/forensics.test.ts +439 -0
- package/tests/gateway.test.ts +939 -0
- package/tests/headlesslib.test.ts +171 -0
- package/tests/httpstream.test.ts +277 -0
- package/tests/immutablelog.test.ts +157 -0
- package/tests/inboundguard.test.ts +177 -0
- package/tests/lazyload.test.ts +72 -0
- package/tests/librarymodes.test.ts +623 -0
- package/tests/llm.test.ts +696 -0
- package/tests/manifest.test.ts +226 -0
- package/tests/maskinputs.test.ts +150 -0
- package/tests/matrixverify.test.ts +111 -0
- package/tests/mavenpack.test.ts +75 -0
- package/tests/mcpserver.test.ts +704 -0
- package/tests/memory.test.ts +4155 -0
- package/tests/memorycare.test.ts +230 -0
- package/tests/migrateplan.test.ts +349 -0
- package/tests/minimization.test.ts +414 -0
- package/tests/modelroute.test.ts +112 -0
- package/tests/multiagent.test.ts +440 -0
- package/tests/nativebridge.test.ts +807 -0
- package/tests/navigation.test.ts +284 -0
- package/tests/nugetpack.test.ts +83 -0
- package/tests/orchestration.test.ts +449 -0
- package/tests/originpolicy.test.ts +405 -0
- package/tests/outputcompare.test.ts +97 -0
- package/tests/package.test.ts +91 -0
- package/tests/pagebridge.test.ts +5909 -0
- package/tests/pentest.test.ts +75 -0
- package/tests/perfrecords.test.ts +257 -0
- package/tests/permdiff.test.ts +85 -0
- package/tests/phishguard.test.ts +128 -0
- package/tests/pickerviews.test.ts +155 -0
- package/tests/pipelines.test.ts +381 -0
- package/tests/planlint.test.ts +240 -0
- package/tests/planreview.test.ts +383 -0
- package/tests/platformtargets.test.ts +56 -0
- package/tests/policy.test.ts +8284 -0
- package/tests/portability.test.ts +96 -0
- package/tests/progress.test.ts +1036 -0
- package/tests/promptlibrary.test.ts +116 -0
- package/tests/protocol.test.ts +4793 -0
- package/tests/publishingpipeline.test.ts +314 -0
- package/tests/quickactions.test.ts +164 -0
- package/tests/readiness.test.ts +78 -0
- package/tests/recipes.test.ts +163 -0
- package/tests/redactshots.test.ts +216 -0
- package/tests/registernvidiakeys.ts +51 -0
- package/tests/relayserve.test.ts +304 -0
- package/tests/releasenotes.test.ts +276 -0
- package/tests/resilience.test.ts +467 -0
- package/tests/resourceaware.test.ts +187 -0
- package/tests/runbudget.test.ts +125 -0
- package/tests/runhistory.test.ts +299 -0
- package/tests/runreplay.test.ts +113 -0
- package/tests/runresume.test.ts +184 -0
- package/tests/runstate.test.ts +288 -0
- package/tests/runtimeadapters.test.ts +251 -0
- package/tests/safariskeleton.test.ts +115 -0
- package/tests/sandboxframe.test.ts +196 -0
- package/tests/sbom.test.ts +105 -0
- package/tests/secretvault.test.ts +188 -0
- package/tests/selcache.test.ts +111 -0
- package/tests/sessioninterface.test.ts +791 -0
- package/tests/sessions.test.ts +591 -0
- package/tests/siteprefs.test.ts +228 -0
- package/tests/snapshotdelta.test.ts +165 -0
- package/tests/statusviews.test.ts +237 -0
- package/tests/stepmeter.test.ts +200 -0
- package/tests/streamparse.test.ts +163 -0
- package/tests/stylepruning.test.ts +90 -0
- package/tests/surfaces.test.ts +282 -0
- package/tests/sweep.test.ts +78 -0
- package/tests/syncbridge.test.ts +164 -0
- package/tests/taskqueue.test.ts +206 -0
- package/tests/toolcalls.test.ts +336 -0
- package/tests/toolcatalog.test.ts +201 -0
- package/tests/torture-agent.test.ts +706 -0
- package/tests/torture-auth.test.ts +461 -0
- package/tests/torture-commands.test.ts +895 -0
- package/tests/torture-data.test.ts +923 -0
- package/tests/torture-environments.test.ts +285 -0
- package/tests/torture-export.test.ts +263 -0
- package/tests/torture-http.test.ts +1379 -0
- package/tests/torture-llm.test.ts +808 -0
- package/tests/torture-memory.test.ts +1084 -0
- package/tests/torture-plan.test.ts +829 -0
- package/tests/torture-run.test.ts +626 -0
- package/tests/torture-session.test.ts +928 -0
- package/tests/torture-swarm.test.ts +1245 -0
- package/tests/torture-tools.test.ts +964 -0
- package/tests/torture-workflow.test.ts +2354 -0
- package/tests/tourviews.test.ts +52 -0
- package/tests/transparency.test.ts +147 -0
- package/tests/trigger.test.ts +941 -0
- package/tests/v1sunset.test.ts +428 -0
- package/tests/virtlist.test.ts +94 -0
- package/tests/vision.test.ts +540 -0
- package/tests/vsixpack.test.ts +145 -0
- package/tests/webapi.test.ts +523 -0
- package/tests/workflow.test.ts +1785 -0
- package/tests/workfloweditor.test.ts +759 -0
- package/tests/xpipack.test.ts +128 -0
- package/tools.ts +734 -0
- package/types.ts +9908 -0
- package/umd.ts +9 -0
- package/utils.ts +249 -0
- package/version.ts +8 -0
- package/versionregistry.ts +1310 -0
- package/views.ts +2153 -0
- package/vitest.config.ts +12 -0
- package/web/App.tsx +78 -0
- package/web/README.md +47 -0
- package/web/capacitor.config.ts +46 -0
- package/web/const.ts +19 -0
- package/web/control.shell.tsx +66 -0
- package/web/dashboardpage.ts +554 -0
- package/web/db.ts +493 -0
- package/web/design.html +541 -0
- package/web/gatewayview/Gateway.tsx +345 -0
- package/web/gatewayview/config.ts +1042 -0
- package/web/gatewayview/definition.ts +174 -0
- package/web/icons.ts +15 -0
- package/{manifest.json → web/manifest.json} +1 -1
- package/web/optionspage.ts +691 -0
- package/web/popup.ts +1651 -0
- package/web/schema.prisma +176 -0
- package/web/sidepanel.ts +7941 -0
- package/web/sitemanifest.json +13 -0
- package/web/terminal-ui.tsx +622 -0
- package/web/transparencypage.ts +541 -0
- package/web/vite.config.ts +39 -0
- package/web/workspace.ts +23 -0
- package/workbenchmemory.ts +104 -0
- package/workbenchsession.ts +304 -0
- package/workflow.ts +4495 -0
- package/bridge.d.ts.map +0 -1
- package/bridge.js +0 -1877
- package/bun.d.ts.map +0 -1
- package/bun.js +0 -52329
- package/caps/background.json +0 -712
- package/caps/cli.json +0 -360
- package/caps/library.json +0 -3611
- package/caps/mcp.json +0 -126
- package/caps/pagebridge.json +0 -377
- package/caps/popup.json +0 -51
- package/caps/sidepanel.json +0 -522
- package/checksums.txt +0 -142
- package/cli.d.ts.map +0 -1
- package/companion.d.ts.map +0 -1
- package/companion.js +0 -389
- package/crossbrowser.d.ts.map +0 -1
- package/crossbrowser.js +0 -1191
- package/dashdone.d.ts.map +0 -1
- package/dashdone.js +0 -368
- package/deno.d.ts.map +0 -1
- package/deno.js +0 -52325
- package/devthink.umd.js +0 -52346
- package/fixtures/bun.ts +0 -7
- package/fixtures/cjs.js +0 -6
- package/fixtures/deno.ts +0 -6
- package/fixtures/example-org-pagestate.json +0 -22
- package/fixtures/importers/automa-workflow.json +0 -18
- package/fixtures/importers/selenium-side.json +0 -20
- package/fixtures/importers/tabular-plan.csv +0 -7
- package/fixtures/importers/uivision-macro.json +0 -10
- package/fixtures/importers/v1-plan.json +0 -13
- package/fixtures/mcp-client.mjs +0 -14
- package/fixtures/pages/checkout.html +0 -192
- package/fixtures/pages/dashboard.html +0 -110
- package/fixtures/pages/feed.html +0 -113
- package/fixtures/pages/product-grid.html +0 -150
- package/fixtures/plans/form-inventory-plan.json +0 -11
- package/fixtures/plans/release-notes-plan.json +0 -11
- package/fixtures/recipes/agentscompete.json +0 -11
- package/fixtures/recipes/agentsforms.json +0 -11
- package/fixtures/recipes/agentsmonitor.json +0 -11
- package/fixtures/recipes/agentsreview.json +0 -29
- package/fixtures/recipes/agentswarm.json +0 -11
- package/fixtures/recipes/fillcalendar.json +0 -12
- package/fixtures/recipes/fillcheckout.json +0 -13
- package/fixtures/recipes/filldependentdropdowns.json +0 -12
- package/fixtures/recipes/fillfromcsv.json +0 -13
- package/fixtures/recipes/fillloginform.json +0 -12
- package/fixtures/recipes/fillmultistepwizard.json +0 -13
- package/fixtures/recipes/fillregistration.json +0 -12
- package/fixtures/recipes/fillsearchfilters.json +0 -12
- package/fixtures/recipes/filltypeahead.json +0 -11
- package/fixtures/recipes/monitoralerts.json +0 -12
- package/fixtures/recipes/monitoravailability.json +0 -11
- package/fixtures/recipes/monitornetworkquiet.json +0 -12
- package/fixtures/recipes/monitorpagechanges.json +0 -11
- package/fixtures/recipes/monitorpricechange.json +0 -11
- package/fixtures/recipes/monitorschedule.json +0 -12
- package/fixtures/recipes/scrapedynamicprices.json +0 -13
- package/fixtures/recipes/scrapeimagegallery.json +0 -12
- package/fixtures/recipes/scrapeinfinitefeed.json +0 -13
- package/fixtures/recipes/scrapenestedlists.json +0 -12
- package/fixtures/recipes/scrapeproductgrid.json +0 -12
- package/fixtures/recipes/scrapereviews.json +0 -12
- package/fixtures/recipes/scrapesearchresults.json +0 -12
- package/fixtures/recipes/scrapetablepagination.json +0 -12
- package/fixtures/recipes/testaccessibility.json +0 -34
- package/fixtures/recipes/testconsoleerrors.json +0 -12
- package/fixtures/recipes/testdeeplinks.json +0 -12
- package/fixtures/recipes/testformvalidation.json +0 -13
- package/fixtures/recipes/testlayoutshift.json +0 -12
- package/fixtures/recipes/testlinkcheck.json +0 -12
- package/fixtures/recipes/testloadtiming.json +0 -12
- package/fixtures/recipes/testvisualdiff.json +0 -12
- package/fixtures/workflows/changelog-digest-workflow.json +0 -13
- package/fixtures/workflows/form-survey-workflow.json +0 -13
- package/gallery.json +0 -706
- package/hardening.d.ts.map +0 -1
- package/hardening.js +0 -188
- package/headless.d.ts.map +0 -1
- package/headless.js +0 -11522
- package/http.d.ts.map +0 -1
- package/http.js +0 -2165
- package/index.cjs +0 -54682
- package/index.d.ts.map +0 -1
- package/index.js +0 -52310
- package/index.neutral.js +0 -46343
- package/mcp.d.ts.map +0 -1
- package/mcp.js +0 -20515
- package/memory.d.ts.map +0 -1
- package/nativehost.template.json +0 -10
- package/node.cjs +0 -54686
- package/node.d.ts.map +0 -1
- package/pack.d.ts.map +0 -1
- package/pack.js +0 -805
- package/policy.d.ts.map +0 -1
- package/progress.d.ts.map +0 -1
- package/progress.js +0 -645
- package/protocol.d.ts.map +0 -1
- package/protocol.js +0 -8334
- package/schemas/audit.schema.json +0 -226
- package/schemas/capability.schema.json +0 -113
- package/schemas/envelope.schema.json +0 -162
- package/schemas/memory.schema.json +0 -51
- package/schemas/observation.schema.json +0 -113
- package/schemas/plan.schema.json +0 -208
- package/schemas/progress.schema.json +0 -126
- package/schemas/proposal.schema.json +0 -68
- package/schemas/session.schema.json +0 -82
- package/schemas/tool.schema.json +0 -94
- package/server.d.ts.map +0 -1
- package/server.js +0 -28877
- package/umd-example.html +0 -18
- package/umd.d.ts.map +0 -1
- /package/{bun.d.ts → dist/bun.d.ts} +0 -0
- /package/{cli.d.ts → dist/cli.d.ts} +0 -0
- /package/{companion.d.ts → dist/companion.d.ts} +0 -0
- /package/{crossbrowser.d.ts → dist/crossbrowser.d.ts} +0 -0
- /package/{dashdone.d.ts → dist/dashdone.d.ts} +0 -0
- /package/{deno.d.ts → dist/deno.d.ts} +0 -0
- /package/{hardening.d.ts → dist/hardening.d.ts} +0 -0
- /package/{headless.d.ts → dist/headless.d.ts} +0 -0
- /package/{http.d.ts → dist/http.d.ts} +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{mcp.d.ts → dist/mcp.d.ts} +0 -0
- /package/{memory.d.ts → dist/memory.d.ts} +0 -0
- /package/{node.d.ts → dist/node.d.ts} +0 -0
- /package/{pack.d.ts → dist/pack.d.ts} +0 -0
- /package/{policy.d.ts → dist/policy.d.ts} +0 -0
- /package/{progress.d.ts → dist/progress.d.ts} +0 -0
- /package/{protocol.d.ts → dist/protocol.d.ts} +0 -0
- /package/{server.d.ts → dist/server.d.ts} +0 -0
- /package/{umd.d.ts → dist/umd.d.ts} +0 -0
package/runtime.ts
ADDED
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The runtime module of the 1.1.90 consolidation: every correlated variation of the platform adapter contract, its implementations and the target matrix interned in this one file, so the module family carries one surface without duplicate variations.
|
|
3
|
+
* The correlation is the platform runtime family: platformadapter holds the adapter contract every platform primitive flows through (the storage, clock, logger and fetch adapters with the node, browser and deno default compositions, the shared adapter registry on the global symbol registry so the esm and cjs modes of one process share one active adapter, and the bundle stamp of the running dist target); runtimeadapters holds the implementations the contract composes (the filesystem, chrome storage, deno kv and in-memory storage mappings, the capability probe table, the adapter declarations and the worker, dom and fetch shells with their feature downgrades); and platformtargets holds the target matrix that verifies every platform target against the adapter mappings with its minified output budget.
|
|
4
|
+
* No binding is ever hardcoded: every node, deno and browser primitive arrives injected through the seam so the neutral and browser bundles never carry a platform import, and no adapter ever bypasses the human review.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/* ── Merged from platformadapter.ts ── */
|
|
8
|
+
import type {
|
|
9
|
+
adaptercontract,
|
|
10
|
+
bundlemode,
|
|
11
|
+
capabilityprobe,
|
|
12
|
+
clockadapter,
|
|
13
|
+
fetchadapter,
|
|
14
|
+
librarymode,
|
|
15
|
+
loggeradapter,
|
|
16
|
+
platformtarget,
|
|
17
|
+
runtimeadapterdeclaration,
|
|
18
|
+
featuredowngrade,
|
|
19
|
+
platformmatrix,
|
|
20
|
+
} from "./types.js";
|
|
21
|
+
import type { memoryadapter } from "./memory.js";
|
|
22
|
+
import { packageversion } from "./version.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Platform adapter logic of the 1.1.81 family.
|
|
26
|
+
* One contract carries every platform primitive the library touches: the storage adapter the memory module takes, the clock adapter the progress module takes, the logger adapter that keeps the core off a bound console and the fetch adapter that keeps the core off a bound network primitive — with the node, browser and deno default compositions that bind real platform apis behind the same seam, and the bundle stamp that reports the mode and target of the running bundle. The module stays pure: the node bindings arrive as injected filesystem primitives and the deno bindings as an injected kv store, so the neutral and browser bundles never carry a node import. The shared adapter registry lives on the global symbol registry instead of a module singleton, so the esm and cjs modes of one process share one active adapter instead of forking the dual package hazard.
|
|
27
|
+
* Example: `const adapter = nodeplatformadapter({ profiledir, fs }); setsharedadapter(adapter); bundlestamp();` binds the filesystem storage, publishes it to every mode of the process and reports the running bundle.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/** Reads the consumption mode one runtime adapter serves: the browser shell rides the umd bundle, the node shell rides the cjs bundle and the bun and deno shells ride the esm core. */
|
|
31
|
+
export function adaptermodeof(runtime: platformtarget["runtime"]): librarymode {
|
|
32
|
+
const modes: Record<platformtarget["runtime"], librarymode> = {
|
|
33
|
+
browser: "umd",
|
|
34
|
+
node: "cjs",
|
|
35
|
+
bun: "esm",
|
|
36
|
+
deno: "esm",
|
|
37
|
+
};
|
|
38
|
+
return modes[runtime];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Reads the clock adapter of the platform seam from the injected primitives; the adapter owns no timer of its own. */
|
|
42
|
+
export function clockadapterof(primitives: {
|
|
43
|
+
now(): number;
|
|
44
|
+
schedule(callback: () => void, milliseconds: number): unknown;
|
|
45
|
+
}): clockadapter {
|
|
46
|
+
return {
|
|
47
|
+
now: () => primitives.now(),
|
|
48
|
+
schedule: (callback, milliseconds) => primitives.schedule(callback, milliseconds),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Reads the logger adapter of the platform seam from the injected sink; the adapter owns no console of its own. */
|
|
53
|
+
export function loggeradapterof(sink: {
|
|
54
|
+
log(line: string): void;
|
|
55
|
+
warn(line: string): void;
|
|
56
|
+
error(line: string): void;
|
|
57
|
+
}): loggeradapter {
|
|
58
|
+
return { log: (line) => sink.log(line), warn: (line) => sink.warn(line), error: (line) => sink.error(line) };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Reads the fetch adapter of the platform seam from the injected loader; the adapter owns no network primitive of its own. */
|
|
62
|
+
export function fetchadapterof(primitives: {
|
|
63
|
+
fetch(input: string, init?: Record<string, unknown>): Promise<unknown>;
|
|
64
|
+
}): fetchadapter {
|
|
65
|
+
return { fetch: (input, init) => primitives.fetch(input, init) };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Reads the default clock adapter: now and the scheduler bind to the platform globals every supported runtime ships, so the default carries no node or browser specific import. Example: `defaultclock().now()` answers the platform timestamp. */
|
|
69
|
+
export function defaultclock(): clockadapter {
|
|
70
|
+
return {
|
|
71
|
+
now: () => Date.now(),
|
|
72
|
+
schedule: (callback, milliseconds) => setTimeout(callback, milliseconds),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Reads the default logger adapter: the sink binds to the platform console every supported runtime ships. Example: `defaultlogger().log("line")` writes one line through the platform console. */
|
|
77
|
+
export function defaultlogger(): loggeradapter {
|
|
78
|
+
return {
|
|
79
|
+
log: (line) => console.log(line),
|
|
80
|
+
warn: (line) => console.warn(line),
|
|
81
|
+
error: (line) => console.error(line),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Reads the default fetch adapter: the loader binds to the platform fetch primitive and a runtime without one refuses instead of silently binding, so a host injects its own loader. Example: `defaultfetch().fetch("https://example.org")` rides the platform primitive. */
|
|
86
|
+
export function defaultfetch(): fetchadapter {
|
|
87
|
+
const loader = (globalThis as { fetch?: (input: string, init?: Record<string, unknown>) => Promise<unknown> }).fetch;
|
|
88
|
+
if (loader === undefined)
|
|
89
|
+
throw new Error(
|
|
90
|
+
"The default fetch adapter needs the platform fetch primitive; a runtime without one injects its own loader through the seam.",
|
|
91
|
+
);
|
|
92
|
+
return { fetch: (input, init) => loader(input, init) };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Composes the full adapter contract from the injected seams: the storage adapter is required because every runtime binds its own, while the clock, logger and fetch adapters default to the platform globals when the caller injects none. Example: `platformadapterof({ runtime: "node", storage: adapter })` fills the clock, logger and fetch defaults beside the injected storage. */
|
|
96
|
+
export function platformadapterof(input: {
|
|
97
|
+
runtime: platformtarget["runtime"];
|
|
98
|
+
headless?: boolean;
|
|
99
|
+
storage: memoryadapter;
|
|
100
|
+
clock?: clockadapter;
|
|
101
|
+
logger?: loggeradapter;
|
|
102
|
+
fetch?: fetchadapter;
|
|
103
|
+
}): adaptercontract {
|
|
104
|
+
return {
|
|
105
|
+
runtime: input.runtime,
|
|
106
|
+
mode: adaptermodeof(input.runtime),
|
|
107
|
+
declaration: runtimeadapterdeclarationof(input.runtime, input.headless),
|
|
108
|
+
probes: runtimecapabilitiestable()[input.runtime],
|
|
109
|
+
storage: input.storage,
|
|
110
|
+
clock: input.clock ?? defaultclock(),
|
|
111
|
+
logger: input.logger ?? defaultlogger(),
|
|
112
|
+
fetch: input.fetch ?? defaultfetch(),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Reads the default node adapter: the caller injects the filesystem primitives of the node build, so this module never imports a node api and the browser bundles stay free of node shims. Example: `nodeplatformadapter({ profiledir, fs })` binds the filesystem storage under the profile directory. */
|
|
117
|
+
export function nodeplatformadapter(input: {
|
|
118
|
+
profiledir: string;
|
|
119
|
+
fs: filesystemprimitives;
|
|
120
|
+
clock?: clockadapter;
|
|
121
|
+
logger?: loggeradapter;
|
|
122
|
+
fetch?: fetchadapter;
|
|
123
|
+
}): adaptercontract {
|
|
124
|
+
return platformadapterof({
|
|
125
|
+
runtime: "node",
|
|
126
|
+
storage: filesystemstorageadapter(input.fs, input.profiledir),
|
|
127
|
+
...(input.clock !== undefined ? { clock: input.clock } : {}),
|
|
128
|
+
...(input.logger !== undefined ? { logger: input.logger } : {}),
|
|
129
|
+
...(input.fetch !== undefined ? { fetch: input.fetch } : {}),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Reads the default browser adapter: the caller injects the chrome storage area of the browser build and an absent area falls back to the in-memory store, so the script tag bundle runs with no chrome api present. Example: `browserplatformadapter({ area })` binds the chrome storage area through the seam. */
|
|
134
|
+
export function browserplatformadapter(input?: {
|
|
135
|
+
area?: chromestorageprimitives;
|
|
136
|
+
clock?: clockadapter;
|
|
137
|
+
logger?: loggeradapter;
|
|
138
|
+
fetch?: fetchadapter;
|
|
139
|
+
}): adaptercontract {
|
|
140
|
+
const storage = input?.area !== undefined ? chromestorageadapter(input.area) : memorystorageadapter();
|
|
141
|
+
return platformadapterof({
|
|
142
|
+
runtime: "browser",
|
|
143
|
+
storage,
|
|
144
|
+
...(input?.clock !== undefined ? { clock: input.clock } : {}),
|
|
145
|
+
...(input?.logger !== undefined ? { logger: input.logger } : {}),
|
|
146
|
+
...(input?.fetch !== undefined ? { fetch: input.fetch } : {}),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Reads the default deno adapter: the caller injects the kv store the deno host opened, so the deno runtime keeps its own storage mapping behind the same seam. Example: `denoplatformadapter({ kv })` binds the deno kv store. */
|
|
151
|
+
export function denoplatformadapter(input: {
|
|
152
|
+
kv: denokvprimitives;
|
|
153
|
+
clock?: clockadapter;
|
|
154
|
+
logger?: loggeradapter;
|
|
155
|
+
fetch?: fetchadapter;
|
|
156
|
+
}): adaptercontract {
|
|
157
|
+
return platformadapterof({
|
|
158
|
+
runtime: "deno",
|
|
159
|
+
storage: denokvadapter(input.kv),
|
|
160
|
+
...(input.clock !== undefined ? { clock: input.clock } : {}),
|
|
161
|
+
...(input.logger !== undefined ? { logger: input.logger } : {}),
|
|
162
|
+
...(input.fetch !== undefined ? { fetch: input.fetch } : {}),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** The shared registry key of the active adapter: a registered symbol, so the esm and cjs modes of one process read the same registry entry instead of forking the dual package hazard across two module instances. */
|
|
167
|
+
const registrykey = Symbol.for("devthink.platform.adapter");
|
|
168
|
+
|
|
169
|
+
/** Publishes the active adapter contract onto the shared registry: every mode of the process reads the same adapter afterwards, so the library state stays consistent across the esm and cjs instances. Example: `setsharedadapter(adapter)` publishes one adapter for both modes. */
|
|
170
|
+
export function setsharedadapter(adapter: adaptercontract): adaptercontract {
|
|
171
|
+
(globalThis as Record<symbol, adaptercontract | undefined>)[registrykey] = adapter;
|
|
172
|
+
return adapter;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Reads the active adapter contract from the shared registry; an unpublished registry answers undefined and a host publishes through setsharedadapter. Example: `sharedadapter()?.runtime` answers the runtime of the published adapter. */
|
|
176
|
+
export function sharedadapter(): adaptercontract | undefined {
|
|
177
|
+
return (globalThis as Record<symbol, adaptercontract | undefined>)[registrykey];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** The bundle stamp of the running instance: the entry file of each dist target stamps its own mode and target at load, so the stamp stays per bundle by design while the adapter registry stays per process. */
|
|
181
|
+
let runningmode: librarymode = "esm";
|
|
182
|
+
let runningtarget = "index.js";
|
|
183
|
+
|
|
184
|
+
/** Stamps the mode and target of the running bundle; each dist entry calls this once at load, so the library reports the bundle it runs from. Example: `stampbundle("umd", "devthink.umd.js")` stamps the script tag bundle. */
|
|
185
|
+
export function stampbundle(mode: librarymode, target: string): void {
|
|
186
|
+
runningmode = mode;
|
|
187
|
+
runningtarget = target;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Reads the stamp of the running bundle with the package version: one function answers the version, the consumption mode and the dist target of the bundle the caller loaded. Example: `bundlestamp().mode` answers `cjs` inside dist/index.cjs. */
|
|
191
|
+
export function bundlestamp(): bundlemode {
|
|
192
|
+
return { version: packageversion, mode: runningmode, target: runningtarget };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** Detects the adapter runtime of the active platform through global probes: the node, bun and deno globals name their runtime and a page environment answers browser, so one probe decides which default adapter composition binds. Example: `detectadapterruntime()` answers `node` under the node build. */
|
|
196
|
+
export function detectadapterruntime(): platformtarget["runtime"] | "unknown" {
|
|
197
|
+
const holder = globalThis as {
|
|
198
|
+
Deno?: { version?: string };
|
|
199
|
+
Bun?: { version?: string };
|
|
200
|
+
process?: { versions?: { node?: string } };
|
|
201
|
+
window?: unknown;
|
|
202
|
+
};
|
|
203
|
+
if (holder.Deno !== undefined) return "deno";
|
|
204
|
+
if (holder.Bun !== undefined) return "bun";
|
|
205
|
+
if (holder.process?.versions?.node !== undefined) return "node";
|
|
206
|
+
if (holder.window !== undefined) return "browser";
|
|
207
|
+
return "unknown";
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Reads the adapter surface report of one contract: the runtime, mode, declaration mappings and probe flags in one plain record the doctor surfaces print. Example: `adaptersurfaceof(adapter).storage` answers the storage mapping name. */
|
|
211
|
+
export function adaptersurfaceof(adapter: adaptercontract): {
|
|
212
|
+
runtime: string;
|
|
213
|
+
mode: librarymode;
|
|
214
|
+
storage: string;
|
|
215
|
+
worker: string;
|
|
216
|
+
dom: string;
|
|
217
|
+
probes: capabilityprobe;
|
|
218
|
+
declaration: runtimeadapterdeclaration;
|
|
219
|
+
} {
|
|
220
|
+
return {
|
|
221
|
+
runtime: adapter.runtime,
|
|
222
|
+
mode: adapter.mode,
|
|
223
|
+
storage: adapter.declaration.storage,
|
|
224
|
+
worker: adapter.declaration.worker,
|
|
225
|
+
dom: adapter.declaration.dom,
|
|
226
|
+
probes: adapter.probes,
|
|
227
|
+
declaration: adapter.declaration,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* ── Merged from runtimeadapters.ts ── */
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Runtimeadapters logic of the 1.1.67 family.
|
|
235
|
+
* One core meets every runtime through its adapter: the capability probes detect the dom, storage, network and worker capabilities of the active runtime, a missing capability downgrades its feature instead of failing the runtime, and the runtime shells provide the timers, storage and fetch primitives with the storage adapter mapping to chrome storage in the browser, the filesystem in node and bun and deno kv in deno, the worker adapter mapping to web workers or worker threads and the dom adapter mapping to a live page in the browser and a remote browser session in headless mode.
|
|
236
|
+
* The adapters stay injection seams: every primitive arrives as a parameter, so the pure core never imports a platform module and the extension bundle stays free of node shims.
|
|
237
|
+
*/
|
|
238
|
+
|
|
239
|
+
/** The runtime names the adapters serve. */
|
|
240
|
+
export type adapterruntime = platformtarget["runtime"];
|
|
241
|
+
|
|
242
|
+
/** Reads one capability probe from the presence flags of the active runtime: the probe detects dom, storage, network and worker availability without failing anything. */
|
|
243
|
+
export function capabilityprobeof(input: {
|
|
244
|
+
dom: boolean;
|
|
245
|
+
storage: boolean;
|
|
246
|
+
network: boolean;
|
|
247
|
+
worker: boolean;
|
|
248
|
+
}): capabilityprobe {
|
|
249
|
+
return { dom: input.dom, storage: input.storage, network: input.network, worker: input.worker };
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** Reads the declared capability matrix: the browser probes every capability, node and bun probe storage, network and workers without a dom, and deno probes its kv storage, the platform fetch and its web workers without a dom. */
|
|
253
|
+
export function runtimecapabilitiestable(): Record<adapterruntime, capabilityprobe> {
|
|
254
|
+
return {
|
|
255
|
+
browser: { dom: true, storage: true, network: true, worker: true },
|
|
256
|
+
node: { dom: false, storage: true, network: true, worker: true },
|
|
257
|
+
bun: { dom: false, storage: true, network: true, worker: true },
|
|
258
|
+
deno: { dom: false, storage: true, network: true, worker: true },
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** Reads the adapter declaration of one runtime: the storage, fetch, timer, worker and dom mappings its platform provides. */
|
|
263
|
+
export function runtimeadapterdeclarationof(runtime: adapterruntime, headless?: boolean): runtimeadapterdeclaration {
|
|
264
|
+
const declarations: Record<adapterruntime, runtimeadapterdeclaration> = {
|
|
265
|
+
browser: {
|
|
266
|
+
runtime,
|
|
267
|
+
storage: "chrome",
|
|
268
|
+
fetch: "platform",
|
|
269
|
+
timer: "platform",
|
|
270
|
+
worker: "webworker",
|
|
271
|
+
dom: headless === true ? "remote" : "livepage",
|
|
272
|
+
},
|
|
273
|
+
node: {
|
|
274
|
+
runtime,
|
|
275
|
+
storage: "filesystem",
|
|
276
|
+
fetch: "platform",
|
|
277
|
+
timer: "platform",
|
|
278
|
+
worker: "workerthreads",
|
|
279
|
+
dom: "remote",
|
|
280
|
+
},
|
|
281
|
+
bun: {
|
|
282
|
+
runtime,
|
|
283
|
+
storage: "filesystem",
|
|
284
|
+
fetch: "platform",
|
|
285
|
+
timer: "platform",
|
|
286
|
+
worker: "workerthreads",
|
|
287
|
+
dom: "remote",
|
|
288
|
+
},
|
|
289
|
+
deno: { runtime, storage: "denokv", fetch: "platform", timer: "platform", worker: "webworker", dom: "remote" },
|
|
290
|
+
};
|
|
291
|
+
return declarations[runtime];
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** Reads every adapter declaration of the matrix in one list, so the doctor report and the build matrix read the same mappings. */
|
|
295
|
+
export function adapterdeclarationsof(): runtimeadapterdeclaration[] {
|
|
296
|
+
return (["browser", "node", "bun", "deno"] as adapterruntime[]).map((runtime) =>
|
|
297
|
+
runtimeadapterdeclarationof(runtime),
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/** Reads the worker mapping of one runtime: the browser and deno run web workers while node and bun run worker threads. */
|
|
302
|
+
export function workermapof(runtime: adapterruntime): "webworker" | "workerthreads" {
|
|
303
|
+
return runtime === "node" || runtime === "bun" ? "workerthreads" : "webworker";
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/** Reads the dom mapping of one mode: the browser maps to the live page and the headless mode maps to the remote browser session the attach protocol drives. */
|
|
307
|
+
export function dommapof(mode: "browser" | "headless"): "livepage" | "remote" {
|
|
308
|
+
return mode === "browser" ? "livepage" : "remote";
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/** Computes the feature downgrades of one runtime: every feature whose capability the probes miss downgrades with its reason, and nothing fails the runtime. */
|
|
312
|
+
export function downgradesof(input: {
|
|
313
|
+
features: Array<{ feature: string; capability: keyof capabilityprobe }>;
|
|
314
|
+
probes: capabilityprobe;
|
|
315
|
+
}): featuredowngrade[] {
|
|
316
|
+
return input.features
|
|
317
|
+
.filter((feature) => input.probes[feature.capability] !== true)
|
|
318
|
+
.map((feature) => ({
|
|
319
|
+
feature: feature.feature,
|
|
320
|
+
capability: feature.capability,
|
|
321
|
+
reason: `The runtime probes no ${feature.capability} capability, so the ${feature.feature} feature downgrades instead of failing the runtime.`,
|
|
322
|
+
}));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/** Reads the storage primitives one filesystem runtime injects: the adapter maps every memory key to one json file under its base directory. */
|
|
326
|
+
export interface filesystemprimitives {
|
|
327
|
+
readfile(path: string): Promise<string>;
|
|
328
|
+
writefile(path: string, data: string): Promise<void>;
|
|
329
|
+
mkdir(path: string): Promise<unknown>;
|
|
330
|
+
join(...parts: string[]): string;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/** Maps filesystem primitives onto the memory adapter seam: every key becomes one json file under the base directory, so node and bun store profiles the same way the browser stores them. */
|
|
334
|
+
export function filesystemstorageadapter(fs: filesystemprimitives, base: string): memoryadapter {
|
|
335
|
+
return {
|
|
336
|
+
async get<T>(key: string): Promise<T | undefined> {
|
|
337
|
+
try {
|
|
338
|
+
return JSON.parse(await fs.readfile(fs.join(base, `${key}.json`))) as T;
|
|
339
|
+
} catch {
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
async set<T>(key: string, value: T): Promise<void> {
|
|
344
|
+
await fs.mkdir(base);
|
|
345
|
+
await fs.writefile(fs.join(base, `${key}.json`), JSON.stringify(value));
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/** Reads the storage primitives one chrome runtime injects: the adapter maps every memory key onto one storage area entry. */
|
|
351
|
+
export interface chromestorageprimitives {
|
|
352
|
+
get(key: string): Promise<unknown>;
|
|
353
|
+
set(key: string, value: unknown): Promise<void>;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** Maps chrome storage primitives onto the memory adapter seam: the browser stores every memory key in the storage area the caller injected. */
|
|
357
|
+
export function chromestorageadapter(area: chromestorageprimitives): memoryadapter {
|
|
358
|
+
return {
|
|
359
|
+
async get<T>(key: string): Promise<T | undefined> {
|
|
360
|
+
return (await area.get(key)) as T | undefined;
|
|
361
|
+
},
|
|
362
|
+
async set<T>(key: string, value: T): Promise<void> {
|
|
363
|
+
await area.set(key, value);
|
|
364
|
+
},
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/** Reads the kv primitives one deno runtime injects: the adapter maps every memory key onto one kv entry. */
|
|
369
|
+
export interface denokvprimitives {
|
|
370
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
371
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/** Maps deno kv primitives onto the memory adapter seam: deno stores every memory key in the kv store the caller opened. */
|
|
375
|
+
export function denokvadapter(kv: denokvprimitives): memoryadapter {
|
|
376
|
+
return {
|
|
377
|
+
async get<T>(key: string): Promise<T | undefined> {
|
|
378
|
+
return kv.get<T>(key);
|
|
379
|
+
},
|
|
380
|
+
async set<T>(key: string, value: T): Promise<void> {
|
|
381
|
+
await kv.set(key, value);
|
|
382
|
+
},
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/** Maps an in-memory map onto the memory adapter seam: the test and browser fallback store keeps every key in one map. */
|
|
387
|
+
export function memorystorageadapter(store?: Map<string, unknown>): memoryadapter {
|
|
388
|
+
const held = store ?? new Map<string, unknown>();
|
|
389
|
+
return {
|
|
390
|
+
async get<T>(key: string): Promise<T | undefined> {
|
|
391
|
+
return held.get(key) as T | undefined;
|
|
392
|
+
},
|
|
393
|
+
async set<T>(key: string, value: T): Promise<void> {
|
|
394
|
+
held.set(key, value);
|
|
395
|
+
},
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/** Reads the timer shell of one runtime: the platform scheduling primitive the caller injected decides when callbacks run, so no adapter reimplements a clock. */
|
|
400
|
+
export function timershellof(primitives: {
|
|
401
|
+
settimeout(callback: () => void, milliseconds: number): unknown;
|
|
402
|
+
now(): number;
|
|
403
|
+
}): { schedule(callback: () => void, milliseconds: number): unknown; now(): number } {
|
|
404
|
+
return {
|
|
405
|
+
schedule: (callback, milliseconds) => primitives.settimeout(callback, milliseconds),
|
|
406
|
+
now: () => primitives.now(),
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** Reads the fetch shell of one runtime: the platform fetch primitive the caller injected passes through untouched, because every supported runtime ships one. */
|
|
411
|
+
export function fetchshellof(primitives: { fetch(input: string, init?: unknown): Promise<unknown> }): {
|
|
412
|
+
fetch(input: string, init?: unknown): Promise<unknown>;
|
|
413
|
+
} {
|
|
414
|
+
return { fetch: (input, init) => primitives.fetch(input, init) };
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/** Composes the runtime adapter of one target: the declaration, the probes and the injected primitives become one shell, with the storage adapter mapping through the seam the caller provided. */
|
|
418
|
+
export function runtimeadapterof(input: {
|
|
419
|
+
runtime: adapterruntime;
|
|
420
|
+
headless?: boolean;
|
|
421
|
+
storage?: memoryadapter;
|
|
422
|
+
timer?: { settimeout(callback: () => void, milliseconds: number): unknown; now(): number };
|
|
423
|
+
fetch?: { fetch(input: string, init?: unknown): Promise<unknown> };
|
|
424
|
+
}): {
|
|
425
|
+
declaration: runtimeadapterdeclaration;
|
|
426
|
+
probes: capabilityprobe;
|
|
427
|
+
storage?: memoryadapter;
|
|
428
|
+
timer?: { schedule(callback: () => void, milliseconds: number): unknown; now(): number };
|
|
429
|
+
fetch?: { fetch(input: string, init?: unknown): Promise<unknown> };
|
|
430
|
+
} {
|
|
431
|
+
return {
|
|
432
|
+
declaration: runtimeadapterdeclarationof(input.runtime, input.headless),
|
|
433
|
+
probes: runtimecapabilitiestable()[input.runtime],
|
|
434
|
+
...(input.storage !== undefined ? { storage: input.storage } : {}),
|
|
435
|
+
...(input.timer !== undefined ? { timer: timershellof(input.timer) } : {}),
|
|
436
|
+
...(input.fetch !== undefined ? { fetch: fetchshellof(input.fetch) } : {}),
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/** Reads the portable capability set of one runtime: a runtime that probes the dom (a live page or an attached remote session) executes every reviewed kind the vocabulary declares, and a runtime without one executes the kinds its domless filter admits. */
|
|
441
|
+
export function portablecapabilityset(input: {
|
|
442
|
+
vocabulary: string[];
|
|
443
|
+
probes: capabilityprobe;
|
|
444
|
+
domlesskinds?: string[];
|
|
445
|
+
}): string[] {
|
|
446
|
+
if (input.probes.dom) return input.vocabulary;
|
|
447
|
+
return input.domlesskinds ?? [];
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* ── Merged from platformtargets.ts ── */
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Platformtargets logic of the 1.1.67 family.
|
|
454
|
+
* The runtime matrix declares itself in one place: the browser, node, bun and deno targets each carry their entry file, bundle format, esbuild platform and declaration flag, the matrix verifies every runtime declares exactly one target, and one matrix run builds them all from the shared core.
|
|
455
|
+
* Nothing about a target is inferred: the declaration is the contract the build matrix and the doctor report read, so a new runtime enters through one declaration and never through scattered build flags.
|
|
456
|
+
*/
|
|
457
|
+
|
|
458
|
+
/** Declares the platform matrix: the browser target serves script tag consumers through the umd shell under the product name devthink.umd.js, the node target serves require consumers through its cjs shell, and the bun and deno targets ride the esm core entries of their runtime shells. */
|
|
459
|
+
export function platformtargets(): platformtarget[] {
|
|
460
|
+
return [
|
|
461
|
+
{
|
|
462
|
+
runtime: "browser",
|
|
463
|
+
entry: "umd.ts",
|
|
464
|
+
format: "umd",
|
|
465
|
+
platform: "browser",
|
|
466
|
+
declarations: true,
|
|
467
|
+
output: "devthink.umd.js",
|
|
468
|
+
},
|
|
469
|
+
{ runtime: "node", entry: "node.ts", format: "cjs", platform: "node", declarations: true },
|
|
470
|
+
{ runtime: "bun", entry: "bun.ts", format: "esm", platform: "node", declarations: true },
|
|
471
|
+
{ runtime: "deno", entry: "deno.ts", format: "esm", platform: "neutral", declarations: true },
|
|
472
|
+
];
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/** Builds the platform matrix of one declaration list with its completeness flag: the matrix completes when every runtime declares exactly one target. */
|
|
476
|
+
export function platformmatrixof(targets: platformtarget[]): platformmatrix {
|
|
477
|
+
const runtimes = new Set(targets.map((target) => target.runtime));
|
|
478
|
+
const complete =
|
|
479
|
+
runtimes.size === targets.length &&
|
|
480
|
+
["browser", "node", "bun", "deno"].every((runtime) => runtimes.has(runtime as platformtarget["runtime"]));
|
|
481
|
+
return { targets, complete };
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/** Reads the platform target of one runtime from a declaration list; an absent or duplicated runtime refuses. */
|
|
485
|
+
export function matrixtargetof(targets: platformtarget[], runtime: platformtarget["runtime"]): platformtarget {
|
|
486
|
+
const declared = targets.filter((target) => target.runtime === runtime);
|
|
487
|
+
if (declared.length === 0) throw new Error(`The platform matrix declares no ${runtime} target.`);
|
|
488
|
+
if (declared.length > 1)
|
|
489
|
+
throw new Error(
|
|
490
|
+
`The platform matrix declares the ${runtime} target ${declared.length} times; every runtime declares exactly one target.`,
|
|
491
|
+
);
|
|
492
|
+
return declared[0] as platformtarget;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/** Verifies one matrix run: every declared target needs its built bundle present, so a missing entry names the runtime that failed its matrix run. */
|
|
496
|
+
export function matrixverify(input: { targets: platformtarget[]; present: string[] }): {
|
|
497
|
+
complete: boolean;
|
|
498
|
+
missing: string[];
|
|
499
|
+
reason: string;
|
|
500
|
+
} {
|
|
501
|
+
const missing = input.targets
|
|
502
|
+
.filter((target) => !input.present.includes(target.entry))
|
|
503
|
+
.map((target) => `${target.runtime}:${target.entry}`);
|
|
504
|
+
return {
|
|
505
|
+
complete: missing.length === 0,
|
|
506
|
+
missing,
|
|
507
|
+
reason:
|
|
508
|
+
missing.length === 0
|
|
509
|
+
? `The matrix run verified every platform target of ${input.targets.map((target) => target.runtime).join(", ")}.`
|
|
510
|
+
: `The matrix run lacks the built entries ${missing.join(", ")}.`,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/** Reads the output file name of one platform target bundle: an explicit output name wins, and an absent name keeps the entry stem with the format extension the target declares. */
|
|
515
|
+
export function targetoutput(target: platformtarget): string {
|
|
516
|
+
if (target.output !== undefined) return target.output;
|
|
517
|
+
const stem = target.entry.replace(/\.ts$/, "");
|
|
518
|
+
return target.format === "cjs" ? `${stem}.cjs` : target.format === "umd" ? `${stem}.umd.js` : `${stem}.js`;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/** Reads the minified output file name of one platform target bundle: the unminified variant keeps its name and the minified variant inserts the min marker before the extension, so every target ships both variants under one rule. */
|
|
522
|
+
export function minifiedoutput(target: platformtarget): string {
|
|
523
|
+
return targetoutput(target)
|
|
524
|
+
.replace(/\.js$/, ".min.js")
|
|
525
|
+
.replace(/\.cjs$/, ".min.cjs");
|
|
526
|
+
}
|