diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 707b806445e..98653ec03a1 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -33,8 +33,6 @@ jobs: - run: yarn check-format js-dist-current: - # always skip check for now - building is too inefficient and large for CI - if: false runs-on: ubuntu-latest steps: - uses: actions/checkout@master diff --git a/package.json b/package.json index aab44d69931..be00d62100f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "workspaces": [ - "src/**/assets" + "src/*/assets" ], "scripts": { "build": "yarn rollup -c", @@ -16,9 +16,9 @@ "@babel/preset-env": "^7.15.8", "@babel/preset-react": "^7.15.8", "@babel/preset-typescript": "^7.15.8", - "@rollup/plugin-commonjs": "^22.0.0", - "@rollup/plugin-node-resolve": "^13.0.6", - "@rollup/plugin-typescript": "^8.3.0", + "@rollup/plugin-commonjs": "^23.0.0", + "@rollup/plugin-node-resolve": "^15.0.0", + "@rollup/plugin-typescript": "^10.0.0", "@symfony/stimulus-testing": "^2.0.1", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", @@ -27,9 +27,8 @@ "eslint-config-prettier": "^8.0.0", "eslint-plugin-jest": "^25.2.2", "jest": "^27.3.1", - "pkg-up": "^3.1.0", "prettier": "^2.2.1", - "rollup": "^2.68.0", + "rollup": "^3.7.0", "tslib": "^2.3.1", "typescript": "^4.4.4" }, diff --git a/rollup.config.js b/rollup.config.js index b930b6505ac..76a02e862db 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,9 +1,9 @@ -import resolve from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; -import typescript from '@rollup/plugin-typescript'; -import glob from 'glob'; -import path from 'path'; -import pkgUp from 'pkg-up'; +const resolve = require('@rollup/plugin-node-resolve'); +const commonjs = require('@rollup/plugin-commonjs'); +const typescript = require('@rollup/plugin-typescript'); +const fs = require('fs'); +const glob = require('glob'); +const path = require('path'); /** * Guarantees that any files imported from a peer dependency are treated as an external. @@ -38,10 +38,34 @@ const wildcardExternalsPlugin = (peerDependencies) => ({ } }); +/** + * Moves the generated TypeScript declaration files to the correct location. + * + * This could probably be configured in the TypeScript plugin. + */ +const moveTypescriptDeclarationsPlugin = (packagePath) => ({ + name: 'move-ts-declarations', + writeBundle: async () => { + const files = glob.sync(path.join(packagePath, 'dist', '*', 'assets', 'src', '**/*.d.ts')); + files.forEach((file) => { + // a bit odd, but remove first 7 directories, which will leave + // only the relative path to the file + const relativePath = file.split('/').slice(7).join('/'); + + const targetFile = path.join(packagePath, 'dist', relativePath); + if (!fs.existsSync(path.dirname(targetFile))) { + fs.mkdirSync(path.dirname(targetFile), { recursive: true }); + } + fs.renameSync(file, targetFile); + }); + } +}); + const files = glob.sync('src/*/assets/src/*controller.ts'); -const packages = files.map((file) => { - const absolutePath = path.join(__dirname, file); - const packageData = require(pkgUp.sync({ cwd: absolutePath })); +module.exports = files.map((file) => { + const packageRoot = path.join(file, '..', '..'); + const packagePath = path.join(packageRoot, 'package.json'); + const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8')); const peerDependencies = [ '@hotwired/stimulus', ...(packageData.peerDependencies ? Object.keys(packageData.peerDependencies) : []) @@ -50,21 +74,28 @@ const packages = files.map((file) => { return { input: file, output: { - file: path.join(absolutePath, '..', '..', 'dist', path.basename(file, '.ts') + '.js'), + file: path.join(packageRoot, 'dist', path.basename(file, '.ts') + '.js'), format: 'esm', }, external: peerDependencies, plugins: [ resolve(), - typescript(), + typescript({ + filterRoot: packageRoot, + include: ['src/**/*.ts'], + compilerOptions: { + outDir: 'dist', + declaration: true, + emitDeclarationOnly: true, + } + }), commonjs({ namedExports: { 'react-dom/client': ['createRoot'], }, }), - wildcardExternalsPlugin(peerDependencies) + wildcardExternalsPlugin(peerDependencies), + moveTypescriptDeclarationsPlugin(packageRoot), ], }; }); - -export default packages; diff --git a/src/Autocomplete/assets/dist/controller.d.ts b/src/Autocomplete/assets/dist/controller.d.ts new file mode 100644 index 00000000000..da1dfaf89f6 --- /dev/null +++ b/src/Autocomplete/assets/dist/controller.d.ts @@ -0,0 +1,29 @@ +import { Controller } from '@hotwired/stimulus'; +import TomSelect from 'tom-select'; +export default class extends Controller { + #private; + static values: { + url: StringConstructor; + optionsAsHtml: BooleanConstructor; + noResultsFoundText: StringConstructor; + noMoreResultsText: StringConstructor; + minCharacters: NumberConstructor; + tomSelectOptions: ObjectConstructor; + preload: StringConstructor; + }; + readonly urlValue: string; + readonly optionsAsHtmlValue: boolean; + readonly noMoreResultsTextValue: string; + readonly noResultsFoundTextValue: string; + readonly minCharactersValue: number; + readonly tomSelectOptionsValue: object; + readonly hasPreloadValue: boolean; + readonly preloadValue: string; + tomSelect: TomSelect; + initialize(): void; + connect(): void; + disconnect(): void; + get selectElement(): HTMLSelectElement | null; + get formElement(): HTMLInputElement | HTMLSelectElement; + get preload(): string | boolean; +} diff --git a/src/Autocomplete/assets/dist/controller.js b/src/Autocomplete/assets/dist/controller.js index 547aa63d04d..dd0e7648147 100644 --- a/src/Autocomplete/assets/dist/controller.js +++ b/src/Autocomplete/assets/dist/controller.js @@ -22,11 +22,11 @@ function __classPrivateFieldGet(receiver, state, kind, f) { return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); } -var _instances, _getCommonConfig, _createAutocomplete, _createAutocompleteWithHtmlContents, _createAutocompleteWithRemoteData, _stripTags, _mergeObjects, _createTomSelect, _dispatchEvent; +var _default_1_instances, _default_1_getCommonConfig, _default_1_createAutocomplete, _default_1_createAutocompleteWithHtmlContents, _default_1_createAutocompleteWithRemoteData, _default_1_stripTags, _default_1_mergeObjects, _default_1_createTomSelect, _default_1_dispatchEvent; class default_1 extends Controller { constructor() { super(...arguments); - _instances.add(this); + _default_1_instances.add(this); } initialize() { this.element.setAttribute('data-live-ignore', ''); @@ -39,14 +39,14 @@ class default_1 extends Controller { } connect() { if (this.urlValue) { - this.tomSelect = __classPrivateFieldGet(this, _instances, "m", _createAutocompleteWithRemoteData).call(this, this.urlValue, this.minCharactersValue); + this.tomSelect = __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_createAutocompleteWithRemoteData).call(this, this.urlValue, this.minCharactersValue); return; } if (this.optionsAsHtmlValue) { - this.tomSelect = __classPrivateFieldGet(this, _instances, "m", _createAutocompleteWithHtmlContents).call(this); + this.tomSelect = __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_createAutocompleteWithHtmlContents).call(this); return; } - this.tomSelect = __classPrivateFieldGet(this, _instances, "m", _createAutocomplete).call(this); + this.tomSelect = __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_createAutocomplete).call(this); } disconnect() { this.tomSelect.revertSettings.innerHTML = this.element.innerHTML; @@ -77,7 +77,7 @@ class default_1 extends Controller { return this.preloadValue; } } -_instances = new WeakSet(), _getCommonConfig = function _getCommonConfig() { +_default_1_instances = new WeakSet(), _default_1_getCommonConfig = function _default_1_getCommonConfig() { const plugins = {}; const isMultiple = !this.selectElement || this.selectElement.multiple; if (!this.formElement.disabled && !isMultiple) { @@ -109,19 +109,19 @@ _instances = new WeakSet(), _getCommonConfig = function _getCommonConfig() { if (!this.selectElement && !this.urlValue) { config.shouldLoad = () => false; } - return __classPrivateFieldGet(this, _instances, "m", _mergeObjects).call(this, config, this.tomSelectOptionsValue); -}, _createAutocomplete = function _createAutocomplete() { - const config = __classPrivateFieldGet(this, _instances, "m", _mergeObjects).call(this, __classPrivateFieldGet(this, _instances, "m", _getCommonConfig).call(this), { + return __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_mergeObjects).call(this, config, this.tomSelectOptionsValue); +}, _default_1_createAutocomplete = function _default_1_createAutocomplete() { + const config = __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_mergeObjects).call(this, __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_getCommonConfig).call(this), { maxOptions: this.selectElement ? this.selectElement.options.length : 50, }); - return __classPrivateFieldGet(this, _instances, "m", _createTomSelect).call(this, config); -}, _createAutocompleteWithHtmlContents = function _createAutocompleteWithHtmlContents() { - const config = __classPrivateFieldGet(this, _instances, "m", _mergeObjects).call(this, __classPrivateFieldGet(this, _instances, "m", _getCommonConfig).call(this), { + return __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_createTomSelect).call(this, config); +}, _default_1_createAutocompleteWithHtmlContents = function _default_1_createAutocompleteWithHtmlContents() { + const config = __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_mergeObjects).call(this, __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_getCommonConfig).call(this), { maxOptions: this.selectElement ? this.selectElement.options.length : 50, score: (search) => { const scoringFunction = this.tomSelect.getScoreFunction(search); return (item) => { - return scoringFunction(Object.assign(Object.assign({}, item), { text: __classPrivateFieldGet(this, _instances, "m", _stripTags).call(this, item.text) })); + return scoringFunction(Object.assign(Object.assign({}, item), { text: __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_stripTags).call(this, item.text) })); }; }, render: { @@ -133,9 +133,9 @@ _instances = new WeakSet(), _getCommonConfig = function _getCommonConfig() { }, }, }); - return __classPrivateFieldGet(this, _instances, "m", _createTomSelect).call(this, config); -}, _createAutocompleteWithRemoteData = function _createAutocompleteWithRemoteData(autocompleteEndpointUrl, minCharacterLength) { - const config = __classPrivateFieldGet(this, _instances, "m", _mergeObjects).call(this, __classPrivateFieldGet(this, _instances, "m", _getCommonConfig).call(this), { + return __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_createTomSelect).call(this, config); +}, _default_1_createAutocompleteWithRemoteData = function _default_1_createAutocompleteWithRemoteData(autocompleteEndpointUrl, minCharacterLength) { + const config = __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_mergeObjects).call(this, __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_getCommonConfig).call(this), { firstUrl: (query) => { const separator = autocompleteEndpointUrl.includes('?') ? '&' : '?'; return `${autocompleteEndpointUrl}${separator}query=${encodeURIComponent(query)}`; @@ -175,17 +175,17 @@ _instances = new WeakSet(), _getCommonConfig = function _getCommonConfig() { }, preload: this.preload, }); - return __classPrivateFieldGet(this, _instances, "m", _createTomSelect).call(this, config); -}, _stripTags = function _stripTags(string) { + return __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_createTomSelect).call(this, config); +}, _default_1_stripTags = function _default_1_stripTags(string) { return string.replace(/(<([^>]+)>)/gi, ''); -}, _mergeObjects = function _mergeObjects(object1, object2) { +}, _default_1_mergeObjects = function _default_1_mergeObjects(object1, object2) { return Object.assign(Object.assign({}, object1), object2); -}, _createTomSelect = function _createTomSelect(options) { - __classPrivateFieldGet(this, _instances, "m", _dispatchEvent).call(this, 'autocomplete:pre-connect', { options }); +}, _default_1_createTomSelect = function _default_1_createTomSelect(options) { + __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_dispatchEvent).call(this, 'autocomplete:pre-connect', { options }); const tomSelect = new TomSelect(this.formElement, options); - __classPrivateFieldGet(this, _instances, "m", _dispatchEvent).call(this, 'autocomplete:connect', { tomSelect, options }); + __classPrivateFieldGet(this, _default_1_instances, "m", _default_1_dispatchEvent).call(this, 'autocomplete:connect', { tomSelect, options }); return tomSelect; -}, _dispatchEvent = function _dispatchEvent(name, payload) { +}, _default_1_dispatchEvent = function _default_1_dispatchEvent(name, payload) { this.element.dispatchEvent(new CustomEvent(name, { detail: payload, bubbles: true })); }; default_1.values = { diff --git a/src/Autocomplete/assets/package.json b/src/Autocomplete/assets/package.json index d47facf1cc6..e6dac6b3f7b 100644 --- a/src/Autocomplete/assets/package.json +++ b/src/Autocomplete/assets/package.json @@ -2,7 +2,7 @@ "name": "@symfony/ux-autocomplete", "description": "JavaScript-powered autocompletion functionality for forms.", "main": "dist/controller.js", - "module": "dist/controller.js", + "types": "dist/controller.d.ts", "version": "1.0.0", "license": "MIT", "symfony": { diff --git a/src/Chartjs/assets/dist/controller.d.ts b/src/Chartjs/assets/dist/controller.d.ts new file mode 100644 index 00000000000..7d2f236a1bb --- /dev/null +++ b/src/Chartjs/assets/dist/controller.d.ts @@ -0,0 +1,9 @@ +import { Controller } from '@hotwired/stimulus'; +export default class extends Controller { + readonly viewValue: any; + static values: { + view: ObjectConstructor; + }; + connect(): void; + _dispatchEvent(name: string, payload: any): void; +} diff --git a/src/Chartjs/assets/package.json b/src/Chartjs/assets/package.json index 16b17dd5cf6..c278b0f5b0f 100644 --- a/src/Chartjs/assets/package.json +++ b/src/Chartjs/assets/package.json @@ -3,6 +3,8 @@ "description": "Chart.js integration for Symfony", "license": "MIT", "version": "1.1.0", + "main": "dist/controller.js", + "types": "dist/controller.d.ts", "symfony": { "controllers": { "chart": { diff --git a/src/Cropperjs/assets/dist/controller.d.ts b/src/Cropperjs/assets/dist/controller.d.ts new file mode 100644 index 00000000000..9e27c57bcd1 --- /dev/null +++ b/src/Cropperjs/assets/dist/controller.d.ts @@ -0,0 +1,11 @@ +import { Controller } from '@hotwired/stimulus'; +export default class CropperController extends Controller { + readonly publicUrlValue: string; + readonly optionsValue: object; + static values: { + publicUrl: StringConstructor; + options: ObjectConstructor; + }; + connect(): void; + _dispatchEvent(name: string, payload: any): void; +} diff --git a/src/Cropperjs/assets/package.json b/src/Cropperjs/assets/package.json index bb78fe35c7d..ea7372e20e4 100644 --- a/src/Cropperjs/assets/package.json +++ b/src/Cropperjs/assets/package.json @@ -3,6 +3,8 @@ "description": "Cropper.js integration for Symfony", "license": "MIT", "version": "1.1.0", + "main": "dist/controller.js", + "types": "dist/controller.d.ts", "symfony": { "controllers": { "cropper": { diff --git a/src/Dropzone/assets/dist/controller.d.ts b/src/Dropzone/assets/dist/controller.d.ts new file mode 100644 index 00000000000..92c4d0b5b9d --- /dev/null +++ b/src/Dropzone/assets/dist/controller.d.ts @@ -0,0 +1,15 @@ +import { Controller } from '@hotwired/stimulus'; +export default class extends Controller { + readonly inputTarget: HTMLInputElement; + readonly placeholderTarget: HTMLDivElement; + readonly previewTarget: HTMLDivElement; + readonly previewClearButtonTarget: HTMLButtonElement; + readonly previewFilenameTarget: HTMLDivElement; + readonly previewImageTarget: HTMLDivElement; + static targets: string[]; + connect(): void; + clear(): void; + onInputChange(event: any): void; + _populateImagePreview(file: Blob): void; + _dispatchEvent(name: string, payload?: any): void; +} diff --git a/src/Dropzone/assets/package.json b/src/Dropzone/assets/package.json index 8087ae90540..19d7fe86179 100644 --- a/src/Dropzone/assets/package.json +++ b/src/Dropzone/assets/package.json @@ -3,6 +3,8 @@ "description": "File input dropzones for Symfony Forms", "license": "MIT", "version": "1.1.0", + "main": "dist/controller.js", + "types": "dist/controller.d.ts", "symfony": { "controllers": { "dropzone": { diff --git a/src/LazyImage/assets/dist/controller.d.ts b/src/LazyImage/assets/dist/controller.d.ts new file mode 100644 index 00000000000..5560d8e263a --- /dev/null +++ b/src/LazyImage/assets/dist/controller.d.ts @@ -0,0 +1,13 @@ +import { Controller } from '@hotwired/stimulus'; +export default class extends Controller { + readonly srcValue: string; + readonly srcsetValue: any; + readonly hasSrcsetValue: boolean; + static values: { + src: StringConstructor; + srcset: ObjectConstructor; + }; + connect(): void; + _calculateSrcsetString(): string; + _dispatchEvent(name: string, payload: any): void; +} diff --git a/src/LazyImage/assets/package.json b/src/LazyImage/assets/package.json index 7114810473a..1a358993d9d 100644 --- a/src/LazyImage/assets/package.json +++ b/src/LazyImage/assets/package.json @@ -3,6 +3,8 @@ "description": "Lazy image loader and utilities for Symfony", "license": "MIT", "version": "1.1.0", + "main": "dist/controller.js", + "types": "dist/controller.d.ts", "symfony": { "controllers": { "lazy-image": { diff --git a/src/LiveComponent/assets/dist/Backend.d.ts b/src/LiveComponent/assets/dist/Backend.d.ts new file mode 100644 index 00000000000..3c8fbca85b7 --- /dev/null +++ b/src/LiveComponent/assets/dist/Backend.d.ts @@ -0,0 +1,15 @@ +import BackendRequest from './BackendRequest'; +export interface BackendInterface { + makeRequest(data: any, actions: BackendAction[], updatedModels: string[], childrenFingerprints: any): BackendRequest; +} +export interface BackendAction { + name: string; + args: Record; +} +export default class implements BackendInterface { + private url; + private readonly csrfToken; + constructor(url: string, csrfToken?: string | null); + makeRequest(data: any, actions: BackendAction[], updatedModels: string[], childrenFingerprints: any): BackendRequest; + private willDataFitInUrl; +} diff --git a/src/LiveComponent/assets/dist/BackendRequest.d.ts b/src/LiveComponent/assets/dist/BackendRequest.d.ts new file mode 100644 index 00000000000..9aa7aba20c0 --- /dev/null +++ b/src/LiveComponent/assets/dist/BackendRequest.d.ts @@ -0,0 +1,9 @@ +export default class { + promise: Promise; + actions: string[]; + updatedModels: string[]; + isResolved: boolean; + constructor(promise: Promise, actions: string[], updateModels: string[]); + containsOneOfActions(targetedActions: string[]): boolean; + areAnyModelsUpdated(targetedModels: string[]): boolean; +} diff --git a/src/LiveComponent/assets/dist/BackendResponse.d.ts b/src/LiveComponent/assets/dist/BackendResponse.d.ts new file mode 100644 index 00000000000..a51a6448707 --- /dev/null +++ b/src/LiveComponent/assets/dist/BackendResponse.d.ts @@ -0,0 +1,6 @@ +export default class { + response: Response; + private body; + constructor(response: Response); + getBody(): Promise; +} diff --git a/src/LiveComponent/assets/dist/Component/ElementDriver.d.ts b/src/LiveComponent/assets/dist/Component/ElementDriver.d.ts new file mode 100644 index 00000000000..bc2b755e3db --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/ElementDriver.d.ts @@ -0,0 +1,14 @@ +export interface ElementDriver { + getModelName(element: HTMLElement): string | null; + getComponentData(rootElement: HTMLElement): any; + getComponentProps(rootElement: HTMLElement): any; + findChildComponentElement(id: string, element: HTMLElement): HTMLElement | null; + getKeyFromElement(element: HTMLElement): string | null; +} +export declare class StandardElementDriver implements ElementDriver { + getModelName(element: HTMLElement): string | null; + getComponentData(rootElement: HTMLElement): any; + getComponentProps(rootElement: HTMLElement): any; + findChildComponentElement(id: string, element: HTMLElement): HTMLElement | null; + getKeyFromElement(element: HTMLElement): string | null; +} diff --git a/src/LiveComponent/assets/dist/Component/UnsyncedInputsTracker.d.ts b/src/LiveComponent/assets/dist/Component/UnsyncedInputsTracker.d.ts new file mode 100644 index 00000000000..3683e98d8ad --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/UnsyncedInputsTracker.d.ts @@ -0,0 +1,28 @@ +import { ElementDriver } from './ElementDriver'; +import Component from './index'; +export default class { + private readonly component; + private readonly modelElementResolver; + private readonly unsyncedInputs; + private elementEventListeners; + constructor(component: Component, modelElementResolver: ElementDriver); + activate(): void; + deactivate(): void; + markModelAsSynced(modelName: string): void; + private handleInputEvent; + private updateModelFromElement; + getUnsyncedInputs(): HTMLElement[]; + getUnsyncedModels(): string[]; + resetUnsyncedFields(): void; +} +export declare class UnsyncedInputContainer { + private unsyncedModelFields; + private unsyncedNonModelFields; + private unsyncedModelNames; + constructor(); + add(element: HTMLElement, modelName?: string | null): void; + resetUnsyncedFields(): void; + allUnsyncedInputs(): HTMLElement[]; + markModelAsSynced(modelName: string): void; + getUnsyncedModelNames(): string[]; +} diff --git a/src/LiveComponent/assets/dist/Component/ValueStore.d.ts b/src/LiveComponent/assets/dist/Component/ValueStore.d.ts new file mode 100644 index 00000000000..79841ba7f21 --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/ValueStore.d.ts @@ -0,0 +1,12 @@ +export default class { + updatedModels: string[]; + private props; + private data; + constructor(props: any, data: any); + get(name: string): any; + has(name: string): boolean; + set(name: string, value: any): boolean; + all(): any; + reinitializeData(data: any): void; + reinitializeProps(props: any): boolean; +} diff --git a/src/LiveComponent/assets/dist/Component/index.d.ts b/src/LiveComponent/assets/dist/Component/index.d.ts new file mode 100644 index 00000000000..522718769f4 --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/index.d.ts @@ -0,0 +1,52 @@ +import { BackendInterface } from '../Backend'; +import ValueStore from './ValueStore'; +import { ElementDriver } from './ElementDriver'; +import { PluginInterface } from './plugins/PluginInterface'; +import BackendResponse from '../BackendResponse'; +import { ModelBinding } from '../Directive/get_model_binding'; +export default class Component { + readonly element: HTMLElement; + private readonly backend; + private readonly elementDriver; + id: string | null; + fingerprint: string | null; + readonly valueStore: ValueStore; + private readonly unsyncedInputsTracker; + private hooks; + defaultDebounce: number; + private backendRequest; + private pendingActions; + private isRequestPending; + private requestDebounceTimeout; + private nextRequestPromise; + private nextRequestPromiseResolve; + private children; + private parent; + constructor(element: HTMLElement, props: any, data: any, fingerprint: string | null, id: string | null, backend: BackendInterface, elementDriver: ElementDriver); + addPlugin(plugin: PluginInterface): void; + connect(): void; + disconnect(): void; + on(hookName: string, callback: (...args: any[]) => void): void; + off(hookName: string, callback: (...args: any[]) => void): void; + set(model: string, value: any, reRender?: boolean, debounce?: number | boolean): Promise; + getData(model: string): any; + action(name: string, args?: any, debounce?: number | boolean): Promise; + render(): Promise; + getUnsyncedModels(): string[]; + addChild(child: Component, modelBindings?: ModelBinding[]): void; + removeChild(child: Component): void; + getParent(): Component | null; + getChildren(): Map; + updateFromNewElement(toEl: HTMLElement): boolean; + onChildComponentModelUpdate(modelName: string, value: any, childComponent: Component): void; + private tryStartingRequest; + private performRequest; + private processRerender; + private calculateDebounce; + private clearRequestDebounceTimeout; + private debouncedStartRequest; + private renderError; + private getChildrenFingerprints; + private resetPromise; +} +export declare function proxifyComponent(component: Component): Component; diff --git a/src/LiveComponent/assets/dist/Component/plugins/LoadingPlugin.d.ts b/src/LiveComponent/assets/dist/Component/plugins/LoadingPlugin.d.ts new file mode 100644 index 00000000000..94c1f691aff --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/plugins/LoadingPlugin.d.ts @@ -0,0 +1,23 @@ +import { Directive } from '../../Directive/directives_parser'; +import BackendRequest from '../../BackendRequest'; +import Component from '../../Component'; +import { PluginInterface } from './PluginInterface'; +interface ElementLoadingDirectives { + element: HTMLElement | SVGElement; + directives: Directive[]; +} +export default class implements PluginInterface { + attachToComponent(component: Component): void; + startLoading(targetElement: HTMLElement | SVGElement, backendRequest: BackendRequest): void; + finishLoading(targetElement: HTMLElement | SVGElement): void; + private handleLoadingToggle; + private handleLoadingDirective; + getLoadingDirectives(element: HTMLElement | SVGElement): ElementLoadingDirectives[]; + private showElement; + private hideElement; + private addClass; + private removeClass; + private addAttributes; + private removeAttributes; +} +export {}; diff --git a/src/LiveComponent/assets/dist/Component/plugins/PageUnloadingPlugin.d.ts b/src/LiveComponent/assets/dist/Component/plugins/PageUnloadingPlugin.d.ts new file mode 100644 index 00000000000..5b03662bb62 --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/plugins/PageUnloadingPlugin.d.ts @@ -0,0 +1,6 @@ +import Component from '../index'; +import { PluginInterface } from './PluginInterface'; +export default class implements PluginInterface { + private isConnected; + attachToComponent(component: Component): void; +} diff --git a/src/LiveComponent/assets/dist/Component/plugins/PluginInterface.d.ts b/src/LiveComponent/assets/dist/Component/plugins/PluginInterface.d.ts new file mode 100644 index 00000000000..cbb54497ee5 --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/plugins/PluginInterface.d.ts @@ -0,0 +1,4 @@ +import Component from '../index'; +export interface PluginInterface { + attachToComponent(component: Component): void; +} diff --git a/src/LiveComponent/assets/dist/Component/plugins/PollingPlugin.d.ts b/src/LiveComponent/assets/dist/Component/plugins/PollingPlugin.d.ts new file mode 100644 index 00000000000..988d1f556ab --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/plugins/PollingPlugin.d.ts @@ -0,0 +1,10 @@ +import Component from '../index'; +import { PluginInterface } from './PluginInterface'; +export default class implements PluginInterface { + private element; + private pollingDirector; + attachToComponent(component: Component): void; + addPoll(actionName: string, duration: number): void; + clearPolling(): void; + private initializePolling; +} diff --git a/src/LiveComponent/assets/dist/Component/plugins/SetValueOntoModelFieldsPlugin.d.ts b/src/LiveComponent/assets/dist/Component/plugins/SetValueOntoModelFieldsPlugin.d.ts new file mode 100644 index 00000000000..aab6b1f05e8 --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/plugins/SetValueOntoModelFieldsPlugin.d.ts @@ -0,0 +1,6 @@ +import Component from '../index'; +import { PluginInterface } from './PluginInterface'; +export default class implements PluginInterface { + attachToComponent(component: Component): void; + private synchronizeValueOfModelFields; +} diff --git a/src/LiveComponent/assets/dist/Component/plugins/ValidatedFieldsPlugin.d.ts b/src/LiveComponent/assets/dist/Component/plugins/ValidatedFieldsPlugin.d.ts new file mode 100644 index 00000000000..3ff0eb364d0 --- /dev/null +++ b/src/LiveComponent/assets/dist/Component/plugins/ValidatedFieldsPlugin.d.ts @@ -0,0 +1,6 @@ +import Component from '../index'; +import { PluginInterface } from './PluginInterface'; +export default class implements PluginInterface { + attachToComponent(component: Component): void; + private handleModelSet; +} diff --git a/src/LiveComponent/assets/dist/Directive/directives_parser.d.ts b/src/LiveComponent/assets/dist/Directive/directives_parser.d.ts new file mode 100644 index 00000000000..cd08322f64d --- /dev/null +++ b/src/LiveComponent/assets/dist/Directive/directives_parser.d.ts @@ -0,0 +1,14 @@ +export interface DirectiveModifier { + name: string; + value: string | null; +} +export interface Directive { + action: string; + args: string[]; + named: any; + modifiers: DirectiveModifier[]; + getString: { + (): string; + }; +} +export declare function parseDirectives(content: string | null): Directive[]; diff --git a/src/LiveComponent/assets/dist/Directive/get_model_binding.d.ts b/src/LiveComponent/assets/dist/Directive/get_model_binding.d.ts new file mode 100644 index 00000000000..ddfdbcc908b --- /dev/null +++ b/src/LiveComponent/assets/dist/Directive/get_model_binding.d.ts @@ -0,0 +1,9 @@ +import { Directive } from './directives_parser'; +export interface ModelBinding { + modelName: string; + innerModelName: string | null; + shouldRender: boolean; + debounce: number | boolean; + targetEventName: string | null; +} +export default function (modelDirective: Directive): ModelBinding; diff --git a/src/LiveComponent/assets/dist/HookManager.d.ts b/src/LiveComponent/assets/dist/HookManager.d.ts new file mode 100644 index 00000000000..5980af07296 --- /dev/null +++ b/src/LiveComponent/assets/dist/HookManager.d.ts @@ -0,0 +1,7 @@ +export default class { + private hooks; + constructor(); + register(hookName: string, callback: () => void): void; + unregister(hookName: string, callback: () => void): void; + triggerHook(hookName: string, ...args: any[]): void; +} diff --git a/src/LiveComponent/assets/dist/PollingDirector.d.ts b/src/LiveComponent/assets/dist/PollingDirector.d.ts new file mode 100644 index 00000000000..c541e0ed380 --- /dev/null +++ b/src/LiveComponent/assets/dist/PollingDirector.d.ts @@ -0,0 +1,17 @@ +/// +import Component from './Component'; +export default class { + component: Component; + isPollingActive: boolean; + polls: Array<{ + actionName: string; + duration: number; + }>; + pollingIntervals: NodeJS.Timer[]; + constructor(component: Component); + addPoll(actionName: string, duration: number): void; + startAllPolling(): void; + stopAllPolling(): void; + clearPolling(): void; + private initiatePoll; +} diff --git a/src/LiveComponent/assets/dist/data_manipulation_utils.d.ts b/src/LiveComponent/assets/dist/data_manipulation_utils.d.ts new file mode 100644 index 00000000000..fd8fa503fa5 --- /dev/null +++ b/src/LiveComponent/assets/dist/data_manipulation_utils.d.ts @@ -0,0 +1,2 @@ +export declare function getDeepData(data: any, propertyPath: string): any; +export declare function setDeepData(data: any, propertyPath: string, value: any): any; diff --git a/src/LiveComponent/assets/dist/dom_utils.d.ts b/src/LiveComponent/assets/dist/dom_utils.d.ts new file mode 100644 index 00000000000..dfa0368076a --- /dev/null +++ b/src/LiveComponent/assets/dist/dom_utils.d.ts @@ -0,0 +1,12 @@ +import ValueStore from './Component/ValueStore'; +import { Directive } from './Directive/directives_parser'; +import Component from './Component'; +export declare function getValueFromElement(element: HTMLElement, valueStore: ValueStore): string | string[] | null; +export declare function setValueOnElement(element: HTMLElement, value: any): void; +export declare function getAllModelDirectiveFromElements(element: HTMLElement): Directive[]; +export declare function getModelDirectiveFromElement(element: HTMLElement, throwOnMissing?: boolean): null | Directive; +export declare function elementBelongsToThisComponent(element: Element, component: Component): boolean; +export declare function cloneHTMLElement(element: HTMLElement): HTMLElement; +export declare function htmlToElement(html: string): HTMLElement; +export declare function cloneElementWithNewTagName(element: Element, newTag: string): HTMLElement; +export declare function getElementAsTagText(element: HTMLElement): string; diff --git a/src/LiveComponent/assets/dist/live_controller.d.ts b/src/LiveComponent/assets/dist/live_controller.d.ts new file mode 100644 index 00000000000..6ac2ee2713b --- /dev/null +++ b/src/LiveComponent/assets/dist/live_controller.d.ts @@ -0,0 +1,51 @@ +import { Controller } from '@hotwired/stimulus'; +import Component from './Component'; +export { Component }; +export interface LiveEvent extends CustomEvent { + detail: { + controller: LiveController; + component: Component; + }; +} +export interface LiveController { + element: HTMLElement; + component: Component; +} +export default class extends Controller implements LiveController { + static values: { + url: StringConstructor; + data: ObjectConstructor; + props: ObjectConstructor; + csrf: StringConstructor; + debounce: { + type: NumberConstructor; + default: number; + }; + id: StringConstructor; + fingerprint: StringConstructor; + }; + readonly urlValue: string; + readonly dataValue: any; + readonly propsValue: any; + readonly csrfValue: string; + readonly hasDebounceValue: boolean; + readonly debounceValue: number; + readonly fingerprintValue: string; + private proxiedComponent; + component: Component; + pendingActionTriggerModelElement: HTMLElement | null; + private elementEventListeners; + initialize(): void; + connect(): void; + disconnect(): void; + update(event: any): void; + action(event: any): void; + $render(): void; + $updateModel(model: string, value: any, shouldRender?: boolean, debounce?: number | boolean): void; + private handleInputEvent; + private handleChangeEvent; + private updateModelFromElementEvent; + handleConnectedControllerEvent(event: LiveEvent): void; + handleDisconnectedChildControllerEvent(event: LiveEvent): void; + _dispatchEvent(name: string, detail?: any, canBubble?: boolean, cancelable?: boolean): boolean; +} diff --git a/src/LiveComponent/assets/dist/live_controller.js b/src/LiveComponent/assets/dist/live_controller.js index bde4ab1f75f..a8f2efed5f3 100644 --- a/src/LiveComponent/assets/dist/live_controller.js +++ b/src/LiveComponent/assets/dist/live_controller.js @@ -2349,4 +2349,4 @@ default_1.values = { fingerprint: String, }; -export { default_1 as default }; +export { Component, default_1 as default }; diff --git a/src/LiveComponent/assets/dist/morphdom.d.ts b/src/LiveComponent/assets/dist/morphdom.d.ts new file mode 100644 index 00000000000..0eae5871e46 --- /dev/null +++ b/src/LiveComponent/assets/dist/morphdom.d.ts @@ -0,0 +1,2 @@ +import Component from './Component'; +export declare function executeMorphdom(rootFromElement: HTMLElement, rootToElement: HTMLElement, modifiedFieldElements: Array, getElementValue: (element: HTMLElement) => any, childComponents: Component[], findChildComponent: (id: string, element: HTMLElement) => HTMLElement | null, getKeyFromElement: (element: HTMLElement) => string | null): void; diff --git a/src/LiveComponent/assets/dist/normalize_attributes_for_comparison.d.ts b/src/LiveComponent/assets/dist/normalize_attributes_for_comparison.d.ts new file mode 100644 index 00000000000..cd7bd6b2869 --- /dev/null +++ b/src/LiveComponent/assets/dist/normalize_attributes_for_comparison.d.ts @@ -0,0 +1 @@ +export declare function normalizeAttributesForComparison(element: HTMLElement): void; diff --git a/src/LiveComponent/assets/dist/string_utils.d.ts b/src/LiveComponent/assets/dist/string_utils.d.ts new file mode 100644 index 00000000000..cf965ff2d0f --- /dev/null +++ b/src/LiveComponent/assets/dist/string_utils.d.ts @@ -0,0 +1,2 @@ +export declare function combineSpacedArray(parts: Array): string[]; +export declare function normalizeModelName(model: string): string; diff --git a/src/LiveComponent/assets/package.json b/src/LiveComponent/assets/package.json index 5b05871ccaf..5329f4f73bc 100644 --- a/src/LiveComponent/assets/package.json +++ b/src/LiveComponent/assets/package.json @@ -2,7 +2,7 @@ "name": "@symfony/ux-live-component", "description": "Live Component: bring server-side re-rendering & model binding to any element.", "main": "dist/live_controller.js", - "module": "dist/live_controller.js", + "types": "dist/live_controller.d.ts", "version": "1.0.0", "license": "MIT", "symfony": { diff --git a/src/LiveComponent/assets/src/live_controller.ts b/src/LiveComponent/assets/src/live_controller.ts index 93c9198bbd9..3cbe8cf635b 100644 --- a/src/LiveComponent/assets/src/live_controller.ts +++ b/src/LiveComponent/assets/src/live_controller.ts @@ -18,6 +18,8 @@ import SetValueOntoModelFieldsPlugin from './Component/plugins/SetValueOntoModel import { PluginInterface } from './Component/plugins/PluginInterface'; import getModelBinding from './Directive/get_model_binding'; +export { Component }; + export interface LiveEvent extends CustomEvent { detail: { controller: LiveController; diff --git a/src/Notify/assets/dist/controller.d.ts b/src/Notify/assets/dist/controller.d.ts new file mode 100644 index 00000000000..7168edde5a9 --- /dev/null +++ b/src/Notify/assets/dist/controller.d.ts @@ -0,0 +1,13 @@ +import { Controller } from '@hotwired/stimulus'; +export default class extends Controller { + static values: { + hub: StringConstructor; + topics: ArrayConstructor; + }; + eventSources: Array; + initialize(): void; + connect(): void; + disconnect(): void; + _notify(content: string | undefined): void; + _dispatchEvent(name: string, payload: any): void; +} diff --git a/src/Notify/assets/package.json b/src/Notify/assets/package.json index 0ad2768f03d..fe9df3dcb77 100644 --- a/src/Notify/assets/package.json +++ b/src/Notify/assets/package.json @@ -3,6 +3,8 @@ "description": "Native notification integration for Symfony using Mercure", "license": "MIT", "version": "1.0.0", + "main": "dist/controller.js", + "types": "dist/controller.d.ts", "symfony": { "controllers": { "notify": { diff --git a/src/React/assets/dist/register_controller.d.ts b/src/React/assets/dist/register_controller.d.ts new file mode 100644 index 00000000000..0641a13a5f1 --- /dev/null +++ b/src/React/assets/dist/register_controller.d.ts @@ -0,0 +1,11 @@ +/// +import { ComponentClass, FunctionComponent } from 'react'; +type Component = string | FunctionComponent | ComponentClass; +declare global { + function resolveReactComponent(name: string): Component; + interface Window { + resolveReactComponent(name: string): Component; + } +} +export declare function registerReactControllerComponents(context: __WebpackModuleApi.RequireContext): void; +export {}; diff --git a/src/React/assets/dist/render_controller.d.ts b/src/React/assets/dist/render_controller.d.ts new file mode 100644 index 00000000000..2c40f45a991 --- /dev/null +++ b/src/React/assets/dist/render_controller.d.ts @@ -0,0 +1,14 @@ +import { ReactElement } from 'react'; +import { Controller } from '@hotwired/stimulus'; +export default class extends Controller { + readonly componentValue?: string; + readonly propsValue?: object; + static values: { + component: StringConstructor; + props: ObjectConstructor; + }; + connect(): void; + disconnect(): void; + _renderReactElement(reactElement: ReactElement): void; + _dispatchEvent(name: string, payload: any): void; +} diff --git a/src/React/assets/package.json b/src/React/assets/package.json index 4b0b2ba510f..5ebf89f2c1b 100644 --- a/src/React/assets/package.json +++ b/src/React/assets/package.json @@ -4,6 +4,7 @@ "license": "MIT", "version": "1.0.0", "main": "dist/register_controller.js", + "types": "dist/register_controller.d.ts", "symfony": { "controllers": { "react": { diff --git a/src/Swup/assets/dist/controller.d.ts b/src/Swup/assets/dist/controller.d.ts new file mode 100644 index 00000000000..095934ea79d --- /dev/null +++ b/src/Swup/assets/dist/controller.d.ts @@ -0,0 +1,28 @@ +import { Controller } from '@hotwired/stimulus'; +export default class extends Controller { + readonly animateHistoryBrowsingValue: boolean; + readonly hasAnimateHistoryBrowsingValue: boolean; + readonly animationSelectorValue: string; + readonly hasAnimationSelectorValue: boolean; + readonly cacheValue: boolean; + readonly hasCacheValue: boolean; + readonly containersValue: string[]; + readonly mainElementValue: string; + readonly hasMainElementValue: boolean; + readonly linkSelectorValue: string; + readonly hasLinkSelectorValue: boolean; + readonly themeValue: string; + readonly debugValue: boolean; + static values: { + animateHistoryBrowsing: BooleanConstructor; + animationSelector: StringConstructor; + cache: BooleanConstructor; + containers: ArrayConstructor; + linkSelector: StringConstructor; + theme: StringConstructor; + debug: BooleanConstructor; + mainElement: StringConstructor; + }; + connect(): void; + _dispatchEvent(name: string, payload: any): void; +} diff --git a/src/Swup/assets/package.json b/src/Swup/assets/package.json index 365adc8c99e..379ffb11f0e 100644 --- a/src/Swup/assets/package.json +++ b/src/Swup/assets/package.json @@ -3,6 +3,8 @@ "description": "Swup integration for Symfony", "license": "MIT", "version": "1.1.0", + "main": "dist/controller.js", + "types": "dist/controller.d.ts", "symfony": { "controllers": { "swup": { diff --git a/src/Turbo/assets/dist/turbo_controller.d.ts b/src/Turbo/assets/dist/turbo_controller.d.ts new file mode 100644 index 00000000000..ec02cc5aba6 --- /dev/null +++ b/src/Turbo/assets/dist/turbo_controller.d.ts @@ -0,0 +1,4 @@ +import { Controller } from '@hotwired/stimulus'; +import '@hotwired/turbo'; +export default class extends Controller { +} diff --git a/src/Turbo/assets/dist/turbo_stream_controller.d.ts b/src/Turbo/assets/dist/turbo_stream_controller.d.ts new file mode 100644 index 00000000000..a86c6796863 --- /dev/null +++ b/src/Turbo/assets/dist/turbo_stream_controller.d.ts @@ -0,0 +1,16 @@ +import { Controller } from '@hotwired/stimulus'; +export default class extends Controller { + static values: { + topic: StringConstructor; + hub: StringConstructor; + }; + es: EventSource | undefined; + url: string | undefined; + readonly topicValue: string; + readonly hubValue: string; + readonly hasHubValue: boolean; + readonly hasTopicValue: boolean; + initialize(): void; + connect(): void; + disconnect(): void; +} diff --git a/src/Turbo/assets/package.json b/src/Turbo/assets/package.json index f2e65c531f2..423961ed7bb 100644 --- a/src/Turbo/assets/package.json +++ b/src/Turbo/assets/package.json @@ -4,6 +4,8 @@ "license": "MIT", "private": true, "version": "0.1.0", + "main": "dist/turbo_controller.js", + "types": "dist/turbo_controller.d.ts", "symfony": { "controllers": { "turbo-core": { diff --git a/src/Typed/assets/dist/controller.d.ts b/src/Typed/assets/dist/controller.d.ts new file mode 100644 index 00000000000..7ac7e8f77a4 --- /dev/null +++ b/src/Typed/assets/dist/controller.d.ts @@ -0,0 +1,73 @@ +import { Controller } from '@hotwired/stimulus'; +export default class extends Controller { + static values: { + strings: ArrayConstructor; + typeSpeed: { + type: NumberConstructor; + default: number; + }; + smartBackspace: { + type: BooleanConstructor; + default: boolean; + }; + startDelay: NumberConstructor; + backSpeed: NumberConstructor; + shuffle: BooleanConstructor; + backDelay: { + type: NumberConstructor; + default: number; + }; + fadeOut: BooleanConstructor; + fadeOutClass: { + type: StringConstructor; + default: string; + }; + fadeOutDelay: { + type: NumberConstructor; + default: number; + }; + loop: BooleanConstructor; + loopCount: { + type: NumberConstructor; + default: number; + }; + showCursor: { + type: BooleanConstructor; + default: boolean; + }; + cursorChar: { + type: StringConstructor; + default: string; + }; + autoInsertCss: { + type: BooleanConstructor; + default: boolean; + }; + attr: StringConstructor; + bindInputFocusEvents: BooleanConstructor; + contentType: { + type: StringConstructor; + default: string; + }; + }; + readonly stringsValue: string[]; + readonly typeSpeedValue: number; + readonly smartBackspaceValue: boolean; + readonly startDelayValue?: number; + readonly backSpeedValue?: number; + readonly shuffleValue?: boolean; + readonly backDelayValue: number; + readonly fadeOutValue?: boolean; + readonly fadeOutClassValue: string; + readonly fadeOutDelayValue: number; + readonly loopValue?: boolean; + readonly loopCountValue: number; + readonly showCursorValue: boolean; + readonly cursorCharValue: string; + readonly autoInsertCssValue: boolean; + readonly attrValue?: string; + readonly bindInputFocusEventsValue?: boolean; + readonly contentTypeValue: string; + connect(): void; + _dispatchEvent(name: string, payload: any): void; +} diff --git a/src/Typed/assets/package.json b/src/Typed/assets/package.json index 13d455b8646..08f95f471fb 100644 --- a/src/Typed/assets/package.json +++ b/src/Typed/assets/package.json @@ -3,6 +3,8 @@ "description": "Typed integration for Symfony", "license": "MIT", "version": "1.0.0", + "main": "dist/controller.js", + "types": "dist/controller.d.ts", "symfony": { "controllers": { "typed": { diff --git a/src/Vue/assets/dist/register_controller.d.ts b/src/Vue/assets/dist/register_controller.d.ts new file mode 100644 index 00000000000..a6ccbbfe823 --- /dev/null +++ b/src/Vue/assets/dist/register_controller.d.ts @@ -0,0 +1,9 @@ +/// +import type { Component } from 'vue'; +declare global { + function resolveVueComponent(name: string): Component; + interface Window { + resolveVueComponent(name: string): Component; + } +} +export declare function registerVueControllerComponents(context: __WebpackModuleApi.RequireContext): void; diff --git a/src/Vue/assets/dist/render_controller.d.ts b/src/Vue/assets/dist/render_controller.d.ts new file mode 100644 index 00000000000..341608e7b32 --- /dev/null +++ b/src/Vue/assets/dist/render_controller.d.ts @@ -0,0 +1,17 @@ +import { Controller } from '@hotwired/stimulus'; +import { App } from 'vue'; +export default class extends Controller; +}> { + private props; + private app; + readonly componentValue: string; + readonly propsValue: Record | null | undefined; + static values: { + component: StringConstructor; + props: ObjectConstructor; + }; + connect(): void; + disconnect(): void; + _dispatchEvent(name: string, payload: any): void; +} diff --git a/src/Vue/assets/package.json b/src/Vue/assets/package.json index 85b33d8dfdb..1e7cdf8f469 100644 --- a/src/Vue/assets/package.json +++ b/src/Vue/assets/package.json @@ -4,6 +4,7 @@ "license": "MIT", "version": "1.0.0", "main": "dist/register_controller.js", + "types": "dist/register_controller.d.ts", "symfony": { "controllers": { "vue": { diff --git a/tsconfig.json b/tsconfig.json index 07b799e4617..4a126a7acd7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "strictPropertyInitialization": false, "target": "es2017", "removeComments": true, - "outDir": "dist", + "outDir": "types", "baseUrl": ".", "noEmit": false, "declaration": false, @@ -17,6 +17,6 @@ "allowSyntheticDefaultImports": true, "jsx": "react" }, - "exclude": ["src/**/dist"], - "include": ["src/**/*"] + "exclude": ["src/*/assets/dist"], + "include": ["src/*/assets/src", "src/*/assets/test"] }