From 5d79e50ebdb49bd832f640d417955ef11afea6b6 Mon Sep 17 00:00:00 2001 From: Vlad Krot Date: Mon, 3 Aug 2026 10:27:00 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20Merge=20PR=20#75268=20[w3c-sub-a?= =?UTF-8?q?pps]=20Add=20type=20definitions=20for=20sub=20apps=20by=20@vkro?= =?UTF-8?q?t-cell?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- types/w3c-sub-apps/.npmignore | 5 +++ types/w3c-sub-apps/index.d.ts | 40 +++++++++++++++++ types/w3c-sub-apps/package.json | 32 +++++++++++++ types/w3c-sub-apps/tsconfig.json | 25 +++++++++++ types/w3c-sub-apps/w3c-sub-apps-tests.ts | 57 ++++++++++++++++++++++++ 5 files changed, 159 insertions(+) create mode 100644 types/w3c-sub-apps/.npmignore create mode 100644 types/w3c-sub-apps/index.d.ts create mode 100644 types/w3c-sub-apps/package.json create mode 100644 types/w3c-sub-apps/tsconfig.json create mode 100644 types/w3c-sub-apps/w3c-sub-apps-tests.ts diff --git a/types/w3c-sub-apps/.npmignore b/types/w3c-sub-apps/.npmignore new file mode 100644 index 00000000000000..93e307400a5456 --- /dev/null +++ b/types/w3c-sub-apps/.npmignore @@ -0,0 +1,5 @@ +* +!**/*.d.ts +!**/*.d.cts +!**/*.d.mts +!**/*.d.*.ts diff --git a/types/w3c-sub-apps/index.d.ts b/types/w3c-sub-apps/index.d.ts new file mode 100644 index 00000000000000..c1a016f4175c5f --- /dev/null +++ b/types/w3c-sub-apps/index.d.ts @@ -0,0 +1,40 @@ +/** + * @see https://wicg.github.io/sub-apps/ + */ + +/** Represents the https://w3c.github.io/manifest/#id-member */ +export type ManifestId = string; + +export interface SubAppsAddResponse { + /** Map of install paths as user provided to their corresponding ManifestId. */ + installedApps: Record; + /** Map of install paths as user provided to the error that occurred. */ + failedApps: Record; +} + +export interface SubAppsRemoveResponse { + /** List of successfully removed Sub Apps' ManifestIds. */ + removedApps: ManifestId[]; + /** Map of ManifestIds to the error that occurred. */ + failedApps: Record; +} + +export interface SubAppsListResult { + /** The name of the Sub App. */ + appName: string; +} + +declare global { + interface SubApps { + /** Installs one or more Sub Apps. */ + add(install_paths: string[]): Promise; + /** Removes one or more Sub Apps. */ + remove(manifest_ids: ManifestId[]): Promise; + /** Lists installed Sub Apps. */ + list(): Promise>; + } + + interface Window { + readonly subApps: SubApps; + } +} diff --git a/types/w3c-sub-apps/package.json b/types/w3c-sub-apps/package.json new file mode 100644 index 00000000000000..c40d18c0c85d1a --- /dev/null +++ b/types/w3c-sub-apps/package.json @@ -0,0 +1,32 @@ +{ + "private": true, + "nonNpm": true, + "nonNpmDescription": "Implementation of Isolated Web App (IWA) APIs resides in Chromium.", + "name": "@types/w3c-sub-apps", + "version": "0.0.9999", + "projects": [ + "https://wicg.github.io/sub-apps/" + ], + "devDependencies": { + "@types/web": "*", + "@types/w3c-sub-apps": "workspace:." + }, + "owners": [ + { + "name": "Vlad Krot", + "githubUsername": "vkrot-cell" + }, + { + "name": "Edman Anjos", + "githubUsername": "edman" + }, + { + "name": "Andrew Rayskiy", + "githubUsername": "GrapeGreen" + }, + { + "name": "Simon Hangl", + "githubUsername": "shangl" + } + ] +} diff --git a/types/w3c-sub-apps/tsconfig.json b/types/w3c-sub-apps/tsconfig.json new file mode 100644 index 00000000000000..710b2433d36ae5 --- /dev/null +++ b/types/w3c-sub-apps/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "node16", + "lib": [ + "es6", + "dom" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "w3c-sub-apps": [ + "./index.d.ts" + ] + } + }, + "files": [ + "index.d.ts", + "w3c-sub-apps-tests.ts" + ] +} diff --git a/types/w3c-sub-apps/w3c-sub-apps-tests.ts b/types/w3c-sub-apps/w3c-sub-apps-tests.ts new file mode 100644 index 00000000000000..23ac02d44b5f19 --- /dev/null +++ b/types/w3c-sub-apps/w3c-sub-apps-tests.ts @@ -0,0 +1,57 @@ +import { ManifestId, SubAppsAddResponse, SubAppsListResult, SubAppsRemoveResponse } from "w3c-sub-apps"; + +async function testSubAppsApi() { + // -------------------------------------------------------------------------------- + // Synchronous Type Definitions (Interfaces) + // -------------------------------------------------------------------------------- + + const manifestId: ManifestId = "some-id"; + // $ExpectType string + manifestId; + + const addResponse: SubAppsAddResponse = { + installedApps: { "/path": manifestId }, + failedApps: { "/path2": new DOMException() }, + }; + // $ExpectType Record + addResponse.installedApps; + // $ExpectType Record + addResponse.failedApps; + + const removeResponse: SubAppsRemoveResponse = { + removedApps: [manifestId], + failedApps: { "/path2": new DOMException() }, + }; + // $ExpectType string[] + removeResponse.removedApps; + // $ExpectType Record + removeResponse.failedApps; + + const listResult: SubAppsListResult = { + appName: "App 1", + }; + // $ExpectType string + listResult.appName; + + // -------------------------------------------------------------------------------- + // SubApps (Window Augmentation) + // -------------------------------------------------------------------------------- + + if (window.subApps) { + const subApps = window.subApps; + // $ExpectType SubApps + subApps; + + const addPromise = subApps.add(["/path1"]); + // $ExpectType Promise + addPromise; + + const removePromise = subApps.remove([manifestId]); + // $ExpectType Promise + removePromise; + + const listPromise = subApps.list(); + // $ExpectType Promise> + listPromise; + } +}