From 715c289b6b98e7690f7e09fd24e029a06abfca54 Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Mon, 12 Dec 2022 11:11:28 -0500 Subject: [PATCH] Fixing TypeScript build system and making it output types We no longer parse ALL .ts files for EACH package we're building with rollup. Also, we ouput the the type files straight from rollup back --- .github/workflows/test.yaml | 2 - package.json | 11 ++- rollup.config.js | 59 +++++++++++---- src/Autocomplete/assets/dist/controller.d.ts | 29 ++++++++ src/Autocomplete/assets/dist/controller.js | 46 ++++++------ src/Autocomplete/assets/package.json | 2 +- src/Chartjs/assets/dist/controller.d.ts | 9 +++ src/Chartjs/assets/package.json | 2 + src/Cropperjs/assets/dist/controller.d.ts | 11 +++ src/Cropperjs/assets/package.json | 2 + src/Dropzone/assets/dist/controller.d.ts | 15 ++++ src/Dropzone/assets/package.json | 2 + src/LazyImage/assets/dist/controller.d.ts | 13 ++++ src/LazyImage/assets/package.json | 2 + src/LiveComponent/assets/dist/Backend.d.ts | 15 ++++ .../assets/dist/BackendRequest.d.ts | 9 +++ .../assets/dist/BackendResponse.d.ts | 6 ++ .../assets/dist/Component/ElementDriver.d.ts | 14 ++++ .../dist/Component/UnsyncedInputsTracker.d.ts | 28 +++++++ .../assets/dist/Component/ValueStore.d.ts | 12 +++ .../assets/dist/Component/index.d.ts | 52 +++++++++++++ .../dist/Component/plugins/LoadingPlugin.d.ts | 23 ++++++ .../plugins/PageUnloadingPlugin.d.ts | 6 ++ .../Component/plugins/PluginInterface.d.ts | 4 + .../dist/Component/plugins/PollingPlugin.d.ts | 10 +++ .../SetValueOntoModelFieldsPlugin.d.ts | 6 ++ .../plugins/ValidatedFieldsPlugin.d.ts | 6 ++ .../dist/Directive/directives_parser.d.ts | 14 ++++ .../dist/Directive/get_model_binding.d.ts | 9 +++ .../assets/dist/HookManager.d.ts | 7 ++ .../assets/dist/PollingDirector.d.ts | 17 +++++ .../assets/dist/data_manipulation_utils.d.ts | 2 + src/LiveComponent/assets/dist/dom_utils.d.ts | 12 +++ .../assets/dist/live_controller.d.ts | 51 +++++++++++++ .../assets/dist/live_controller.js | 2 +- src/LiveComponent/assets/dist/morphdom.d.ts | 2 + .../normalize_attributes_for_comparison.d.ts | 1 + .../assets/dist/string_utils.d.ts | 2 + src/LiveComponent/assets/package.json | 2 +- .../assets/src/live_controller.ts | 2 + src/Notify/assets/dist/controller.d.ts | 13 ++++ src/Notify/assets/package.json | 2 + .../assets/dist/register_controller.d.ts | 11 +++ src/React/assets/dist/render_controller.d.ts | 14 ++++ src/React/assets/package.json | 1 + src/Swup/assets/dist/controller.d.ts | 28 +++++++ src/Swup/assets/package.json | 2 + src/Turbo/assets/dist/turbo_controller.d.ts | 4 + .../assets/dist/turbo_stream_controller.d.ts | 16 ++++ src/Turbo/assets/package.json | 2 + src/Typed/assets/dist/controller.d.ts | 73 +++++++++++++++++++ src/Typed/assets/package.json | 2 + src/Vue/assets/dist/register_controller.d.ts | 9 +++ src/Vue/assets/dist/render_controller.d.ts | 17 +++++ src/Vue/assets/package.json | 1 + tsconfig.json | 6 +- 56 files changed, 669 insertions(+), 51 deletions(-) create mode 100644 src/Autocomplete/assets/dist/controller.d.ts create mode 100644 src/Chartjs/assets/dist/controller.d.ts create mode 100644 src/Cropperjs/assets/dist/controller.d.ts create mode 100644 src/Dropzone/assets/dist/controller.d.ts create mode 100644 src/LazyImage/assets/dist/controller.d.ts create mode 100644 src/LiveComponent/assets/dist/Backend.d.ts create mode 100644 src/LiveComponent/assets/dist/BackendRequest.d.ts create mode 100644 src/LiveComponent/assets/dist/BackendResponse.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/ElementDriver.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/UnsyncedInputsTracker.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/ValueStore.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/index.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/plugins/LoadingPlugin.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/plugins/PageUnloadingPlugin.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/plugins/PluginInterface.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/plugins/PollingPlugin.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/plugins/SetValueOntoModelFieldsPlugin.d.ts create mode 100644 src/LiveComponent/assets/dist/Component/plugins/ValidatedFieldsPlugin.d.ts create mode 100644 src/LiveComponent/assets/dist/Directive/directives_parser.d.ts create mode 100644 src/LiveComponent/assets/dist/Directive/get_model_binding.d.ts create mode 100644 src/LiveComponent/assets/dist/HookManager.d.ts create mode 100644 src/LiveComponent/assets/dist/PollingDirector.d.ts create mode 100644 src/LiveComponent/assets/dist/data_manipulation_utils.d.ts create mode 100644 src/LiveComponent/assets/dist/dom_utils.d.ts create mode 100644 src/LiveComponent/assets/dist/live_controller.d.ts create mode 100644 src/LiveComponent/assets/dist/morphdom.d.ts create mode 100644 src/LiveComponent/assets/dist/normalize_attributes_for_comparison.d.ts create mode 100644 src/LiveComponent/assets/dist/string_utils.d.ts create mode 100644 src/Notify/assets/dist/controller.d.ts create mode 100644 src/React/assets/dist/register_controller.d.ts create mode 100644 src/React/assets/dist/render_controller.d.ts create mode 100644 src/Swup/assets/dist/controller.d.ts create mode 100644 src/Turbo/assets/dist/turbo_controller.d.ts create mode 100644 src/Turbo/assets/dist/turbo_stream_controller.d.ts create mode 100644 src/Typed/assets/dist/controller.d.ts create mode 100644 src/Vue/assets/dist/register_controller.d.ts create mode 100644 src/Vue/assets/dist/render_controller.d.ts 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"] }