From 897986c73be6572d4c5737d49c635dd93d33d2c2 Mon Sep 17 00:00:00 2001 From: Kobi Nemni Date: Wed, 24 Feb 2021 23:53:45 +0200 Subject: [PATCH] feat(multi selector): implement multi selector support --- src_types/pages/$w.d.ts | 37 ++++++++++++++----- .../pages-$w-dynamic-nicknames/dynamic.js | 4 ++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src_types/pages/$w.d.ts b/src_types/pages/$w.d.ts index 489c756f..4ccbf175 100644 --- a/src_types/pages/$w.d.ts +++ b/src_types/pages/$w.d.ts @@ -1,18 +1,37 @@ // the first part of this file is being generated by => scripts/selector-declaration-builder.js // Run `npm run generate-dts` to generate it -declare type IntersectionArrayAndBase = { +type IntersectionArrayAndBase = { [K in keyof T]: K extends P ? T[K] : T[K] & T[K][]; }; +type CommaChar = "," +type LegalChars = CommaChar | " " | "\n" | "\t" +type WixElements = PageElementsMap & IntersectionArrayAndBase; +type NicknameSelector = keyof PageElementsMap +type TypeSelector = keyof IntersectionArrayAndBase -declare type IsWixElementSelector = S extends keyof WixElementSelector ? WixElementSelector[S] : never; -declare type WixElementSelector = PageElementsMap & IntersectionArrayAndBase; +type WixElementSelector = NicknameSelector | TypeSelector +type VaildSelectorsChars = WixElementSelector | LegalChars +type OnlyVaildSelectorsChars = + S extends "" + ? any + : S extends `${VaildSelectorsChars}${infer Tail}` + ? OnlyVaildSelectorsChars + : never + +type HasComma = + S extends `${CommaChar}${infer Tail}` + ? unknown + : S extends `${VaildSelectorsChars}${infer Tail2}` + ? HasCommaRec2 + : never +type MultiSelector = S & OnlyVaildSelectorsChars & HasComma /** * Selects and returns elements from a page. */ -declare function $w(selector: T | S & IsWixElementSelector): - S extends keyof WixElementSelector - ? WixElementSelector[S] +declare function $w(selector: T | MultiSelector): + S extends keyof WixElements + ? WixElements[S] : any /** * The `$w` namespace contains everything you need in order to work @@ -32,9 +51,9 @@ declare namespace $w { /** * Selects and returns elements from a page. */ - type $w = (selector: T | S & IsWixElementSelector) => - S extends keyof WixElementSelector - ? WixElementSelector[S] + type $w = (selector: T | MultiSelector) => + S extends keyof WixElements + ? WixElements[S] : any } diff --git a/test/it/code-samples/positive/pages-$w-dynamic-nicknames/dynamic.js b/test/it/code-samples/positive/pages-$w-dynamic-nicknames/dynamic.js index eb568f62..bf505df6 100644 --- a/test/it/code-samples/positive/pages-$w-dynamic-nicknames/dynamic.js +++ b/test/it/code-samples/positive/pages-$w-dynamic-nicknames/dynamic.js @@ -21,6 +21,10 @@ $w.onReady(function() { $w("#text1").text = lastClicked $w("#text2").text = previousPageURL + $w("Button").hide() + $w("Button").forEach(b => b.show()) + $w("Button, Text").anyProperty() + $w("#button1, Text, Document").anyProperty2 });