From 783e40a00e757241e79f751519f17d63f8a7c71d Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Mon, 1 Nov 2021 17:28:10 -0700 Subject: [PATCH 01/16] Add Provider Interface to Replace IFluidObject --- .../api-report/core-interfaces.api.md | 15 +++- common/lib/core-interfaces/package.json | 6 ++ common/lib/core-interfaces/src/fluidObject.ts | 3 + common/lib/core-interfaces/src/index.ts | 1 + common/lib/core-interfaces/src/provider.ts | 72 +++++++++++++++++++ .../core-interfaces/test-d/index.test-d.ts | 63 ++++++++++++++++ common/lib/core-interfaces/tsconfig.json | 5 +- 7 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 common/lib/core-interfaces/src/provider.ts create mode 100644 common/lib/core-interfaces/test-d/index.test-d.ts diff --git a/common/lib/core-interfaces/api-report/core-interfaces.api.md b/common/lib/core-interfaces/api-report/core-interfaces.api.md index e93d5ecf9968..379790acb1d4 100644 --- a/common/lib/core-interfaces/api-report/core-interfaces.api.md +++ b/common/lib/core-interfaces/api-report/core-interfaces.api.md @@ -69,7 +69,7 @@ export interface IFluidLoadable extends IProvideFluidLoadable { handle: IFluidHandle; } -// @public (undocumented) +// @public @deprecated (undocumented) export interface IFluidObject extends Readonly> { } @@ -213,6 +213,19 @@ export const isFluidCodeDetails: (details: unknown) => details is Readonly pkg is Readonly; +// Warning: (ae-incompatible-release-tags) The symbol "Provider" is marked as @public, but its signature references "ProviderPropertyKeys" which is marked as @internal +// +// @public +export type Provider = Partial>>; + +// @public +export type ProviderKeys = keyof Provider; + +// Warning: (ae-internal-missing-underscore) The name "ProviderPropertyKeys" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal +export type ProviderPropertyKeys = string extends TProp ? never : number extends TProp ? never : TProp extends keyof T[TProp] ? TProp extends keyof T[TProp][TProp] ? TProp : never : never; + // (No @packageDocumentation comment for this package) diff --git a/common/lib/core-interfaces/package.json b/common/lib/core-interfaces/package.json index a86fa51c19aa..62761a1fe3ff 100644 --- a/common/lib/core-interfaces/package.json +++ b/common/lib/core-interfaces/package.json @@ -28,6 +28,8 @@ "eslint:fix": "eslint --format stylish src --fix", "lint": "npm run eslint", "lint:fix": "npm run eslint:fix", + "test": "npm run test:types", + "test:types": "tsd", "tsc": "tsc", "tsc:watch": "tsc --watch", "tsfmt": "tsfmt --verify", @@ -53,9 +55,13 @@ "eslint-plugin-react": "~7.22.0", "eslint-plugin-unicorn": "~26.0.1", "rimraf": "^2.6.2", + "tsd": "^0.17.0", "typescript": "~4.1.3", "typescript-formatter": "7.1.0" }, + "tsd": { + "directory": "test-d" + }, "typeValidation": { "version": "0.41.0", "broken": {} diff --git a/common/lib/core-interfaces/src/fluidObject.ts b/common/lib/core-interfaces/src/fluidObject.ts index 1749874ad9db..64c50a904a55 100644 --- a/common/lib/core-interfaces/src/fluidObject.ts +++ b/common/lib/core-interfaces/src/fluidObject.ts @@ -13,6 +13,9 @@ import { IProvideFluidHandle, IProvideFluidHandleContext } from "./handles"; import { IProvideFluidSerializer } from "./serializer"; /* eslint-disable @typescript-eslint/no-empty-interface */ +/** + * @deprecated Use Provider or the interface directly instead + */ export interface IFluidObject extends Readonly = + string extends TProp ? never : number extends TProp? never : // exclude indexers [key:string |number]: any + TProp extends keyof T[TProp] // TProp is a property of T, T[TProp] and, T[TProp][TProp] + ? TProp extends keyof T[TProp][TProp] // ex; IProvideFoo.IFoo.IFoo.IFoo + ? TProp + :never + : never; + +/** + * This utility type take interface(s) that follow the provider pattern, and produces + * a new type that can be used for inspection and discovery of those interfaces. + * + * It is meant to be used with types that are know to implement the provider pattern. + * A common way to specify that a type implements that pattern is to expose it as a + * Provider without a generic argument. + * + * For example, if we have an interface like below + * ``` + * interface IProvideFoo{ + * IFoo: IFoo + * } + * interface IFoo extends IProvideFoo{ + * foobar(); + * } + * ``` + * + * and a function that returns and Provider. You would do the following + * + * `const maybeFoo : Provider = getUnknown()`; + * + * Either IFoo or IProvideFoo are valid generic arguments. In both case + * maybeFoo will be of type `{IFoo?: IFoo}`. If IFoo is no undefined, + * then the IFluidUnknown implements IFoo, and it can be used. + * + * You can inspect multiple types via a intersection. For example: + * `Provider` + * + */ + export type Provider = Partial>>; + +/** + * This utility type creates a type that is the union of all keys on the generic type + * which implement the provider pattern. @see Provider + * + * For example `ProviderKeys` would result in `"IFoo" | "IBar"` + * + */ +export type ProviderKeys = keyof Provider; diff --git a/common/lib/core-interfaces/test-d/index.test-d.ts b/common/lib/core-interfaces/test-d/index.test-d.ts new file mode 100644 index 000000000000..cf023f2986cf --- /dev/null +++ b/common/lib/core-interfaces/test-d/index.test-d.ts @@ -0,0 +1,63 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ +/* eslint-disable unicorn/filename-case */ +// eslint-disable-next-line import/no-extraneous-dependencies +import {expectError} from "tsd"; +import { IFluidLoadable, IProvideFluidLoadable, Provider, ProviderKeys } from "../dist"; + + +declare function getUnknown(): Provider; + +declare function useUnknown(params: Provider | undefined): void; + +declare function useProvider(params: Provider | undefined): void; + +declare function useProviderKey = ProviderKeys>(key: TKey): void; + +declare function useLoadable(params: Provider | undefined): void; + +// test with provider +{ + const provider: Provider = getUnknown(); + useUnknown(provider); + useUnknown(provider.IFluidLoadable); + useProvider(provider); + useProvider(provider.IFluidLoadable); + useLoadable(provider); + useLoadable(provider.IFluidLoadable); + expectError(provider.handle); + provider.IFluidLoadable?.handle; + const unknown: Provider | undefined = provider.IFluidLoadable; + useUnknown(unknown); + useProvider(unknown); + useProvider(unknown); + useLoadable(unknown); +} + +// test with interface +{ + const foo: Provider = getUnknown(); + useUnknown(foo); + useUnknown(foo.IFluidLoadable); + useProvider(foo); + useProvider(foo.IFluidLoadable); + useLoadable(foo); + useLoadable(foo.IFluidLoadable); + expectError(foo.handle); + foo.IFluidLoadable?.handle; + const unknown: Provider | undefined = foo.IFluidLoadable; + useUnknown(unknown); + useProvider(unknown); + useProvider(unknown); + useLoadable(unknown); +} + +// test getting keys +{ + useProviderKey(IFluidLoadable); + useProviderKey(IFluidLoadable); + const loadableKey: keyof IFluidLoadable = "handle"; + expectError(useProviderKey(loadableKey)); +} diff --git a/common/lib/core-interfaces/tsconfig.json b/common/lib/core-interfaces/tsconfig.json index fb993697be0f..fca083eb79cf 100644 --- a/common/lib/core-interfaces/tsconfig.json +++ b/common/lib/core-interfaces/tsconfig.json @@ -2,7 +2,8 @@ "extends": "@fluidframework/build-common/ts-common-config.json", "exclude": [ "dist", - "node_modules" + "node_modules", + "test-d" ], "compilerOptions": { "rootDir": "./src", @@ -11,4 +12,4 @@ "include": [ "src/**/*" ] -} \ No newline at end of file +} From 21a29c8e7687aa0b22b9b0047a77414885de8d4e Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 2 Nov 2021 09:25:03 -0700 Subject: [PATCH 02/16] update package lock --- common/lib/core-interfaces/package-lock.json | 647 +++++++++++++++++++ 1 file changed, 647 insertions(+) diff --git a/common/lib/core-interfaces/package-lock.json b/common/lib/core-interfaces/package-lock.json index e000a5cc5337..352126e35078 100644 --- a/common/lib/core-interfaces/package-lock.json +++ b/common/lib/core-interfaces/package-lock.json @@ -1664,6 +1664,22 @@ "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, + "@types/eslint": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.2.tgz", + "integrity": "sha512-KubbADPkfoU75KgKeKLsFHXnU4ipH7wYg0TRT33NK3N3yiu7jlFAAoygIWBV+KbuHx/G+AvuGX6DllnK35gfJA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, "@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -1692,6 +1708,12 @@ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, "@types/node": { "version": "12.20.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.13.tgz", @@ -1836,6 +1858,23 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -2167,6 +2206,17 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, "caniuse-lite": { "version": "1.0.30001228", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", @@ -2747,6 +2797,24 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -3149,6 +3217,121 @@ "lodash.zip": "^4.2.0" } }, + "eslint-formatter-pretty": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", + "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", + "dev": true, + "requires": { + "@types/eslint": "^7.2.13", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "eslint-rule-docs": "^1.1.5", + "log-symbols": "^4.0.0", + "plur": "^4.0.0", + "string-width": "^4.2.0", + "supports-hyperlinks": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + } + } + }, "eslint-import-resolver-node": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", @@ -3427,6 +3610,12 @@ } } }, + "eslint-rule-docs": { + "version": "1.1.231", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.231.tgz", + "integrity": "sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -4102,6 +4291,12 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4368,6 +4563,12 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, + "irregular-plurals": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", + "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", + "dev": true + }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -4712,6 +4913,12 @@ "unc-path-regex": "^0.1.2" } }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-weakref": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", @@ -5151,6 +5358,67 @@ "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", "dev": true }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5181,6 +5449,12 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -5199,6 +5473,194 @@ "@octokit/rest": "^16.43.1" } }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -5230,6 +5692,12 @@ "mime-db": "1.50.0" } }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -5245,6 +5713,31 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -5980,6 +6473,15 @@ "find-up": "^2.1.0" } }, + "plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "dev": true, + "requires": { + "irregular-plurals": "^3.2.0" + } + }, "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -6080,6 +6582,12 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -6153,6 +6661,16 @@ "resolve": "^1.1.6" } }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -6984,6 +7502,15 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7210,6 +7737,12 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, "ts-morph": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-7.3.0.tgz", @@ -7233,6 +7766,120 @@ "strip-bom": "^3.0.0" } }, + "tsd": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.17.0.tgz", + "integrity": "sha512-+HUwya2NgoP/g9t2gRCC3I8VtGu65NgG9Lv75vNzMaxjMFo+0VXF9c4sj3remSzJYeBHLNKzWMbFOinPqrL20Q==", + "dev": true, + "requires": { + "@tsd/typescript": "~4.3.2", + "eslint-formatter-pretty": "^4.0.0", + "globby": "^11.0.1", + "meow": "^9.0.0", + "path-exists": "^4.0.0", + "read-pkg-up": "^7.0.0" + }, + "dependencies": { + "@tsd/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-Xwxv8bIwyI3ggPz9bwoWEoiaz79MJs+VGf27S1N2tapfDVo60Lz741j5diL9RwszZSXt6IkTAuw7Lai7jSXRJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", From 90d8b27c1edb0120b3ac75e14b50431bdf1e964d Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Wed, 3 Nov 2021 11:09:34 -0700 Subject: [PATCH 03/16] Apply suggestions from code review --- common/lib/core-interfaces/src/provider.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/lib/core-interfaces/src/provider.ts b/common/lib/core-interfaces/src/provider.ts index cfb248935ce4..323951379ba1 100644 --- a/common/lib/core-interfaces/src/provider.ts +++ b/common/lib/core-interfaces/src/provider.ts @@ -34,8 +34,8 @@ * This utility type take interface(s) that follow the provider pattern, and produces * a new type that can be used for inspection and discovery of those interfaces. * - * It is meant to be used with types that are know to implement the provider pattern. - * A common way to specify that a type implements that pattern is to expose it as a + * It is meant to be used with types that are known to implement the provider pattern. + * A common way to specify a type implements the provider pattern is to expose it as a * Provider without a generic argument. * * For example, if we have an interface like below @@ -48,13 +48,13 @@ * } * ``` * - * and a function that returns and Provider. You would do the following + * and a function that returns a Provider. You would do the following * * `const maybeFoo : Provider = getUnknown()`; * * Either IFoo or IProvideFoo are valid generic arguments. In both case - * maybeFoo will be of type `{IFoo?: IFoo}`. If IFoo is no undefined, - * then the IFluidUnknown implements IFoo, and it can be used. + * maybeFoo will be of type `{IFoo?: IFoo}`. If IFoo is not undefined, + * then the Provider implements IFoo, and it can be used. * * You can inspect multiple types via a intersection. For example: * `Provider` From 16575a228939b26c4ef015f5590af9c8cf20764e Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 10:22:32 -0800 Subject: [PATCH 04/16] update package lock --- common/lib/core-interfaces/package-lock.json | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/common/lib/core-interfaces/package-lock.json b/common/lib/core-interfaces/package-lock.json index 8357ecbed17c..4d5f78646205 100644 --- a/common/lib/core-interfaces/package-lock.json +++ b/common/lib/core-interfaces/package-lock.json @@ -4535,6 +4535,12 @@ "safe-buffer": "^5.0.1" } }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, "ky": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/ky/-/ky-0.12.0.tgz", @@ -4840,6 +4846,12 @@ "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", "dev": true }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, "memfs-or-file-map-to-github-branch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/memfs-or-file-map-to-github-branch/-/memfs-or-file-map-to-github-branch-1.2.0.tgz", @@ -5089,6 +5101,31 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", From 0901c32fdb2388a5032bc1f6ee05b482fba3a6ce Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 15:43:40 -0800 Subject: [PATCH 05/16] rename Provider to FluidObject --- common/lib/core-interfaces/src/provider.ts | 34 ++++----- .../core-interfaces/test-d/index.test-d.ts | 75 ++++++++++++------- 2 files changed, 67 insertions(+), 42 deletions(-) diff --git a/common/lib/core-interfaces/src/provider.ts b/common/lib/core-interfaces/src/provider.ts index 323951379ba1..81f59b195f28 100644 --- a/common/lib/core-interfaces/src/provider.ts +++ b/common/lib/core-interfaces/src/provider.ts @@ -5,11 +5,11 @@ /** * @internal - * This utility type is primarily meant for internal use by @see Provider - * Produces a valid Provider key given a type and a property. - * A valid Provider key is a property that exists on the incoming type + * This utility type is primarily meant for internal use by @see FluidObject + * Produces a valid FluidObject key given a type and a property. + * A valid FluidObject key is a property that exists on the incoming type * as well as on the type of the property itself. For example, IProvideFoo.IFoo.IFoo - * This aligns with the provider pattern expected to be used with all Providers. + * This aligns with the FluidObject pattern expected to be used with all FluidObjects. * For example: * ``` * interface IProvideFoo{ @@ -20,9 +20,9 @@ * } * ``` * This pattern enables discovery, and delegation in a standard way which is central - * to Provider pattern + * to FluidObject pattern */ - export type ProviderPropertyKeys = + export type FluidObjectProviderKeys = string extends TProp ? never : number extends TProp? never : // exclude indexers [key:string |number]: any TProp extends keyof T[TProp] // TProp is a property of T, T[TProp] and, T[TProp][TProp] ? TProp extends keyof T[TProp][TProp] // ex; IProvideFoo.IFoo.IFoo.IFoo @@ -31,11 +31,11 @@ : never; /** - * This utility type take interface(s) that follow the provider pattern, and produces + * This utility type take interface(s) that follow the FluidObject pattern, and produces * a new type that can be used for inspection and discovery of those interfaces. * - * It is meant to be used with types that are known to implement the provider pattern. - * A common way to specify a type implements the provider pattern is to expose it as a + * It is meant to be used with types that are known to implement the FluidObject pattern. + * A common way to specify a type implements the FluidObject pattern is to expose it as a * Provider without a generic argument. * * For example, if we have an interface like below @@ -48,25 +48,25 @@ * } * ``` * - * and a function that returns a Provider. You would do the following + * and a function that returns a FluidObject. You would do the following * - * `const maybeFoo : Provider = getUnknown()`; + * `const maybeFoo : Provider = getFluidObject()`; * * Either IFoo or IProvideFoo are valid generic arguments. In both case * maybeFoo will be of type `{IFoo?: IFoo}`. If IFoo is not undefined, - * then the Provider implements IFoo, and it can be used. + * then the FluidObject implements IFoo, and it can be used. * * You can inspect multiple types via a intersection. For example: - * `Provider` + * `FluidObject` * */ - export type Provider = Partial>>; + export type FluidObject = Partial>>; /** * This utility type creates a type that is the union of all keys on the generic type - * which implement the provider pattern. @see Provider + * which implement the FluidObject pattern. @see FluidObject * - * For example `ProviderKeys` would result in `"IFoo" | "IBar"` + * For example `FluidObjectKeys` would result in `"IFoo" | "IBar"` * */ -export type ProviderKeys = keyof Provider; +export type FluidObjectKeys = keyof FluidObject; diff --git a/common/lib/core-interfaces/test-d/index.test-d.ts b/common/lib/core-interfaces/test-d/index.test-d.ts index cf023f2986cf..f896ef7a8aab 100644 --- a/common/lib/core-interfaces/test-d/index.test-d.ts +++ b/common/lib/core-interfaces/test-d/index.test-d.ts @@ -5,50 +5,50 @@ /* eslint-disable unicorn/filename-case */ // eslint-disable-next-line import/no-extraneous-dependencies import {expectError} from "tsd"; -import { IFluidLoadable, IProvideFluidLoadable, Provider, ProviderKeys } from "../dist"; +import { IFluidLoadable, IProvideFluidLoadable, FluidObject, FluidObjectKeys } from "../dist"; -declare function getUnknown(): Provider; +declare function getUnknownFluidObject(): FluidObject; -declare function useUnknown(params: Provider | undefined): void; +declare function useUnknownFluidObject(params: FluidObject | undefined): void; -declare function useProvider(params: Provider | undefined): void; +declare function useProvider(params: FluidObject | undefined): void; -declare function useProviderKey = ProviderKeys>(key: TKey): void; +declare function useProviderKey = FluidObjectKeys>(key: TKey): void; -declare function useLoadable(params: Provider | undefined): void; +declare function useLoadable(params: FluidObject | undefined): void; -// test with provider +// test implicit conversions between FluidObject and a FluidObject with a provides interface { - const provider: Provider = getUnknown(); - useUnknown(provider); - useUnknown(provider.IFluidLoadable); - useProvider(provider); - useProvider(provider.IFluidLoadable); - useLoadable(provider); - useLoadable(provider.IFluidLoadable); - expectError(provider.handle); - provider.IFluidLoadable?.handle; - const unknown: Provider | undefined = provider.IFluidLoadable; - useUnknown(unknown); + const FluidObject: FluidObject = getUnknownFluidObject(); + useUnknownFluidObject(FluidObject); + useUnknownFluidObject(FluidObject.IFluidLoadable); + useProvider(FluidObject); + useProvider(FluidObject.IFluidLoadable); + useLoadable(FluidObject); + useLoadable(FluidObject.IFluidLoadable); + expectError(FluidObject.handle); + FluidObject.IFluidLoadable?.handle; + const unknown: FluidObject | undefined = FluidObject.IFluidLoadable; + useUnknownFluidObject(unknown); useProvider(unknown); useProvider(unknown); useLoadable(unknown); } -// test with interface +// test implicit conversions between FluidObject and a FluidObject with a implementation interface { - const foo: Provider = getUnknown(); - useUnknown(foo); - useUnknown(foo.IFluidLoadable); + const foo: FluidObject = getUnknownFluidObject(); + useUnknownFluidObject(foo); + useUnknownFluidObject(foo.IFluidLoadable); useProvider(foo); useProvider(foo.IFluidLoadable); useLoadable(foo); useLoadable(foo.IFluidLoadable); expectError(foo.handle); foo.IFluidLoadable?.handle; - const unknown: Provider | undefined = foo.IFluidLoadable; - useUnknown(unknown); + const unknown: FluidObject | undefined = foo.IFluidLoadable; + useUnknownFluidObject(unknown); useProvider(unknown); useProvider(unknown); useLoadable(unknown); @@ -56,8 +56,33 @@ declare function useLoadable(params: Provider | undefined): void // test getting keys { - useProviderKey(IFluidLoadable); + useProviderKey(IFluidLoadable); useProviderKey(IFluidLoadable); const loadableKey: keyof IFluidLoadable = "handle"; expectError(useProviderKey(loadableKey)); } + +// test implicit conversions between FluidObject and a FluidObject with a partial provider interface +{ + + interface IProvideFoo{ + IFoo: IFoo; + } + interface IFoo extends Partial{ + doFoo(); + } + + const foo: FluidObject = getUnknownFluidObject(); + useUnknownFluidObject(foo); + useUnknownFluidObject(foo.IFoo); + useProvider(foo); + useProvider(foo.IFoo); + foo.IFoo?.doFoo(); + const fooKey: keyof IFoo = "doFoo"; + expectError(useProviderKey(fooKey)); + const unknown: FluidObject | undefined = foo.IFoo; + useUnknownFluidObject(unknown); + useProvider(unknown); + useProvider(unknown); + useLoadable(unknown); +} From ad3730e85ce9407f9c2a2b0494d4bc7739c5413a Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 15:58:57 -0800 Subject: [PATCH 06/16] update docs --- .../api-report/core-interfaces.api.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/common/lib/core-interfaces/api-report/core-interfaces.api.md b/common/lib/core-interfaces/api-report/core-interfaces.api.md index 379790acb1d4..c784d89ff3a0 100644 --- a/common/lib/core-interfaces/api-report/core-interfaces.api.md +++ b/common/lib/core-interfaces/api-report/core-interfaces.api.md @@ -4,6 +4,19 @@ ```ts +// Warning: (ae-incompatible-release-tags) The symbol "FluidObject" is marked as @public, but its signature references "FluidObjectProviderKeys" which is marked as @internal +// +// @public +export type FluidObject = Partial>>; + +// @public +export type FluidObjectKeys = keyof FluidObject; + +// Warning: (ae-internal-missing-underscore) The name "FluidObjectProviderKeys" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal +export type FluidObjectProviderKeys = string extends TProp ? never : number extends TProp ? never : TProp extends keyof T[TProp] ? TProp extends keyof T[TProp][TProp] ? TProp : never : never; + // @public export interface IFluidCodeDetails { readonly config?: IFluidCodeDetailsConfig; @@ -213,19 +226,6 @@ export const isFluidCodeDetails: (details: unknown) => details is Readonly pkg is Readonly; -// Warning: (ae-incompatible-release-tags) The symbol "Provider" is marked as @public, but its signature references "ProviderPropertyKeys" which is marked as @internal -// -// @public -export type Provider = Partial>>; - -// @public -export type ProviderKeys = keyof Provider; - -// Warning: (ae-internal-missing-underscore) The name "ProviderPropertyKeys" should be prefixed with an underscore because the declaration is marked as @internal -// -// @internal -export type ProviderPropertyKeys = string extends TProp ? never : number extends TProp ? never : TProp extends keyof T[TProp] ? TProp extends keyof T[TProp][TProp] ? TProp : never : never; - // (No @packageDocumentation comment for this package) From 4bcd210e6bf762d59dcaed6edc398efb16e81e18 Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 16:20:40 -0800 Subject: [PATCH 07/16] remove unnecessary contraint --- .../api-report/core-interfaces.api.md | 2 +- common/lib/core-interfaces/src/provider.ts | 10 ++++------ .../core-interfaces/test-d/index.test-d.ts | 20 +++++++++---------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/common/lib/core-interfaces/api-report/core-interfaces.api.md b/common/lib/core-interfaces/api-report/core-interfaces.api.md index c784d89ff3a0..d9975fe1a96f 100644 --- a/common/lib/core-interfaces/api-report/core-interfaces.api.md +++ b/common/lib/core-interfaces/api-report/core-interfaces.api.md @@ -15,7 +15,7 @@ export type FluidObjectKeys = keyof FluidObject; // Warning: (ae-internal-missing-underscore) The name "FluidObjectProviderKeys" should be prefixed with an underscore because the declaration is marked as @internal // // @internal -export type FluidObjectProviderKeys = string extends TProp ? never : number extends TProp ? never : TProp extends keyof T[TProp] ? TProp extends keyof T[TProp][TProp] ? TProp : never : never; +export type FluidObjectProviderKeys = string extends TProp ? never : number extends TProp ? never : TProp extends keyof T[TProp] ? TProp : never; // @public export interface IFluidCodeDetails { diff --git a/common/lib/core-interfaces/src/provider.ts b/common/lib/core-interfaces/src/provider.ts index 81f59b195f28..fce1a7e528fe 100644 --- a/common/lib/core-interfaces/src/provider.ts +++ b/common/lib/core-interfaces/src/provider.ts @@ -5,7 +5,7 @@ /** * @internal - * This utility type is primarily meant for internal use by @see FluidObject + * This utility type is meant for internal use by @see FluidObject * Produces a valid FluidObject key given a type and a property. * A valid FluidObject key is a property that exists on the incoming type * as well as on the type of the property itself. For example, IProvideFoo.IFoo.IFoo @@ -24,11 +24,9 @@ */ export type FluidObjectProviderKeys = string extends TProp ? never : number extends TProp? never : // exclude indexers [key:string |number]: any - TProp extends keyof T[TProp] // TProp is a property of T, T[TProp] and, T[TProp][TProp] - ? TProp extends keyof T[TProp][TProp] // ex; IProvideFoo.IFoo.IFoo.IFoo - ? TProp - :never - : never; + TProp extends keyof T[TProp] // TProp is a property of T, and T[TProp] + ? TProp + :never; /** * This utility type take interface(s) that follow the FluidObject pattern, and produces diff --git a/common/lib/core-interfaces/test-d/index.test-d.ts b/common/lib/core-interfaces/test-d/index.test-d.ts index f896ef7a8aab..aa73876588b1 100644 --- a/common/lib/core-interfaces/test-d/index.test-d.ts +++ b/common/lib/core-interfaces/test-d/index.test-d.ts @@ -20,16 +20,16 @@ declare function useLoadable(params: FluidObject | undefined): v // test implicit conversions between FluidObject and a FluidObject with a provides interface { - const FluidObject: FluidObject = getUnknownFluidObject(); - useUnknownFluidObject(FluidObject); - useUnknownFluidObject(FluidObject.IFluidLoadable); - useProvider(FluidObject); - useProvider(FluidObject.IFluidLoadable); - useLoadable(FluidObject); - useLoadable(FluidObject.IFluidLoadable); - expectError(FluidObject.handle); - FluidObject.IFluidLoadable?.handle; - const unknown: FluidObject | undefined = FluidObject.IFluidLoadable; + const provider: FluidObject = getUnknownFluidObject(); + useUnknownFluidObject(provider); + useUnknownFluidObject(provider.IFluidLoadable); + useProvider(provider); + useProvider(provider.IFluidLoadable); + useLoadable(provider); + useLoadable(provider.IFluidLoadable); + expectError(provider.handle); + provider.IFluidLoadable?.handle; + const unknown: FluidObject | undefined = provider.IFluidLoadable; useUnknownFluidObject(unknown); useProvider(unknown); useProvider(unknown); From cc3895b6fab7884dda57de20dbfde31bafb2ac26 Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 16:45:58 -0800 Subject: [PATCH 08/16] deprecate fluid object properties --- .../api-report/core-interfaces.api.md | 16 +++++- common/lib/core-interfaces/src/fluidObject.ts | 55 +++++++++++++------ .../core-interfaces/test-d/index.test-d.ts | 5 +- 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/common/lib/core-interfaces/api-report/core-interfaces.api.md b/common/lib/core-interfaces/api-report/core-interfaces.api.md index d9975fe1a96f..7353a75c0309 100644 --- a/common/lib/core-interfaces/api-report/core-interfaces.api.md +++ b/common/lib/core-interfaces/api-report/core-interfaces.api.md @@ -83,7 +83,21 @@ export interface IFluidLoadable extends IProvideFluidLoadable { } // @public @deprecated (undocumented) -export interface IFluidObject extends Readonly> { +export interface IFluidObject { + // @deprecated (undocumented) + IFluidConfiguration?: IFluidConfiguration; + // @deprecated (undocumented) + IFluidHandle?: IFluidHandle; + // @deprecated (undocumented) + IFluidHandleContext?: IFluidHandleContext; + // @deprecated (undocumented) + IFluidLoadable?: IFluidLoadable; + // @deprecated (undocumented) + IFluidRouter?: IFluidRouter; + // @deprecated (undocumented) + IFluidRunnable?: IFluidRunnable; + // @deprecated (undocumented) + IFluidSerializer?: IFluidSerializer; } // @public diff --git a/common/lib/core-interfaces/src/fluidObject.ts b/common/lib/core-interfaces/src/fluidObject.ts index 64c50a904a55..d957d20be09e 100644 --- a/common/lib/core-interfaces/src/fluidObject.ts +++ b/common/lib/core-interfaces/src/fluidObject.ts @@ -4,26 +4,45 @@ */ import { - IProvideFluidConfiguration, - IProvideFluidLoadable, - IProvideFluidRunnable, + IFluidConfiguration, + IFluidLoadable, + IFluidRunnable, } from "./fluidLoadable"; -import { IProvideFluidRouter } from "./fluidRouter"; -import { IProvideFluidHandle, IProvideFluidHandleContext } from "./handles"; -import { IProvideFluidSerializer } from "./serializer"; +import { IFluidRouter } from "./fluidRouter"; +import { IFluidHandle, IFluidHandleContext } from "./handles"; +import { IFluidSerializer } from "./serializer"; -/* eslint-disable @typescript-eslint/no-empty-interface */ /** - * @deprecated Use Provider or the interface directly instead + * @deprecated Use `FluidObject` or the interface directly instead */ -export interface IFluidObject extends - Readonly> { +export interface IFluidObject { + + /** + * @deprecated - use `FluidObject` instead + */ + IFluidLoadable?: IFluidLoadable; + /** + * @deprecated - use `FluidObject` instead + */ + IFluidRunnable?: IFluidRunnable + /** + * @deprecated - use `FluidObject` instead + */ + IFluidRouter?: IFluidRouter; + /** + * @deprecated - use `FluidObject` instead + */ + IFluidHandleContext?: IFluidHandleContext; + /** + * @deprecated - use `FluidObject` instead + */ + IFluidConfiguration?: IFluidConfiguration; + /** + * @deprecated - use `FluidObject` instead + */ + IFluidHandle?: IFluidHandle; + /** + * @deprecated - use `FluidObject` instead + */ + IFluidSerializer?: IFluidSerializer; } -/* eslint-enable @typescript-eslint/no-empty-interface */ diff --git a/common/lib/core-interfaces/test-d/index.test-d.ts b/common/lib/core-interfaces/test-d/index.test-d.ts index aa73876588b1..b79ef1766b27 100644 --- a/common/lib/core-interfaces/test-d/index.test-d.ts +++ b/common/lib/core-interfaces/test-d/index.test-d.ts @@ -5,7 +5,7 @@ /* eslint-disable unicorn/filename-case */ // eslint-disable-next-line import/no-extraneous-dependencies import {expectError} from "tsd"; -import { IFluidLoadable, IProvideFluidLoadable, FluidObject, FluidObjectKeys } from "../dist"; +import { IFluidLoadable, IProvideFluidLoadable, FluidObject, FluidObjectKeys, IFluidObject } from "../dist"; declare function getUnknownFluidObject(): FluidObject; @@ -86,3 +86,6 @@ declare function useLoadable(params: FluidObject | undefined): v useProvider(unknown); useLoadable(unknown); } + +const foo: IFluidObject = getUnknownFluidObject(); +foo.IFluidRouter.; From 05aec76447151362784739e8bc69ff9054c0b39d Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 16:46:19 -0800 Subject: [PATCH 09/16] revert test change --- common/lib/core-interfaces/test-d/index.test-d.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/common/lib/core-interfaces/test-d/index.test-d.ts b/common/lib/core-interfaces/test-d/index.test-d.ts index b79ef1766b27..3c20bf645ffe 100644 --- a/common/lib/core-interfaces/test-d/index.test-d.ts +++ b/common/lib/core-interfaces/test-d/index.test-d.ts @@ -86,6 +86,3 @@ declare function useLoadable(params: FluidObject | undefined): v useProvider(unknown); useLoadable(unknown); } - -const foo: IFluidObject = getUnknownFluidObject(); -foo.IFluidRouter.; From 4b55cafcb6175e45ac609398c8120ae8273a2d7b Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 17:28:05 -0800 Subject: [PATCH 10/16] add back compat test --- .../core-interfaces/test-d/index.test-d.ts | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/common/lib/core-interfaces/test-d/index.test-d.ts b/common/lib/core-interfaces/test-d/index.test-d.ts index 3c20bf645ffe..d3c7c2f61932 100644 --- a/common/lib/core-interfaces/test-d/index.test-d.ts +++ b/common/lib/core-interfaces/test-d/index.test-d.ts @@ -8,9 +8,9 @@ import {expectError} from "tsd"; import { IFluidLoadable, IProvideFluidLoadable, FluidObject, FluidObjectKeys, IFluidObject } from "../dist"; -declare function getUnknownFluidObject(): FluidObject; +declare function getFluidObject(): FluidObject; -declare function useUnknownFluidObject(params: FluidObject | undefined): void; +declare function useFluidObject(params: FluidObject | undefined): void; declare function useProvider(params: FluidObject | undefined): void; @@ -20,9 +20,9 @@ declare function useLoadable(params: FluidObject | undefined): v // test implicit conversions between FluidObject and a FluidObject with a provides interface { - const provider: FluidObject = getUnknownFluidObject(); - useUnknownFluidObject(provider); - useUnknownFluidObject(provider.IFluidLoadable); + const provider: FluidObject = getFluidObject(); + useFluidObject(provider); + useFluidObject(provider.IFluidLoadable); useProvider(provider); useProvider(provider.IFluidLoadable); useLoadable(provider); @@ -30,7 +30,7 @@ declare function useLoadable(params: FluidObject | undefined): v expectError(provider.handle); provider.IFluidLoadable?.handle; const unknown: FluidObject | undefined = provider.IFluidLoadable; - useUnknownFluidObject(unknown); + useFluidObject(unknown); useProvider(unknown); useProvider(unknown); useLoadable(unknown); @@ -38,9 +38,9 @@ declare function useLoadable(params: FluidObject | undefined): v // test implicit conversions between FluidObject and a FluidObject with a implementation interface { - const foo: FluidObject = getUnknownFluidObject(); - useUnknownFluidObject(foo); - useUnknownFluidObject(foo.IFluidLoadable); + const foo: FluidObject = getFluidObject(); + useFluidObject(foo); + useFluidObject(foo.IFluidLoadable); useProvider(foo); useProvider(foo.IFluidLoadable); useLoadable(foo); @@ -48,7 +48,7 @@ declare function useLoadable(params: FluidObject | undefined): v expectError(foo.handle); foo.IFluidLoadable?.handle; const unknown: FluidObject | undefined = foo.IFluidLoadable; - useUnknownFluidObject(unknown); + useFluidObject(unknown); useProvider(unknown); useProvider(unknown); useLoadable(unknown); @@ -72,17 +72,32 @@ declare function useLoadable(params: FluidObject | undefined): v doFoo(); } - const foo: FluidObject = getUnknownFluidObject(); - useUnknownFluidObject(foo); - useUnknownFluidObject(foo.IFoo); + const foo: FluidObject = getFluidObject(); + useFluidObject(foo); + useFluidObject(foo.IFoo); useProvider(foo); useProvider(foo.IFoo); foo.IFoo?.doFoo(); const fooKey: keyof IFoo = "doFoo"; expectError(useProviderKey(fooKey)); const unknown: FluidObject | undefined = foo.IFoo; - useUnknownFluidObject(unknown); + useFluidObject(unknown); useProvider(unknown); useProvider(unknown); useLoadable(unknown); } + +// test implicit conversions between FluidObject and IFluidObject for backcompat +declare function getIFluidObject(): IFluidObject; +{ + const fluidObject: FluidObject = getIFluidObject(); + const legacy: IFluidObject = getFluidObject(); + useLoadable(fluidObject) + useLoadable(legacy) + useFluidObject(fluidObject); + useFluidObject(legacy); + useProvider(legacy); + useProvider(fluidObject); + useProvider(legacy); + useProvider(fluidObject); +} From 9ae4cd48df44e3d55b32bb1169dae7ef27c064a8 Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 17:34:07 -0800 Subject: [PATCH 11/16] make readonly --- common/lib/core-interfaces/src/fluidObject.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/common/lib/core-interfaces/src/fluidObject.ts b/common/lib/core-interfaces/src/fluidObject.ts index d957d20be09e..63eac1bdfaf1 100644 --- a/common/lib/core-interfaces/src/fluidObject.ts +++ b/common/lib/core-interfaces/src/fluidObject.ts @@ -20,29 +20,29 @@ export interface IFluidObject { /** * @deprecated - use `FluidObject` instead */ - IFluidLoadable?: IFluidLoadable; + readonly IFluidLoadable?: IFluidLoadable; /** * @deprecated - use `FluidObject` instead */ - IFluidRunnable?: IFluidRunnable + readonly IFluidRunnable?: IFluidRunnable /** * @deprecated - use `FluidObject` instead */ - IFluidRouter?: IFluidRouter; + readonly IFluidRouter?: IFluidRouter; /** * @deprecated - use `FluidObject` instead */ - IFluidHandleContext?: IFluidHandleContext; + readonly IFluidHandleContext?: IFluidHandleContext; /** * @deprecated - use `FluidObject` instead */ - IFluidConfiguration?: IFluidConfiguration; + readonly IFluidConfiguration?: IFluidConfiguration; /** * @deprecated - use `FluidObject` instead */ - IFluidHandle?: IFluidHandle; + readonly IFluidHandle?: IFluidHandle; /** * @deprecated - use `FluidObject` instead */ - IFluidSerializer?: IFluidSerializer; + readonly IFluidSerializer?: IFluidSerializer; } From e86dd6eab57643e320107f2f5ff264043ab381ae Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Tue, 9 Nov 2021 17:44:47 -0800 Subject: [PATCH 12/16] exclude undfined --- .../api-report/core-interfaces.api.md | 16 ++++++++-------- common/lib/core-interfaces/src/provider.ts | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/common/lib/core-interfaces/api-report/core-interfaces.api.md b/common/lib/core-interfaces/api-report/core-interfaces.api.md index 7353a75c0309..c9fd14364403 100644 --- a/common/lib/core-interfaces/api-report/core-interfaces.api.md +++ b/common/lib/core-interfaces/api-report/core-interfaces.api.md @@ -15,7 +15,7 @@ export type FluidObjectKeys = keyof FluidObject; // Warning: (ae-internal-missing-underscore) The name "FluidObjectProviderKeys" should be prefixed with an underscore because the declaration is marked as @internal // // @internal -export type FluidObjectProviderKeys = string extends TProp ? never : number extends TProp ? never : TProp extends keyof T[TProp] ? TProp : never; +export type FluidObjectProviderKeys = string extends TProp ? never : number extends TProp ? never : TProp extends keyof Exclude ? TProp : never; // @public export interface IFluidCodeDetails { @@ -85,19 +85,19 @@ export interface IFluidLoadable extends IProvideFluidLoadable { // @public @deprecated (undocumented) export interface IFluidObject { // @deprecated (undocumented) - IFluidConfiguration?: IFluidConfiguration; + readonly IFluidConfiguration?: IFluidConfiguration; // @deprecated (undocumented) - IFluidHandle?: IFluidHandle; + readonly IFluidHandle?: IFluidHandle; // @deprecated (undocumented) - IFluidHandleContext?: IFluidHandleContext; + readonly IFluidHandleContext?: IFluidHandleContext; // @deprecated (undocumented) - IFluidLoadable?: IFluidLoadable; + readonly IFluidLoadable?: IFluidLoadable; // @deprecated (undocumented) - IFluidRouter?: IFluidRouter; + readonly IFluidRouter?: IFluidRouter; // @deprecated (undocumented) - IFluidRunnable?: IFluidRunnable; + readonly IFluidRunnable?: IFluidRunnable; // @deprecated (undocumented) - IFluidSerializer?: IFluidSerializer; + readonly IFluidSerializer?: IFluidSerializer; } // @public diff --git a/common/lib/core-interfaces/src/provider.ts b/common/lib/core-interfaces/src/provider.ts index fce1a7e528fe..74c12586004e 100644 --- a/common/lib/core-interfaces/src/provider.ts +++ b/common/lib/core-interfaces/src/provider.ts @@ -24,7 +24,7 @@ */ export type FluidObjectProviderKeys = string extends TProp ? never : number extends TProp? never : // exclude indexers [key:string |number]: any - TProp extends keyof T[TProp] // TProp is a property of T, and T[TProp] + TProp extends keyof Exclude // TProp is a property of T, and T[TProp] ? TProp :never; From 635ea0080ffa884e37030080308e6eae90eb0ab0 Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Mon, 15 Nov 2021 09:29:49 -0800 Subject: [PATCH 13/16] Update common/lib/core-interfaces/src/provider.ts Co-authored-by: Mark Fields --- common/lib/core-interfaces/src/provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lib/core-interfaces/src/provider.ts b/common/lib/core-interfaces/src/provider.ts index 74c12586004e..fdead2f187d2 100644 --- a/common/lib/core-interfaces/src/provider.ts +++ b/common/lib/core-interfaces/src/provider.ts @@ -52,7 +52,7 @@ * * Either IFoo or IProvideFoo are valid generic arguments. In both case * maybeFoo will be of type `{IFoo?: IFoo}`. If IFoo is not undefined, - * then the FluidObject implements IFoo, and it can be used. + * then the FluidObject provides IFoo, and it can be used. * * You can inspect multiple types via a intersection. For example: * `FluidObject` From 6e5a492c24029c25c9ee959a5c7fced5cb53e8ff Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Mon, 15 Nov 2021 09:31:34 -0800 Subject: [PATCH 14/16] Update common/lib/core-interfaces/src/provider.ts Co-authored-by: Mark Fields --- common/lib/core-interfaces/src/provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lib/core-interfaces/src/provider.ts b/common/lib/core-interfaces/src/provider.ts index fdead2f187d2..701445ee3dbb 100644 --- a/common/lib/core-interfaces/src/provider.ts +++ b/common/lib/core-interfaces/src/provider.ts @@ -64,7 +64,7 @@ * This utility type creates a type that is the union of all keys on the generic type * which implement the FluidObject pattern. @see FluidObject * - * For example `FluidObjectKeys` would result in `"IFoo" | "IBar"` + * For example `FluidObjectKeys` would result in `"IFoo" | "IBar"` * */ export type FluidObjectKeys = keyof FluidObject; From 41ed629215d68e207337bbb56304061d7feee15c Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Mon, 15 Nov 2021 09:35:13 -0800 Subject: [PATCH 15/16] update a couple comments --- common/lib/core-interfaces/src/provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/lib/core-interfaces/src/provider.ts b/common/lib/core-interfaces/src/provider.ts index fdead2f187d2..60d69ccf0d31 100644 --- a/common/lib/core-interfaces/src/provider.ts +++ b/common/lib/core-interfaces/src/provider.ts @@ -34,7 +34,7 @@ * * It is meant to be used with types that are known to implement the FluidObject pattern. * A common way to specify a type implements the FluidObject pattern is to expose it as a - * Provider without a generic argument. + * FluidObject without a generic argument. * * For example, if we have an interface like below * ``` @@ -64,7 +64,7 @@ * This utility type creates a type that is the union of all keys on the generic type * which implement the FluidObject pattern. @see FluidObject * - * For example `FluidObjectKeys` would result in `"IFoo" | "IBar"` + * For example `FluidObjectKeys` would result in `"IFoo" | "IBar"` * */ export type FluidObjectKeys = keyof FluidObject; From 6e8791b0d94f0f24819f790518b3f54ae12dffa2 Mon Sep 17 00:00:00 2001 From: Tony Murphy Date: Mon, 15 Nov 2021 09:41:22 -0800 Subject: [PATCH 16/16] Update common/lib/core-interfaces/src/provider.ts Co-authored-by: Mark Fields --- common/lib/core-interfaces/src/provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lib/core-interfaces/src/provider.ts b/common/lib/core-interfaces/src/provider.ts index 60d69ccf0d31..03e4e81b3414 100644 --- a/common/lib/core-interfaces/src/provider.ts +++ b/common/lib/core-interfaces/src/provider.ts @@ -48,7 +48,7 @@ * * and a function that returns a FluidObject. You would do the following * - * `const maybeFoo : Provider = getFluidObject()`; + * `const maybeFoo: FluidObject = getFluidObject()`; * * Either IFoo or IProvideFoo are valid generic arguments. In both case * maybeFoo will be of type `{IFoo?: IFoo}`. If IFoo is not undefined,