From b8068ccd6962c2f18ca0292b41bfa107ea0b788b Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Tue, 12 Sep 2023 09:30:45 +0000 Subject: [PATCH 01/33] [create-pull-request] update tsc build dist files --- src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 265 insertions(+) create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 440f93497ae2142f786fbfe402672697a602d1d3 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Tue, 12 Sep 2023 09:37:28 +0000 Subject: [PATCH 02/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From efd98eeb85d05c326c78934cd3b314aad39a9429 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Tue, 12 Sep 2023 09:45:22 +0000 Subject: [PATCH 03/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From ba6b222ed5cb45675a432a7a16dba0ec364c9bdc Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Tue, 12 Sep 2023 09:47:35 +0000 Subject: [PATCH 04/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lBQ3BCLHVGQUFZLENBQUE7QUFDYixDQUFDLEVBTEksd0JBQXdCLEtBQXhCLHdCQUF3QixRQUs1QjtBQUVEO0lBS0Msd0JBQ1MsTUFBc0IsRUFDOUIsVUFBOEIsRUFDdEIsU0FBMEI7UUFIbkMsaUJBWUM7UUFWQSwyQkFBQSxFQUFBLGVBQThCO1FBQ3RCLDBCQUFBLEVBQUEsaUJBQTBCO1FBRjFCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBRXRCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBUDNCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBK0MsRUFBRSxDQUFDO1FBT25FLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsRUFBaUI7Z0JBQWhCLElBQUksUUFBQSxFQUFFLFNBQVMsUUFBQTtZQUNuRCxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDdEMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQUksR0FBWjtRQUFBLGlCQWlCQztRQWhCQSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTztTQUNQO1FBR0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdkMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzdCLE9BQU8sQ0FBQyxVQUFDLEVBQU07Z0JBQUwsSUFBSSxRQUFBO1lBQ2QsT0FBQSxLQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDO1FBQTFDLENBQTBDLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBWUQsa0NBQVMsR0FBVCxVQUFVLElBQVk7UUFFckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxvQ0FBVyxHQUFYLFVBQVksVUFBeUI7UUFBckMsaUJBSUM7UUFIQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUN4QixPQUFPLENBQUMsVUFBQyxFQUFpQjtnQkFBaEIsSUFBSSxRQUFBLEVBQUUsU0FBUyxRQUFBO1lBQ3pCLE9BQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO1FBQTlCLENBQThCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBa0JELGlDQUFRLEdBQVIsVUFFQyxvQkFBbUYsRUFDbkYsMEJBQWdFO1FBQWhFLDJDQUFBLEVBQUEsK0JBQWdFO1FBRWhFLElBQUksU0FBbUMsQ0FBQztRQUV4QyxJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFO1lBQzdDLElBQUksT0FBTywwQkFBMEIsS0FBSyxRQUFRLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNsRixPQUFPO2FBQ1A7WUFDRCxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBSSxvQkFBb0IsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1NBQzlGO2FBQU0sSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVUsRUFBRTtZQUN0RCxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBbUQsb0JBQW9CLEVBQVUsMEJBQTBCLENBQUMsQ0FBQztZQUNwSixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUM5RjtTQUNEO2FBQU07WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxPQUFPO1NBQ1A7UUFFRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvRDtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFFeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDRixDQUFDO0lBRU8sd0RBQStCLEdBQXZDLFVBQXdDLElBQVk7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRWMsNEJBQWEsR0FBNUIsVUFDQyxJQUFZLEVBQ1osU0FBbUM7UUFFbkMsT0FBTztZQUNOLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUE4QixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUUzRixxQkFBcUIsQ0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ2pELENBQUM7SUFDSCxDQUFDO0lBRWMsMkJBQVksR0FBM0IsVUFDQyxTQUF3QyxFQUN4QyxJQUFhO1FBRWIsSUFBTSxZQUFZLEdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEYsT0FBTztZQUNOLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVcsRUFBRSxxQkFBcUIsQ0FBSSxTQUFTLENBQUM7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFTywyQ0FBa0IsR0FBMUIsVUFBMkIsTUFBZ0M7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsT0FBTztTQUNQO1FBRUQsUUFBUSxNQUFNLEVBQUU7WUFDZixLQUFLLHdCQUF3QixDQUFDLCtCQUErQjtnQkFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNO1lBQ1AsS0FBSyx3QkFBd0IsQ0FBQywyQ0FBMkM7Z0JBRXhFLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztnQkFDdkYsTUFBTTtZQUNQLEtBQUssd0JBQXdCLENBQUMsb0JBQW9CO2dCQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUM7Z0JBQ2pILE1BQU07WUFDUCxLQUFLLHdCQUF3QixDQUFDLFlBQVk7Z0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtnQkFDakYsTUFBTTtTQUNQO0lBQ0YsQ0FBQztJQUVGLHFCQUFDO0FBQUQsQ0FBQyxBQS9KRCxJQStKQzs7QUFPRCxNQUFNLFVBQVUscUJBQXFCLENBQTRCLFFBQVc7SUFDM0UsT0FBTyxnQ0FDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUMzRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQ3RDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFJO1FBRWxCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDUixDQUFDO0FBT0QsTUFBTSxVQUFVLHFCQUFxQixDQUE0QixTQUF3QztJQUN4RyxPQUFPO1FBQUMsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFBSyxPQUFBLHFCQUFxQixNQUFLLFNBQVMsWUFBVCxTQUFTLDBCQUFJLElBQUksYUFBRTtJQUE3QyxDQUE2QyxDQUFDO0FBQzFFLENBQUMifQ== \ No newline at end of file From 4ce55cbf830554bce530f4dff5fdcaa1fafe07df Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Tue, 12 Sep 2023 09:50:45 +0000 Subject: [PATCH 05/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From fad918b7850ae5a08a50c4a122fb7605281f8989 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Tue, 12 Sep 2023 09:53:05 +0000 Subject: [PATCH 06/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From e59a104b4f9429003156492f7ffc95c35b5f8eb4 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Tue, 12 Sep 2023 22:58:22 +0000 Subject: [PATCH 07/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From fd8065ccfa35b14d05bf80fd4ae33e21e3b4e5cb Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Tue, 12 Sep 2023 23:07:21 +0000 Subject: [PATCH 08/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 0724d8a4995582ab2ec797b58f798a55c758f553 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 01:48:24 +0000 Subject: [PATCH 09/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 4e510d2978b6d7be0a2c11b68abcc8f8767fce3e Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 01:55:29 +0000 Subject: [PATCH 10/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 74b0553d050ea94d0d316c7abcffbc07443e9adf Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 02:08:09 +0000 Subject: [PATCH 11/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 96c078410434960e6877095fdbcdbb08a9311787 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 02:11:15 +0000 Subject: [PATCH 12/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 30f98dc531a4db73c2ae3cd2b3103e24b87160fd Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 02:13:38 +0000 Subject: [PATCH 13/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lBQ3BCLHVGQUFZLENBQUE7QUFDYixDQUFDLEVBTEksd0JBQXdCLEtBQXhCLHdCQUF3QixRQUs1QjtBQUVEO0lBS0Msd0JBQ1MsTUFBc0IsRUFDOUIsVUFBOEIsRUFDdEIsU0FBMEI7UUFIbkMsaUJBWUM7UUFWQSwyQkFBQSxFQUFBLGVBQThCO1FBQ3RCLDBCQUFBLEVBQUEsaUJBQTBCO1FBRjFCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBRXRCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBUDNCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBK0MsRUFBRSxDQUFDO1FBT25FLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsRUFBaUI7Z0JBQWhCLElBQUksUUFBQSxFQUFFLFNBQVMsUUFBQTtZQUNuRCxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDdEMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQUksR0FBWjtRQUFBLGlCQWlCQztRQWhCQSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTztTQUNQO1FBR0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdkMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzdCLE9BQU8sQ0FBQyxVQUFDLEVBQU07Z0JBQUwsSUFBSSxRQUFBO1lBQ2QsT0FBQSxLQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDO1FBQTFDLENBQTBDLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBWUQsa0NBQVMsR0FBVCxVQUFVLElBQVk7UUFFckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxvQ0FBVyxHQUFYLFVBQVksVUFBeUI7UUFBckMsaUJBSUM7UUFIQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUN4QixPQUFPLENBQUMsVUFBQyxFQUFpQjtnQkFBaEIsSUFBSSxRQUFBLEVBQUUsU0FBUyxRQUFBO1lBQ3pCLE9BQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO1FBQTlCLENBQThCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBa0JELGlDQUFRLEdBQVIsVUFFQyxvQkFBbUYsRUFDbkYsMEJBQWdFO1FBQWhFLDJDQUFBLEVBQUEsK0JBQWdFO1FBRWhFLElBQUksU0FBbUMsQ0FBQztRQUV4QyxJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFO1lBQzdDLElBQUksT0FBTywwQkFBMEIsS0FBSyxRQUFRLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNsRixPQUFPO2FBQ1A7WUFDRCxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBSSxvQkFBb0IsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1NBQzlGO2FBQU0sSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVUsRUFBRTtZQUN0RCxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBbUQsb0JBQW9CLEVBQVUsMEJBQTBCLENBQUMsQ0FBQztZQUNwSixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUM5RjtTQUNEO2FBQU07WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxPQUFPO1NBQ1A7UUFFRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvRDtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFFeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDRixDQUFDO0lBRU8sd0RBQStCLEdBQXZDLFVBQXdDLElBQVk7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRWMsNEJBQWEsR0FBNUIsVUFDQyxJQUFZLEVBQ1osU0FBbUM7UUFFbkMsT0FBTztZQUNOLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUE4QixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUUzRixxQkFBcUIsQ0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ2pELENBQUM7SUFDSCxDQUFDO0lBRWMsMkJBQVksR0FBM0IsVUFDQyxTQUF3QyxFQUN4QyxJQUFhO1FBRWIsSUFBTSxZQUFZLEdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEYsT0FBTztZQUNOLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVcsRUFBRSxxQkFBcUIsQ0FBSSxTQUFTLENBQUM7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFTywyQ0FBa0IsR0FBMUIsVUFBMkIsTUFBZ0M7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsT0FBTztTQUNQO1FBRUQsUUFBUSxNQUFNLEVBQUU7WUFDZixLQUFLLHdCQUF3QixDQUFDLCtCQUErQjtnQkFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNO1lBQ1AsS0FBSyx3QkFBd0IsQ0FBQywyQ0FBMkM7Z0JBRXhFLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztnQkFDdkYsTUFBTTtZQUNQLEtBQUssd0JBQXdCLENBQUMsb0JBQW9CO2dCQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUM7Z0JBQ2pILE1BQU07WUFDUCxLQUFLLHdCQUF3QixDQUFDLFlBQVk7Z0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtnQkFDakYsTUFBTTtTQUNQO0lBQ0YsQ0FBQztJQUVGLHFCQUFDO0FBQUQsQ0FBQyxBQS9KRCxJQStKQzs7QUFPRCxNQUFNLFVBQVUscUJBQXFCLENBQTRCLFFBQVc7SUFDM0UsT0FBTyxnQ0FDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUMzRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQ3RDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFJO1FBRWxCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDUixDQUFDO0FBT0QsTUFBTSxVQUFVLHFCQUFxQixDQUE0QixTQUF3QztJQUN4RyxPQUFPO1FBQUMsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFBSyxPQUFBLHFCQUFxQixNQUFLLFNBQVMsWUFBVCxTQUFTLDBCQUFJLElBQUksYUFBRTtJQUE3QyxDQUE2QyxDQUFDO0FBQzFFLENBQUMifQ== \ No newline at end of file From 8237adfb43d7ae48122222f72bbe8723749392ea Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 02:16:12 +0000 Subject: [PATCH 14/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lBQ3BCLHVGQUFZLENBQUE7QUFDYixDQUFDLEVBTEksd0JBQXdCLEtBQXhCLHdCQUF3QixRQUs1QjtBQUVEO0lBS0Msd0JBQ1MsTUFBc0IsRUFDOUIsVUFBOEIsRUFDdEIsU0FBMEI7UUFIbkMsaUJBWUM7UUFWQSwyQkFBQSxFQUFBLGVBQThCO1FBQ3RCLDBCQUFBLEVBQUEsaUJBQTBCO1FBRjFCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBRXRCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBUDNCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBK0MsRUFBRSxDQUFDO1FBT25FLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsRUFBaUI7Z0JBQWhCLElBQUksUUFBQSxFQUFFLFNBQVMsUUFBQTtZQUNuRCxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDdEMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQUksR0FBWjtRQUFBLGlCQWlCQztRQWhCQSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTztTQUNQO1FBR0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdkMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzdCLE9BQU8sQ0FBQyxVQUFDLEVBQU07Z0JBQUwsSUFBSSxRQUFBO1lBQ2QsT0FBQSxLQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDO1FBQTFDLENBQTBDLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBWUQsa0NBQVMsR0FBVCxVQUFVLElBQVk7UUFFckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxvQ0FBVyxHQUFYLFVBQVksVUFBeUI7UUFBckMsaUJBSUM7UUFIQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUN4QixPQUFPLENBQUMsVUFBQyxFQUFpQjtnQkFBaEIsSUFBSSxRQUFBLEVBQUUsU0FBUyxRQUFBO1lBQ3pCLE9BQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO1FBQTlCLENBQThCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBa0JELGlDQUFRLEdBQVIsVUFFQyxvQkFBbUYsRUFDbkYsMEJBQWdFO1FBQWhFLDJDQUFBLEVBQUEsK0JBQWdFO1FBRWhFLElBQUksU0FBbUMsQ0FBQztRQUV4QyxJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFO1lBQzdDLElBQUksT0FBTywwQkFBMEIsS0FBSyxRQUFRLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNsRixPQUFPO2FBQ1A7WUFDRCxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBSSxvQkFBb0IsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1NBQzlGO2FBQU0sSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVUsRUFBRTtZQUN0RCxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBbUQsb0JBQW9CLEVBQVUsMEJBQTBCLENBQUMsQ0FBQztZQUNwSixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUM5RjtTQUNEO2FBQU07WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxPQUFPO1NBQ1A7UUFFRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvRDtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFFeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDRixDQUFDO0lBRU8sd0RBQStCLEdBQXZDLFVBQXdDLElBQVk7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRWMsNEJBQWEsR0FBNUIsVUFDQyxJQUFZLEVBQ1osU0FBbUM7UUFFbkMsT0FBTztZQUNOLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUE4QixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUUzRixxQkFBcUIsQ0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ2pELENBQUM7SUFDSCxDQUFDO0lBRWMsMkJBQVksR0FBM0IsVUFDQyxTQUF3QyxFQUN4QyxJQUFhO1FBRWIsSUFBTSxZQUFZLEdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEYsT0FBTztZQUNOLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVcsRUFBRSxxQkFBcUIsQ0FBSSxTQUFTLENBQUM7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFTywyQ0FBa0IsR0FBMUIsVUFBMkIsTUFBZ0M7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsT0FBTztTQUNQO1FBRUQsUUFBUSxNQUFNLEVBQUU7WUFDZixLQUFLLHdCQUF3QixDQUFDLCtCQUErQjtnQkFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNO1lBQ1AsS0FBSyx3QkFBd0IsQ0FBQywyQ0FBMkM7Z0JBRXhFLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztnQkFDdkYsTUFBTTtZQUNQLEtBQUssd0JBQXdCLENBQUMsb0JBQW9CO2dCQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUM7Z0JBQ2pILE1BQU07WUFDUCxLQUFLLHdCQUF3QixDQUFDLFlBQVk7Z0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtnQkFDakYsTUFBTTtTQUNQO0lBQ0YsQ0FBQztJQUVGLHFCQUFDO0FBQUQsQ0FBQyxBQS9KRCxJQStKQzs7QUFPRCxNQUFNLFVBQVUscUJBQXFCLENBQTRCLFFBQVc7SUFDM0UsT0FBTyxnQ0FDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUMzRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQ3RDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFJO1FBRWxCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDUixDQUFDO0FBT0QsTUFBTSxVQUFVLHFCQUFxQixDQUE0QixTQUF3QztJQUN4RyxPQUFPO1FBQUMsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFBSyxPQUFBLHFCQUFxQixNQUFLLFNBQVMsWUFBVCxTQUFTLDBCQUFJLElBQUksYUFBRTtJQUE3QyxDQUE2QyxDQUFDO0FBQzFFLENBQUMifQ== \ No newline at end of file From 173a3db99fd1fa60205c06b5ddad4b8e5d95eecb Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 02:21:01 +0000 Subject: [PATCH 15/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From dc0c687a7270c3526912887639522f0db0bdb056 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 03:18:06 +0000 Subject: [PATCH 16/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 3f4bc608fa4b1295ca43e251176d7e82c00a9c48 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 03:27:26 +0000 Subject: [PATCH 17/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lBQ3BCLHVGQUFZLENBQUE7QUFDYixDQUFDLEVBTEksd0JBQXdCLEtBQXhCLHdCQUF3QixRQUs1QjtBQUVEO0lBS0Msd0JBQ1MsTUFBc0IsRUFDOUIsVUFBOEIsRUFDdEIsU0FBMEI7UUFIbkMsaUJBWUM7UUFWQSwyQkFBQSxFQUFBLGVBQThCO1FBQ3RCLDBCQUFBLEVBQUEsaUJBQTBCO1FBRjFCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBRXRCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBUDNCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBK0MsRUFBRSxDQUFDO1FBT25FLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsRUFBaUI7Z0JBQWhCLElBQUksUUFBQSxFQUFFLFNBQVMsUUFBQTtZQUNuRCxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDdEMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQUksR0FBWjtRQUFBLGlCQWlCQztRQWhCQSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTztTQUNQO1FBR0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdkMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzdCLE9BQU8sQ0FBQyxVQUFDLEVBQU07Z0JBQUwsSUFBSSxRQUFBO1lBQ2QsT0FBQSxLQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDO1FBQTFDLENBQTBDLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBWUQsa0NBQVMsR0FBVCxVQUFVLElBQVk7UUFFckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxvQ0FBVyxHQUFYLFVBQVksVUFBeUI7UUFBckMsaUJBSUM7UUFIQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUN4QixPQUFPLENBQUMsVUFBQyxFQUFpQjtnQkFBaEIsSUFBSSxRQUFBLEVBQUUsU0FBUyxRQUFBO1lBQ3pCLE9BQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO1FBQTlCLENBQThCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBa0JELGlDQUFRLEdBQVIsVUFFQyxvQkFBbUYsRUFDbkYsMEJBQWdFO1FBQWhFLDJDQUFBLEVBQUEsK0JBQWdFO1FBRWhFLElBQUksU0FBbUMsQ0FBQztRQUV4QyxJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFO1lBQzdDLElBQUksT0FBTywwQkFBMEIsS0FBSyxRQUFRLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNsRixPQUFPO2FBQ1A7WUFDRCxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBSSxvQkFBb0IsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1NBQzlGO2FBQU0sSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVUsRUFBRTtZQUN0RCxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBbUQsb0JBQW9CLEVBQVUsMEJBQTBCLENBQUMsQ0FBQztZQUNwSixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUM5RjtTQUNEO2FBQU07WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxPQUFPO1NBQ1A7UUFFRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvRDtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFFeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDRixDQUFDO0lBRU8sd0RBQStCLEdBQXZDLFVBQXdDLElBQVk7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRWMsNEJBQWEsR0FBNUIsVUFDQyxJQUFZLEVBQ1osU0FBbUM7UUFFbkMsT0FBTztZQUNOLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUE4QixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUUzRixxQkFBcUIsQ0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ2pELENBQUM7SUFDSCxDQUFDO0lBRWMsMkJBQVksR0FBM0IsVUFDQyxTQUF3QyxFQUN4QyxJQUFhO1FBRWIsSUFBTSxZQUFZLEdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEYsT0FBTztZQUNOLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVcsRUFBRSxxQkFBcUIsQ0FBSSxTQUFTLENBQUM7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFTywyQ0FBa0IsR0FBMUIsVUFBMkIsTUFBZ0M7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsT0FBTztTQUNQO1FBRUQsUUFBUSxNQUFNLEVBQUU7WUFDZixLQUFLLHdCQUF3QixDQUFDLCtCQUErQjtnQkFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNO1lBQ1AsS0FBSyx3QkFBd0IsQ0FBQywyQ0FBMkM7Z0JBRXhFLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztnQkFDdkYsTUFBTTtZQUNQLEtBQUssd0JBQXdCLENBQUMsb0JBQW9CO2dCQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUM7Z0JBQ2pILE1BQU07WUFDUCxLQUFLLHdCQUF3QixDQUFDLFlBQVk7Z0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtnQkFDakYsTUFBTTtTQUNQO0lBQ0YsQ0FBQztJQUVGLHFCQUFDO0FBQUQsQ0FBQyxBQS9KRCxJQStKQzs7QUFPRCxNQUFNLFVBQVUscUJBQXFCLENBQTRCLFFBQVc7SUFDM0UsT0FBTyxnQ0FDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUMzRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQ3RDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFJO1FBRWxCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDUixDQUFDO0FBT0QsTUFBTSxVQUFVLHFCQUFxQixDQUE0QixTQUF3QztJQUN4RyxPQUFPO1FBQUMsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFBSyxPQUFBLHFCQUFxQixNQUFLLFNBQVMsWUFBVCxTQUFTLDBCQUFJLElBQUksYUFBRTtJQUE3QyxDQUE2QyxDQUFDO0FBQzFFLENBQUMifQ== \ No newline at end of file From d6d1232eb7731a385c410419029994bdd45cffad Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 03:48:31 +0000 Subject: [PATCH 18/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lBQ3BCLHVGQUFZLENBQUE7QUFDYixDQUFDLEVBTEksd0JBQXdCLEtBQXhCLHdCQUF3QixRQUs1QjtBQUVEO0lBS0Msd0JBQ1MsTUFBc0IsRUFDOUIsVUFBOEIsRUFDdEIsU0FBMEI7UUFIbkMsaUJBWUM7UUFWQSwyQkFBQSxFQUFBLGVBQThCO1FBQ3RCLDBCQUFBLEVBQUEsaUJBQTBCO1FBRjFCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBRXRCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBUDNCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBK0MsRUFBRSxDQUFDO1FBT25FLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsRUFBaUI7Z0JBQWhCLElBQUksUUFBQSxFQUFFLFNBQVMsUUFBQTtZQUNuRCxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDdEMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQUksR0FBWjtRQUFBLGlCQWlCQztRQWhCQSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTztTQUNQO1FBR0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdkMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzdCLE9BQU8sQ0FBQyxVQUFDLEVBQU07Z0JBQUwsSUFBSSxRQUFBO1lBQ2QsT0FBQSxLQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDO1FBQTFDLENBQTBDLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBWUQsa0NBQVMsR0FBVCxVQUFVLElBQVk7UUFFckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxvQ0FBVyxHQUFYLFVBQVksVUFBeUI7UUFBckMsaUJBSUM7UUFIQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUN4QixPQUFPLENBQUMsVUFBQyxFQUFpQjtnQkFBaEIsSUFBSSxRQUFBLEVBQUUsU0FBUyxRQUFBO1lBQ3pCLE9BQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO1FBQTlCLENBQThCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBa0JELGlDQUFRLEdBQVIsVUFFQyxvQkFBbUYsRUFDbkYsMEJBQWdFO1FBQWhFLDJDQUFBLEVBQUEsK0JBQWdFO1FBRWhFLElBQUksU0FBbUMsQ0FBQztRQUV4QyxJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFO1lBQzdDLElBQUksT0FBTywwQkFBMEIsS0FBSyxRQUFRLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNsRixPQUFPO2FBQ1A7WUFDRCxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBSSxvQkFBb0IsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1NBQzlGO2FBQU0sSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVUsRUFBRTtZQUN0RCxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBbUQsb0JBQW9CLEVBQVUsMEJBQTBCLENBQUMsQ0FBQztZQUNwSixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUM5RjtTQUNEO2FBQU07WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxPQUFPO1NBQ1A7UUFFRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvRDtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFFeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDRixDQUFDO0lBRU8sd0RBQStCLEdBQXZDLFVBQXdDLElBQVk7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRWMsNEJBQWEsR0FBNUIsVUFDQyxJQUFZLEVBQ1osU0FBbUM7UUFFbkMsT0FBTztZQUNOLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUE4QixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUUzRixxQkFBcUIsQ0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ2pELENBQUM7SUFDSCxDQUFDO0lBRWMsMkJBQVksR0FBM0IsVUFDQyxTQUF3QyxFQUN4QyxJQUFhO1FBRWIsSUFBTSxZQUFZLEdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEYsT0FBTztZQUNOLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVcsRUFBRSxxQkFBcUIsQ0FBSSxTQUFTLENBQUM7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFTywyQ0FBa0IsR0FBMUIsVUFBMkIsTUFBZ0M7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsT0FBTztTQUNQO1FBRUQsUUFBUSxNQUFNLEVBQUU7WUFDZixLQUFLLHdCQUF3QixDQUFDLCtCQUErQjtnQkFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNO1lBQ1AsS0FBSyx3QkFBd0IsQ0FBQywyQ0FBMkM7Z0JBRXhFLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztnQkFDdkYsTUFBTTtZQUNQLEtBQUssd0JBQXdCLENBQUMsb0JBQW9CO2dCQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUM7Z0JBQ2pILE1BQU07WUFDUCxLQUFLLHdCQUF3QixDQUFDLFlBQVk7Z0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtnQkFDakYsTUFBTTtTQUNQO0lBQ0YsQ0FBQztJQUVGLHFCQUFDO0FBQUQsQ0FBQyxBQS9KRCxJQStKQzs7QUFPRCxNQUFNLFVBQVUscUJBQXFCLENBQTRCLFFBQVc7SUFDM0UsT0FBTyxnQ0FDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUMzRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQ3RDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFJO1FBRWxCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDUixDQUFDO0FBT0QsTUFBTSxVQUFVLHFCQUFxQixDQUE0QixTQUF3QztJQUN4RyxPQUFPO1FBQUMsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFBSyxPQUFBLHFCQUFxQixNQUFLLFNBQVMsWUFBVCxTQUFTLDBCQUFJLElBQUksYUFBRTtJQUE3QyxDQUE2QyxDQUFDO0FBQzFFLENBQUMifQ== \ No newline at end of file From 8fc9f33e2641b4fddbe72e968e3a066c23535c5d Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 04:55:14 +0000 Subject: [PATCH 19/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 5864706bf6ad9f0843b415d68bc7ee68d9a906b5 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 05:40:26 +0000 Subject: [PATCH 20/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 1c2cdb2f4d4267676121a751f8bb61240a4d7c1f Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 07:38:04 +0000 Subject: [PATCH 21/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 8c1deedc050c1a99aeee99429b9ab101db7aa57b Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 08:05:03 +0000 Subject: [PATCH 22/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 +++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 +++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 +++++++++++ src/Store.d.ts | 24 ++++++++ src/Store.js | 150 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 278 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..1307b4f --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..451ef35 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: T; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..3f21da4 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,150 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + return __spreadArray(__spreadArray([], Object.getOwnPropertyNames(Object.getPrototypeOf(instance)), true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lBQ3BCLHVGQUFZLENBQUE7QUFDYixDQUFDLEVBTEksd0JBQXdCLEtBQXhCLHdCQUF3QixRQUs1QjtBQUVEO0lBS0Msd0JBQ1MsTUFBc0IsRUFDOUIsVUFBOEIsRUFDdEIsU0FBMEI7UUFIbkMsaUJBWUM7UUFWQSwyQkFBQSxFQUFBLGVBQThCO1FBQ3RCLDBCQUFBLEVBQUEsaUJBQTBCO1FBRjFCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBRXRCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBUDNCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBK0MsRUFBRSxDQUFDO1FBT25FLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsRUFBaUI7Z0JBQWhCLElBQUksUUFBQSxFQUFFLFNBQVMsUUFBQTtZQUNuRCxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDdEMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQUksR0FBWjtRQUFBLGlCQWlCQztRQWhCQSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTztTQUNQO1FBR0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdkMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzdCLE9BQU8sQ0FBQyxVQUFDLEVBQU07Z0JBQUwsSUFBSSxRQUFBO1lBQ2QsT0FBQSxLQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDO1FBQTFDLENBQTBDLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBWUQsa0NBQVMsR0FBVCxVQUFVLElBQVk7UUFFckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxvQ0FBVyxHQUFYLFVBQVksVUFBeUI7UUFBckMsaUJBSUM7UUFIQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUN4QixPQUFPLENBQUMsVUFBQyxFQUFpQjtnQkFBaEIsSUFBSSxRQUFBLEVBQUUsU0FBUyxRQUFBO1lBQ3pCLE9BQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO1FBQTlCLENBQThCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBa0JELGlDQUFRLEdBQVIsVUFFQyxvQkFBbUYsRUFDbkYsMEJBQWdFO1FBQWhFLDJDQUFBLEVBQUEsK0JBQWdFO1FBRWhFLElBQUksU0FBbUMsQ0FBQztRQUV4QyxJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFO1lBQzdDLElBQUksT0FBTywwQkFBMEIsS0FBSyxRQUFRLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNsRixPQUFPO2FBQ1A7WUFDRCxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBSSxvQkFBb0IsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1NBQzlGO2FBQU0sSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVUsRUFBRTtZQUN0RCxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBbUQsb0JBQW9CLEVBQVUsMEJBQTBCLENBQUMsQ0FBQztZQUNwSixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUM5RjtTQUNEO2FBQU07WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxPQUFPO1NBQ1A7UUFFRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvRDtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFFeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDRixDQUFDO0lBRU8sd0RBQStCLEdBQXZDLFVBQXdDLElBQVk7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRWMsNEJBQWEsR0FBNUIsVUFDQyxJQUFZLEVBQ1osU0FBbUM7UUFFbkMsT0FBTztZQUNOLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUE4QixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUUzRixxQkFBcUIsQ0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ2pELENBQUM7SUFDSCxDQUFDO0lBRWMsMkJBQVksR0FBM0IsVUFDQyxTQUF3QyxFQUN4QyxJQUFhO1FBRWIsSUFBTSxZQUFZLEdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEYsT0FBTztZQUNOLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVcsRUFBRSxxQkFBcUIsQ0FBSSxTQUFTLENBQUM7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFTywyQ0FBa0IsR0FBMUIsVUFBMkIsTUFBZ0M7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsT0FBTztTQUNQO1FBRUQsUUFBUSxNQUFNLEVBQUU7WUFDZixLQUFLLHdCQUF3QixDQUFDLCtCQUErQjtnQkFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNO1lBQ1AsS0FBSyx3QkFBd0IsQ0FBQywyQ0FBMkM7Z0JBRXhFLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztnQkFDdkYsTUFBTTtZQUNQLEtBQUssd0JBQXdCLENBQUMsb0JBQW9CO2dCQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUM7Z0JBQ2pILE1BQU07WUFDUCxLQUFLLHdCQUF3QixDQUFDLFlBQVk7Z0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtnQkFDakYsTUFBTTtTQUNQO0lBQ0YsQ0FBQztJQUVGLHFCQUFDO0FBQUQsQ0FBQyxBQS9KRCxJQStKQzs7QUFPRCxNQUFNLFVBQVUscUJBQXFCLENBQTRCLFFBQVc7SUFDM0UsT0FBTyxnQ0FDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUMzRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQ3RDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFJO1FBRWxCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDUixDQUFDO0FBT0QsTUFBTSxVQUFVLHFCQUFxQixDQUE0QixTQUF3QztJQUN4RyxPQUFPO1FBQUMsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFBSyxPQUFBLHFCQUFxQixNQUFLLFNBQVMsWUFBVCxTQUFTLDBCQUFJLElBQUksYUFBRTtJQUE3QyxDQUE2QyxDQUFDO0FBQzFFLENBQUMifQ== \ No newline at end of file From a22f333e5b272fea09bca967f040072b4f9f4484 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 13:04:20 +0000 Subject: [PATCH 23/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 ++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 ++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 ++++++++++ src/Store.d.ts | 24 +++++++ src/Store.js | 159 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 287 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..b3d2128 --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM5QyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..9804e51 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: this; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..af07e10 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,159 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 7e958f48055dfbc8b4a5dcf2428bec81e6500d2e Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Wed, 13 Sep 2023 13:28:14 +0000 Subject: [PATCH 24/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 ++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 ++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 12 ++++ src/Plugin.js | 36 ++++++++++ src/Store.d.ts | 24 +++++++ src/Store.js | 159 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 287 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..b3d2128 --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUE7QUFFeEIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM5QyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..9804e51 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: this; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..bc06de1 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from "./Store"; +import type { AlpineComponentConstructor } from "./Component"; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..c488b53 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,12 @@ +import type * as Globals from './Global'; +import { type ComponentList } from "./Store"; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..ab8bbb0 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,36 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from "./Store"; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBOEJoQztBQTlCRCxXQUFpQixnQkFBZ0I7SUFRbkIsK0JBQWMsR0FBWTtRQUN0QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFNBQVMsRUFBRSxLQUFLO0tBQ2hCLENBQUM7SUFFRixTQUFnQixTQUFTLENBQ3hCLE9BQTBDLEVBQzFDLE1BQXNDO1FBRHRDLHdCQUFBLEVBQUEsVUFBNEIsK0JBQWM7UUFDMUMsdUJBQUEsRUFBQSxTQUF5QixNQUFNLENBQUMsTUFBTTtRQUV0QyxJQUFNLElBQUkseUJBQ04saUJBQUEsY0FBYyxHQUNkLE9BQU8sQ0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDRixDQUFDO0lBZGUsMEJBQVMsWUFjeEIsQ0FBQTtBQUVGLENBQUMsRUE5QmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUE4QmhDO0FBT0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3RELGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNsQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ1osQ0FBQyJ9 \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..44b541d --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from "./Component"; +import type * as Globals from './Global'; +import { AlpineComponent } from "./Component"; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..af07e10 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,159 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from "./Component"; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFjbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVHQUFvQixDQUFBO0lB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 \ No newline at end of file From 4c6dbfa5f9ee0f001c9b683c743fe710db5b91bf Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Fri, 15 Sep 2023 02:31:53 +0000 Subject: [PATCH 25/33] [create-pull-request] update tsc build dist files --- index.d.ts | 6 ++ index.js | 7 ++ src/Component.d.ts | 19 ++++++ src/Component.js | 7 ++ src/Global.d.ts | 15 +++++ src/Global.js | 2 + src/Plugin.d.ts | 13 ++++ src/Plugin.js | 42 ++++++++++++ src/Store.d.ts | 24 +++++++ src/Store.js | 159 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 294 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..0c7c6a7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,6 @@ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..6cc16b2 --- /dev/null +++ b/index.js @@ -0,0 +1,7 @@ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBTU4sZUFBZSxFQUNmLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUVOLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM5QyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..9804e51 --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,19 @@ +export type KnownClassConstructor = new (...args: any[]) => T; +export type KnownGenericConstructor = (...args: any[]) => T; +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +export type AlpineComponentConstructor = (...args: any[]) => any; +export declare interface AlpineDataContext { + init?(): void; + [stateKey: string]: any; +} +export declare type AlpineData = AlpineDataContext | string | number | boolean; +export declare abstract class AlpineComponent implements AlpineDataContext { + $data: this; + $el: HTMLElement; + $refs: Record; + $store: AlpineData; + $dispatch: (event: string, data?: any) => void; + $id: (name: string, key?: number | string) => string; + $nextTick: (callback?: () => void) => Promise; + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..f685936 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,7 @@ +var AlpineComponent = (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRDQTtJQUFBO0lBd0RBLENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUF4REQsSUF3REMifQ== \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..b46a042 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,15 @@ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from './Store'; +import type { AlpineComponentConstructor } from './Component'; +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +export declare type Alpine = AlpineType | AlpineWithComponents; +declare global { + interface Window { + Alpine: Alpine; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..9c3a2b4 --- /dev/null +++ b/src/Global.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..84cbdf6 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,13 @@ +import type * as Globals from './Global'; +import { type ComponentList } from './Store'; +export declare namespace AlpineComponents { + interface Options { + components: ComponentList; + bootstrapAlpine: boolean; + startAlpine: boolean; + logErrors: boolean; + } + const defaultOptions: Options; + function bootstrap(options?: Partial, alpine?: Globals.Alpine): void; +} +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..1b2ca06 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,42 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import Alpine from 'alpinejs'; +import { ComponentStore } from './Store'; +export var AlpineComponents; +(function (AlpineComponents) { + AlpineComponents.defaultOptions = { + components: {}, + bootstrapAlpine: false, + startAlpine: true, + logErrors: false + }; + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + if (opts.bootstrapAlpine) { + window.Alpine = Alpine; + alpine = window.Alpine; + } + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBRTlCLE9BQU8sRUFFTixjQUFjLEVBQ2QsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxLQUFXLGdCQUFnQixDQXdDaEM7QUF4Q0QsV0FBaUIsZ0JBQWdCO0lBV25CLCtCQUFjLEdBQVk7UUFDdEMsVUFBVSxFQUFFLEVBQUU7UUFFZCxlQUFlLEVBQUUsS0FBSztRQUN0QixXQUFXLEVBQUUsSUFBSTtRQUVqQixTQUFTLEVBQUUsS0FBSztLQUNoQixDQUFDO0lBRUYsU0FBZ0IsU0FBUyxDQUN4QixPQUEwQyxFQUMxQyxNQUFzQztRQUR0Qyx3QkFBQSxFQUFBLFVBQTRCLCtCQUFjO1FBQzFDLHVCQUFBLEVBQUEsU0FBeUIsTUFBTSxDQUFDLE1BQU07UUFFdEMsSUFBTSxJQUFJLHlCQUNOLGlCQUFBLGNBQWMsR0FDZCxPQUFPLENBQ1YsQ0FBQztRQUNGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixNQUFNLENBQUMsTUFBTSxHQUFpQyxNQUFNLENBQUM7WUFDckQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDdkI7UUFFRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXRGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZjtJQUNGLENBQUM7SUFsQmUsMEJBQVMsWUFrQnhCLENBQUE7QUFFRixDQUFDLEVBeENnQixnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBd0NoQztBQU9ELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFzQjtJQUN0RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDMUIsV0FBVyxFQUFFLEtBQUs7S0FDbEIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNaLENBQUMifQ== \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..b85da2f --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,24 @@ +import type * as Impl from './Component'; +import type * as Globals from './Global'; +import { AlpineComponent } from './Component'; +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private alpine; + private logErrors; + private initialized; + private components; + constructor(alpine: Globals.Alpine, components?: ComponentList, logErrors?: boolean); + private init; + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + register(name: string, component: Impl.KnownConstructor): void; + register(component: Impl.KnownClassConstructor, name?: string): void; + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +export declare function transformToAlpineData(instance: T): object; +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..ee99238 --- /dev/null +++ b/src/Store.js @@ -0,0 +1,159 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from './Component'; +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = (function () { + function ComponentStore(alpine, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.alpine = alpine; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + this.alpine.Components = this; + this.alpine.component = this.component; + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + ComponentStore.prototype.component = function (name) { + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function (nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance), true).reduce(function (obj, name) { + obj[name] = instance[name]; + return obj; + }, {}); +} +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUs3RSxJQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDdEcsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDcEcsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7SUFDcEcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtJQUNwRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTztJQUNuRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFpQmxCLElBQUssd0JBS0o7QUFMRCxXQUFLLHdCQUF3QjtJQUM1Qiw2SEFBK0IsQ0FBQTtJQUMvQixxSkFBMkMsQ0FBQTtJQUMzQyx1R0FBb0IsQ0FBQTtJ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 \ No newline at end of file From 2a090385482a832e88d5db253923d6ca686235c4 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Mon, 18 Sep 2023 00:43:41 +0000 Subject: [PATCH 26/33] [create-pull-request] update tsc build dist files --- index.d.ts | 12 +++ index.js | 13 +++ src/Component.d.ts | 83 +++++++++++++++++++ src/Component.js | 15 ++++ src/Global.d.ts | 48 +++++++++++ src/Global.js | 25 ++++++ src/Plugin.d.ts | 48 +++++++++++ src/Plugin.js | 69 ++++++++++++++++ src/Store.d.ts | 64 +++++++++++++++ src/Store.js | 194 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 571 insertions(+) create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 src/Component.d.ts create mode 100644 src/Component.js create mode 100644 src/Global.d.ts create mode 100644 src/Global.js create mode 100644 src/Plugin.d.ts create mode 100644 src/Plugin.js create mode 100644 src/Store.d.ts create mode 100644 src/Store.js diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..77a0b2b --- /dev/null +++ b/index.d.ts @@ -0,0 +1,12 @@ +/** + * Export functions and types. + */ +export { type KnownClassConstructor, type KnownConstructor, type AlpineComponentConstructor, type AlpineDataContext, type AlpineData, AlpineComponent } from './src/Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; diff --git a/index.js b/index.js new file mode 100644 index 0000000..a36034b --- /dev/null +++ b/index.js @@ -0,0 +1,13 @@ +/** + * Export functions and types. + */ +export { AlpineComponent } from './src/Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './src/Store'; +export * as Globals from './src/Global'; +export { AlpineComponents, componentsPlugin } from './src/Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './src/Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFNTixlQUFlLEVBQ2YsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBRU4sY0FBYyxFQUNkLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUNOLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsTUFBTSxjQUFjLENBQUM7QUFHdEI7O0dBRUc7QUFDSCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDOUMsZUFBZSxnQkFBZ0IsQ0FBQyJ9 \ No newline at end of file diff --git a/src/Component.d.ts b/src/Component.d.ts new file mode 100644 index 0000000..62827cc --- /dev/null +++ b/src/Component.d.ts @@ -0,0 +1,83 @@ +/** + * Type definition for known class constructors. + */ +export type KnownClassConstructor = new (...args: any[]) => T; +/** + * Type definition for known generic constructors. + */ +export type KnownGenericConstructor = (...args: any[]) => T; +/** + * Type definition for supported constructor functions. + */ +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +/** + * Type definition for alpine component constructors. + */ +export type AlpineComponentConstructor = (...args: any[]) => any; +/** + * Copied from @types/alpinejs because it isn't exported. + */ +export declare interface AlpineDataContext { + /** + * Will be executed before Alpine initializes teh rest of the component. + */ + init?(): void; + [stateKey: string]: any; +} +/** + * Copied from @types/alpinejs because it isn't exported. + */ +export declare type AlpineData = AlpineDataContext | string | number | boolean; +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + */ +export declare abstract class AlpineComponent implements AlpineDataContext { + /** + * Access to current Alpine data. + */ + $data: this; + /** + * Retrieve the current DOM node. + */ + $el: HTMLElement; + /** + * Retrieve DOM elements marked with x-ref inside the component. + */ + $refs: Record; + /** + * Access registered global Alpine stores. + */ + $store: AlpineData; + /** + * Dispatch browser events. + * + * @param event the event name + * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property + */ + $dispatch: (event: string, data?: any) => void; + /** + * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. + * + * @param name the name of the id + * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop + */ + $id: (name: string, key?: number | string) => string; + /** + * Execute a given expression AFTER Alpine has made its reactive DOM updates. + * + * @param callback a callback that will be fired after Alpine finishes updating the DOM + */ + $nextTick: (callback?: () => void) => Promise; + /** + * Fire the given callback when the value in the property is changed. + * + * @param property the component property + * @param callback a callback that will fire when a given property is changed + */ + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; +} diff --git a/src/Component.js b/src/Component.js new file mode 100644 index 0000000..b90bcc0 --- /dev/null +++ b/src/Component.js @@ -0,0 +1,15 @@ +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + */ +var AlpineComponent = /** @class */ (function () { + function AlpineComponent() { + } + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9DQTs7Ozs7OztHQU9HO0FBQ0g7SUFBQTtJQXdEQSxDQUFDO0lBQUQsc0JBQUM7QUFBRCxDQUFDLEFBeERELElBd0RDIn0= \ No newline at end of file diff --git a/src/Global.d.ts b/src/Global.d.ts new file mode 100644 index 0000000..3086771 --- /dev/null +++ b/src/Global.d.ts @@ -0,0 +1,48 @@ +/** + * Type declarations for Alpine and browser window global. + */ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from './Store'; +import type { AlpineComponentConstructor } from './Component'; +/** + * Define the properties we add to the window.Alpine object. + */ +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +/** + * Expose the properties we add to the window.Alpine object. + */ +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +/** + * Expose the properties we add to the window.Alpine object. + */ +export declare type Alpine = AlpineType | AlpineWithComponents; +/** + * Check if an {@link Alpine} object has the components properties. + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export declare function satisfiesAlpineWithComponents(obj: Alpine): boolean; +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export declare function castToAlpineWithComponents(obj?: Alpine): AlpineWithComponents | null; +declare global { + /** + * Expose window.Alpine and window.AlpineComponents globals. + */ + interface Window { + Alpine: AlpineWithComponents; + AlpineComponents: ComponentStore; + } +} diff --git a/src/Global.js b/src/Global.js new file mode 100644 index 0000000..60635da --- /dev/null +++ b/src/Global.js @@ -0,0 +1,25 @@ +/** + * Check if an {@link Alpine} object has the components properties. + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export function satisfiesAlpineWithComponents(obj) { + // @ts-ignore + return !!(obj.Components && obj.component); +} +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export function castToAlpineWithComponents(obj) { + if (obj === void 0) { obj = window.Alpine; } + return satisfiesAlpineWithComponents(obj) ? obj : null; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlCQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsR0FBVztJQUN4RCxhQUFhO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsR0FBMkI7SUFBM0Isb0JBQUEsRUFBQSxNQUFjLE1BQU0sQ0FBQyxNQUFNO0lBQ3JFLE9BQU8sNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUF1QixHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM5RSxDQUFDIn0= \ No newline at end of file diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts new file mode 100644 index 0000000..99f7cf3 --- /dev/null +++ b/src/Plugin.d.ts @@ -0,0 +1,48 @@ +import type Alpine from 'alpinejs'; +import type * as Globals from './Global'; +import { type ComponentList } from './Store'; +export declare namespace AlpineComponents { + /** + * Bootstrap options. + */ + interface Options { + /** + * List of named components to register. + */ + components: ComponentList; + /** + * Create Alpine object and inject into window.Alpine? + */ + bootstrapAlpine: boolean; + /** + * Call Alpine.start()? + */ + startAlpine: boolean; + /** + * Log errors to console? + */ + logErrors: boolean; + } + /** + * Default bootstrap options. + * + * Assumes production environment. + */ + const defaultOptions: Options; + /** + * Bootstrap the components package. + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options?: Partial, alpine?: typeof Alpine): void; +} +/** + * Export a function to be used with alpine.plugin(). + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js new file mode 100644 index 0000000..042b647 --- /dev/null +++ b/src/Plugin.js @@ -0,0 +1,69 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from './Store'; +export var AlpineComponents; +(function (AlpineComponents) { + /** + * Default bootstrap options. + * + * Assumes production environment. + */ + AlpineComponents.defaultOptions = { + components: {}, + bootstrapAlpine: false, + startAlpine: true, + logErrors: false + }; + /** + * Bootstrap the components package. + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + if (opts.bootstrapAlpine && alpine !== undefined) { + if (opts.logErrors) { + console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); + } + return; + } + Promise.resolve(opts.bootstrapAlpine ? + import('alpinejs').then(function (imp) { return imp.default; }) : alpine).then(function (alpine) { + if (opts.bootstrapAlpine) { + window.Alpine = alpine; + } + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + }); + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +/** + * Export a function to be used with alpine.plugin(). + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + bootstrapAlpine: false, + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUEsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBK0VoQztBQS9FRCxXQUFpQixnQkFBZ0I7SUEwQmhDOzs7O09BSUc7SUFDVSwrQkFBYyxHQUFZO1FBQ3RDLFVBQVUsRUFBRSxFQUFFO1FBRWQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFFakIsU0FBUyxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILFNBQWdCLFNBQVMsQ0FDeEIsT0FBMEMsRUFDMUMsTUFBcUM7UUFEckMsd0JBQUEsRUFBQSxVQUE0QiwrQkFBYztRQUMxQyx1QkFBQSxFQUFBLFNBQXdCLE1BQU0sQ0FBQyxNQUFNO1FBRXJDLElBQU0sSUFBSSx5QkFDTixpQkFBQSxjQUFjLEdBQ2QsT0FBTyxDQUNWLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUNqRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQzthQUNoRjtZQUNELE9BQU87U0FDUDtRQUVELE9BQU8sQ0FBQyxPQUFPLENBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxHQUFHLElBQUssT0FBQSxHQUFHLENBQUMsT0FBTyxFQUFYLENBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQ3ZELENBQUMsSUFBSSxDQUFDLFVBQUMsTUFBcUI7WUFDNUIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN6QixNQUFNLENBQUMsTUFBTSxHQUFpQyxNQUFNLENBQUM7YUFDckQ7WUFFRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXRGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2Y7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUE5QmUsMEJBQVMsWUE4QnhCLENBQUE7QUFFRixDQUFDLEVBL0VnQixnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBK0VoQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFzQjtJQUN0RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDMUIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLEtBQUs7S0FDbEIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNaLENBQUMifQ== \ No newline at end of file diff --git a/src/Store.d.ts b/src/Store.d.ts new file mode 100644 index 0000000..8bbca78 --- /dev/null +++ b/src/Store.d.ts @@ -0,0 +1,64 @@ +import type Alpine from 'alpinejs'; +import type * as Impl from './Component'; +import { AlpineComponent } from './Component'; +/** + * Type definition for list of named component constructors. + */ +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private readonly logErrors; + private initialized; + private alpine; + private components; + constructor(alpinejs: typeof Alpine, components?: ComponentList, logErrors?: boolean); + private init; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + /** + * Register a generic object (alpine data) as a component. + * + * @param name The name of the component (registered to alpine for use with x-data.) + * @param component The function that returns component data. + */ + register(name: string, component: Impl.KnownConstructor): void; + /** + * Register a class inheriting from {@link Impl.AlpineComponent} as a component. + * + * @param component The name/symbol of the class to register as a component. + * @param name The name of the component (registered to alpine for use with x-data.) + */ + register(component: Impl.KnownClassConstructor, name?: string): void; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export declare function transformToAlpineData(instance: T): object; +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js new file mode 100644 index 0000000..643145e --- /dev/null +++ b/src/Store.js @@ -0,0 +1,194 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from './Component'; +/** + * @see https://www.w3schools.com/js/js_reserved.asp + */ +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = /** @class */ (function () { + function ComponentStore(alpinejs, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + this.alpine = alpinejs; + this.alpine.Components = this; + this.alpine.component = this.component; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + ComponentStore.prototype.component = function (name) { + // @ts-ignore + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function ( + // @ts-expect-error TS3244 + nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { // register class as component + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + // @ts-ignore + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + // should be impossible because we fall back to prototype name + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance) // properties + , true).reduce(function (obj, name) { + // @ts-ignore + obj[name] = instance[name]; + return obj; + }, {}); +} +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFJQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUU3RTs7R0FFRztBQUNILElBQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUN0RyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUNwRyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSztJQUNwRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQ25HLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQWlCbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVH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 \ No newline at end of file From 1d550f95bb152e7be5b2d94496740951227552e6 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Mon, 25 Sep 2023 08:09:10 +0000 Subject: [PATCH 27/33] [create-pull-request] update tsc build dist files --- dist/Component.js | 41 +++++++ dist/Global.js | 29 +++++ dist/Plugin.js | 75 +++++++++++++ dist/Store.js | 201 +++++++++++++++++++++++++++++++++ dist/index.js | 13 +++ src/Component.ts | 161 --------------------------- src/Global.ts | 73 ------------ src/Plugin.ts | 109 ------------------ src/Store.ts | 256 ------------------------------------------- src/index.ts | 35 ------ types/Component.d.ts | 135 +++++++++++++++++++++++ types/Global.d.ts | 60 ++++++++++ types/Plugin.d.ts | 56 ++++++++++ types/Store.d.ts | 66 +++++++++++ types/index.d.ts | 12 ++ 15 files changed, 688 insertions(+), 634 deletions(-) create mode 100644 dist/Component.js create mode 100644 dist/Global.js create mode 100644 dist/Plugin.js create mode 100644 dist/Store.js create mode 100644 dist/index.js delete mode 100644 src/Component.ts delete mode 100644 src/Global.ts delete mode 100644 src/Plugin.ts delete mode 100644 src/Store.ts delete mode 100644 src/index.ts create mode 100644 types/Component.d.ts create mode 100644 types/Global.d.ts create mode 100644 types/Plugin.d.ts create mode 100644 types/Store.d.ts create mode 100644 types/index.d.ts diff --git a/dist/Component.js b/dist/Component.js new file mode 100644 index 0000000..d9eb78a --- /dev/null +++ b/dist/Component.js @@ -0,0 +1,41 @@ +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +var AlpineComponent = /** @class */ (function () { + function AlpineComponent() { + } + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + AlpineComponent.prototype.binding = function (obj) { + return obj; + }; + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxRUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSDtJQUFBO0lBK0VBLENBQUM7SUF2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNPLGlDQUFPLEdBQWpCLFVBQWtELEdBQXVEO1FBQ3hHLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVGLHNCQUFDO0FBQUQsQ0FBQyxBQS9FRCxJQStFQyJ9 \ No newline at end of file diff --git a/dist/Global.js b/dist/Global.js new file mode 100644 index 0000000..914352e --- /dev/null +++ b/dist/Global.js @@ -0,0 +1,29 @@ +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export function satisfiesAlpineWithComponents(obj) { + // @ts-ignore + return !!(obj.Components && obj.component); +} +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export function castToAlpineWithComponents(obj) { + if (obj === void 0) { obj = window.Alpine; } + return satisfiesAlpineWithComponents(obj) ? obj : null; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsR0FBVztJQUN4RCxhQUFhO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxHQUEyQjtJQUEzQixvQkFBQSxFQUFBLE1BQWMsTUFBTSxDQUFDLE1BQU07SUFDckUsT0FBTyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzlFLENBQUMifQ== \ No newline at end of file diff --git a/dist/Plugin.js b/dist/Plugin.js new file mode 100644 index 0000000..48405e6 --- /dev/null +++ b/dist/Plugin.js @@ -0,0 +1,75 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from './Store'; +export var AlpineComponents; +(function (AlpineComponents) { + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + AlpineComponents.defaultOptions = { + components: {}, + bootstrapAlpine: false, + startAlpine: true, + logErrors: false + }; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + if (opts.bootstrapAlpine && alpine !== undefined) { + if (opts.logErrors) { + console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); + } + return; + } + Promise.resolve(opts.bootstrapAlpine ? + import('alpinejs').then(function (imp) { return imp.default; }) : alpine).then(function (alpine) { + if (opts.bootstrapAlpine) { + window.Alpine = alpine; + } + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + }); + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + bootstrapAlpine: false, + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBLE9BQU8sRUFFTixjQUFjLEVBQ2QsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxLQUFXLGdCQUFnQixDQXFGaEM7QUFyRkQsV0FBaUIsZ0JBQWdCO0lBNEJoQzs7Ozs7O09BTUc7SUFDVSwrQkFBYyxHQUFZO1FBQ3RDLFVBQVUsRUFBRSxFQUFFO1FBRWQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFFakIsU0FBUyxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUVGOzs7Ozs7OztPQVFHO0lBQ0gsU0FBZ0IsU0FBUyxDQUN4QixPQUEwQyxFQUMxQyxNQUFxQztRQURyQyx3QkFBQSxFQUFBLFVBQTRCLCtCQUFjO1FBQzFDLHVCQUFBLEVBQUEsU0FBd0IsTUFBTSxDQUFDLE1BQU07UUFFckMsSUFBTSxJQUFJLHlCQUNOLGlCQUFBLGNBQWMsR0FDZCxPQUFPLENBQ1YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTztTQUNQO1FBRUQsT0FBTyxDQUFDLE9BQU8sQ0FDZCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxPQUFPLEVBQVgsQ0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxJQUFJLENBQUMsVUFBQyxNQUFxQjtZQUM1QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3pCLE1BQU0sQ0FBQyxNQUFNLEdBQWlDLE1BQU0sQ0FBQzthQUNyRDtZQUVELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNyQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDZjtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQTlCZSwwQkFBUyxZQThCeEIsQ0FBQTtBQUVGLENBQUMsRUFyRmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFxRmhDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBc0I7SUFDdEQsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1FBQzFCLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLFdBQVcsRUFBRSxLQUFLO0tBQ2xCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDWixDQUFDIn0= \ No newline at end of file diff --git a/dist/Store.js b/dist/Store.js new file mode 100644 index 0000000..7066f9a --- /dev/null +++ b/dist/Store.js @@ -0,0 +1,201 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from './Component'; +/** + * @see https://www.w3schools.com/js/js_reserved.asp + * + * @internal + */ +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +/** + * Internal component registration failure reasons. + * + * @internal + */ +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = /** @class */ (function () { + function ComponentStore(alpinejs, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + this.alpine = alpinejs; + this.alpine.Components = this; + this.alpine.component = this.component; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + ComponentStore.prototype.component = function (name) { + // @ts-ignore + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function ( + // @ts-expect-error TS3244 + nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { // register class as component + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + // @ts-ignore + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + // should be impossible because we fall back to prototype name + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance) // properties + , true).reduce(function (obj, name) { + // @ts-ignore + obj[name] = instance[name]; + return obj; + }, {}); +} +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBSUEsT0FBTyxFQUFDLGVBQWUsRUFBa0MsTUFBTSxhQUFhLENBQUM7QUFFN0U7Ozs7R0FJRztBQUNILElBQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUN0RyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUNwRyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSztJQUNwRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQ25HLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQXFCbEI7Ozs7R0FJRztBQUNILElBQUssd0JBS0o7QUFMRCxXQUFLLHdCQUF3QjtJQUM1Qiw2SEFBK0IsQ0FBQTtJQUMv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 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..6cbf7c1 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,13 @@ +/** + * Export functions and types. + */ +export { AlpineComponent } from './Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBUU4sZUFBZSxFQUNmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFFTixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUdsQjs7R0FFRztBQUNILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMxQyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.ts b/src/Component.ts deleted file mode 100644 index fab0602..0000000 --- a/src/Component.ts +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Type definition for known class constructors. - * - * @public - */ -export type KnownClassConstructor = new (...args: any[]) => T; -/** - * Type definition for known generic constructors. - * - * @public - */ -export type KnownGenericConstructor = (...args: any[]) => T; -/** - * Type definition for supported constructor functions. - * - * @public - */ -export type KnownConstructor = KnownGenericConstructor| - // @ts-expect-error TS2344 - KnownClassConstructor; - -/** - * Type definition for alpine component constructors. - * - * @public - */ -export type AlpineComponentConstructor = (...args: any[]) => any; - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare interface AlpineDataContext { - /** - * Will be executed before Alpine initializes teh rest of the component. - */ - init?(): void; - [stateKey: string]: any; -} - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare type AlpineData = AlpineDataContext | string | number | boolean; - -/** - * Type used to define properties that will exist on an x-bind object at runtime. - * - * @template T The component type - * @template Keys The properties to expose to the context (defaults to everything - * accessible with `keyof`) - * @template HiddenKeys Define accessible properties (protected/private) that are - * not included by `keyof` - */ -export type AlpineBindingContext< - T extends AlpineComponent, - Keys extends keyof T = keyof T, - HiddenKeys extends string = '' -> = Record | (Pick & { - [K in HiddenKeys]: string | number | boolean; -}); - -/** - * Light-weight interface for class based components. - * - * Provides property declarations for Alpine magics that will exist when - * used as an Alpine component. - * - * Property declarations copied from @types/alpinejs. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export abstract class AlpineComponent implements AlpineDataContext { - - /** - * Access to current Alpine data. - */ - declare $data: this; - - /** - * Retrieve the current DOM node. - */ - declare $el: HTMLElement; - - /** - * Retrieve DOM elements marked with x-ref inside the component. - */ - declare $refs: Record; - - /** - * Access registered global Alpine stores. - */ - declare $store: AlpineData; - - /** - * Dispatch browser events. - * - * @param event the event name - * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property - */ - declare $dispatch: (event: string, data?: any) => void; - - /** - * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. - * - * @param name the name of the id - * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop - */ - declare $id: (name: string, key?: number | string) => string; - - /** - * Execute a given expression AFTER Alpine has made its reactive DOM updates. - * - * @param callback a callback that will be fired after Alpine finishes updating the DOM - */ - declare $nextTick: (callback?: () => void) => Promise; - - /** - * Fire the given callback when the value in the property is changed. - * - * @param property the component property - * @param callback a callback that will fire when a given property is changed - */ - declare $watch: ( - property: K, - callback: (newValue: V, oldValue: V) => void, - ) => void; - - /** - * Declare an object as an x-bind property for this component. - * - * Use this method to define properties for use with x-bind: - * ```typescript - * protected myBinding = this.binding({ - * ["@click.prevent"]() { console.log("click prevented!") } - * }); - * ``` - * - * @protected - * - * @template HiddenKeys Define accessible properties (protected/private) - * that are not included by `keyof` - * - * @param obj The object for use with x-bind - * - * @return The same object passed to {@link obj} - */ - protected binding(obj: AlpineBindingContext) { - return obj; - } - -} diff --git a/src/Global.ts b/src/Global.ts deleted file mode 100644 index 0b6c4bf..0000000 --- a/src/Global.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Type declarations for Alpine and browser window global. - */ -import type {Alpine as AlpineType} from 'alpinejs'; -import type {ComponentStore} from './Store'; -import type {AlpineComponentConstructor} from './Component'; - -/** - * Define the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare interface AlpineComponentMixins { - Components: ComponentStore; - component: (name: string) => AlpineComponentConstructor; -} - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type AlpineWithComponents = AlpineType&AlpineComponentMixins; - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type Alpine = AlpineType|AlpineWithComponents; - -/** - * Check if an {@link Alpine} object has the components properties. - * - * @public - * - * @param obj The Alpine object to check - * - * @return True if component properties are injected, false otherwise. - */ -export function satisfiesAlpineWithComponents(obj: Alpine): boolean { - // @ts-ignore - return !!(obj.Components && obj.component); -} - -/** - * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it - * has the injected properties. - * - * @public - * - * @param obj The Alpine object to cast - * - * @return The object cast to {@link AlpineWithComponents} if properties are - * injected, null otherwise. - */ -export function castToAlpineWithComponents(obj: Alpine = window.Alpine): AlpineWithComponents|null { - return satisfiesAlpineWithComponents(obj) ? obj : null; -} - -declare global { - - /** - * Expose window.Alpine and window.AlpineComponents globals. - * - * @public - */ - interface Window { - Alpine: AlpineWithComponents; - AlpineComponents: ComponentStore; - } - -} diff --git a/src/Plugin.ts b/src/Plugin.ts deleted file mode 100644 index 6bc6947..0000000 --- a/src/Plugin.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Globals from './Global'; -import { - type ComponentList, - ComponentStore -} from './Store'; - -export namespace AlpineComponents { - - /** - * Bootstrap options. - * - * @public - */ - export interface Options { - /** - * List of named components to register. - */ - components: ComponentList, - - /** - * Create Alpine object and inject into window.Alpine? - */ - bootstrapAlpine: boolean; - /** - * Call Alpine.start()? - */ - startAlpine: boolean; - - /** - * Log errors to console? - */ - logErrors: boolean; - } - - /** - * Default bootstrap options. - * - * Assumes production environment. - * - * @public - */ - export const defaultOptions: Options = { - components: {}, - - bootstrapAlpine: false, - startAlpine: true, - - logErrors: false - }; - - /** - * Bootstrap the components package. - * - * @public - * - * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) - * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when - * the bootstrapAlpine option is set) - */ - export function bootstrap( - options: Partial = defaultOptions, - alpine: typeof Alpine = window.Alpine - ): void { - const opts: Options = { - ...defaultOptions, - ...options - }; - - if (opts.bootstrapAlpine && alpine !== undefined) { - if (opts.logErrors) { - console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); - } - return; - } - - Promise.resolve( - opts.bootstrapAlpine ? - import('alpinejs').then((imp) => imp.default) : alpine - ).then((alpine: typeof Alpine): void => { - if (opts.bootstrapAlpine) { - window.Alpine = alpine; - } - - window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); - - if (opts.startAlpine) { - alpine.start(); - } - }); - } - -} - -/** - * Export a function to be used with `Alpine.plugin()`. - * - * @public - * - * Calls {@link AlpineComponents.bootstrap} with sensible options. - * - * @param alpine - */ -export function componentsPlugin(alpine: Globals.Alpine) { - AlpineComponents.bootstrap({ - bootstrapAlpine: false, - startAlpine: false - }, alpine); -} diff --git a/src/Store.ts b/src/Store.ts deleted file mode 100644 index 7e62333..0000000 --- a/src/Store.ts +++ /dev/null @@ -1,256 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Impl from './Component'; -import type * as Globals from './Global'; - -import {AlpineComponent, type AlpineComponentConstructor} from './Component'; - -/** - * @see https://www.w3schools.com/js/js_reserved.asp - * - * @internal - */ -const ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', - 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', - 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', - 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', - 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', - 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', - 'with', 'yield']; - -/** - * Type definition for list of named component constructors. - * - * @public - */ -export type ComponentList = { - [name: string]: Impl.KnownConstructor -}; - -/** - * Internal type for component registration. - * - * @internal - */ -type ComponentConstructorData = { - name: string, - constructor: Impl.AlpineComponentConstructor -}; - -/** - * Internal component registration failure reasons. - * - * @internal - */ -enum RegisterComponentFailure { - GenericMustHaveFunctionAsSecond, - NameMustBeProvidedForComponentWithNoDefault, - UnknownArgumentTypes, - ReservedName -} - -export class ComponentStore { - private initialized: boolean = false; - - private alpine: Globals.AlpineWithComponents; - - private components: Record = {}; - - constructor( - alpinejs: typeof Alpine, - components: ComponentList = {}, - private readonly logErrors: boolean = false - ) { - this.alpine = alpinejs; - this.alpine.Components = this; - this.alpine.component = this.component; - - Object.entries(components).forEach(([name, component]): void => { - this.register(name, component); - }); - - window.addEventListener('alpine:init', (): void => { - this.init(); - }); - } - - private init(): void { - if (this.initialized) { - return; - } - - document.dispatchEvent(new CustomEvent('alpine-components:init')); - - Object.entries(this.components) - .forEach(([name]) => - this.registerConstructorAsAlpineData(name)); - - this.initialized = true; - } - - /** - * Retrieve a registered component constructor. - * - * @param name The component name - * - * @return ComponentConstructor - * - * If registered, returns a callable that accepts the component constructor arguments - * and creates the component object. Returns undefined if not registered. - */ - component(name: string): Impl.AlpineComponentConstructor { - // @ts-ignore - return this.components[name]; - } - - registerAll(components: ComponentList): void { - Object.entries(components) - .forEach(([name, component]) => - this.register(name, component)); - } - - /** - * Register a generic object (alpine data) as a component. - * - * @param name The name of the component (registered to alpine for use with x-data.) - * @param component The function that returns component data. - */ - register(name: string, component: Impl.KnownConstructor): void; - - /** - * Register a class inheriting from {@link Impl.AlpineComponent} as a component. - * - * @param component The name/symbol of the class to register as a component. - * @param name The name of the component (registered to alpine for use with x-data.) - */ - register(component: Impl.KnownClassConstructor, name?: string): void; - - register( - // @ts-expect-error TS3244 - nameOrComponentClass: string|Impl.KnownConstructor|Impl.KnownClassConstructor, - constructorOrComponentName: Impl.KnownConstructor|string = '' - ): void { - let component: ComponentConstructorData; - - if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) - if (typeof constructorOrComponentName === 'string') { - this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); - return; - } - component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); - } else if (typeof nameOrComponentClass === 'function') { // register class as component - component = ComponentStore.getClassData(>nameOrComponentClass, constructorOrComponentName); - if (component.name === "") { - this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); - } - } else { - this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); - return; - } - - if (ReservedNames.includes(component.name)) { - this.logRegisterFailure(RegisterComponentFailure.ReservedName); - } - - this.components[component.name] = component.constructor; - - if (this.initialized) { - this.registerConstructorAsAlpineData(component.name); - } - } - - /** - * Register a component to Alpine through Alpine.data(). - * - * @param name The name of the component (must already be registered to the store.) - */ - private registerConstructorAsAlpineData(name: string): void { - this.alpine.data(name, this.component(name)); - } - - private static getObjectData( - name: string, - component: Impl.KnownConstructor - ): ComponentConstructorData { - return { - name: name, - constructor: ((component.prototype instanceof AlpineComponent) ? - // @ts-ignore - makeAlpineConstructor(component) : component) - }; - } - - private static getClassData( - component: Impl.KnownClassConstructor, - name?: string - ): ComponentConstructorData { - const resolvedName: string = (name !== undefined ? name : component.prototype.name); - - return { - name: resolvedName, - constructor: makeAlpineConstructor(component) - }; - } - - private logRegisterFailure(reason: RegisterComponentFailure): void { - if (!this.logErrors) { - return; - } - - switch (reason) { - case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: - console.error(`Second argument must be a constructor function for component.`); - break; - case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: - // should be impossible because we fall back to prototype name - console.error(`Component name must be provided when class doesn't specify a default.`); - break; - case RegisterComponentFailure.UnknownArgumentTypes: - console.error(`Cannot register component with provided argument types. Check Typescript definitions for usage.`); - break; - case RegisterComponentFailure.ReservedName: - console.error(`Cannot register component with name matching a reserved keyword.`); - break; - } - } - -} - -/** - * Copy prototype functions and object properties to an empty object. - * - * @param instance The object to copy functions and properties from - */ -export function transformToAlpineData(instance: T): object { - let methodNames: string[] = []; - for ( - let prototype = Object.getPrototypeOf(instance); - prototype.constructor.name !== 'Object'; - prototype = Object.getPrototypeOf(prototype) - ) { - Object.getOwnPropertyNames(prototype).forEach((name: string): void => { - if (methodNames.includes(name)) { - return; - } - methodNames.push(name); - }); - } - - return [ - ...methodNames, // methods - ...Object.getOwnPropertyNames(instance) // properties - ].reduce((obj: {}, name: string) => { - // @ts-ignore - obj[name] = instance[name]; - - return obj; - }, {}); -} - -/** - * Transform a class constructor into an alpine constructor function. - * - * @param component The class constructor - */ -export function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor { - return (...args: any[]) => transformToAlpineData(new component(...args)); -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index ca546e5..0000000 --- a/src/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Export functions and types. - */ - -export { - type AlpineBindingContext, - type AlpineComponentConstructor, - type AlpineData, - type AlpineDataContext, - type KnownConstructor, - type KnownClassConstructor, - type KnownGenericConstructor, - AlpineComponent -} from './Component'; - -export { - type ComponentList, - ComponentStore, - transformToAlpineData, - makeAlpineConstructor -} from './Store'; - -export * as Globals from './Global'; - -export { - AlpineComponents, - componentsPlugin -} from './Plugin'; - - -/** - * Alpine plugin as default export. - */ -import {componentsPlugin} from './Plugin'; -export default componentsPlugin; diff --git a/types/Component.d.ts b/types/Component.d.ts new file mode 100644 index 0000000..8f6ce9d --- /dev/null +++ b/types/Component.d.ts @@ -0,0 +1,135 @@ +/** + * Type definition for known class constructors. + * + * @public + */ +export type KnownClassConstructor = new (...args: any[]) => T; +/** + * Type definition for known generic constructors. + * + * @public + */ +export type KnownGenericConstructor = (...args: any[]) => T; +/** + * Type definition for supported constructor functions. + * + * @public + */ +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +/** + * Type definition for alpine component constructors. + * + * @public + */ +export type AlpineComponentConstructor = (...args: any[]) => any; +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare interface AlpineDataContext { + /** + * Will be executed before Alpine initializes teh rest of the component. + */ + init?(): void; + [stateKey: string]: any; +} +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare type AlpineData = AlpineDataContext | string | number | boolean; +/** + * Type used to define properties that will exist on an x-bind object at runtime. + * + * @template T The component type + * @template Keys The properties to expose to the context (defaults to everything + * accessible with `keyof`) + * @template HiddenKeys Define accessible properties (protected/private) that are + * not included by `keyof` + */ +export type AlpineBindingContext = Record | (Pick & { + [K in HiddenKeys]: string | number | boolean; +}); +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare abstract class AlpineComponent implements AlpineDataContext { + /** + * Access to current Alpine data. + */ + $data: this; + /** + * Retrieve the current DOM node. + */ + $el: HTMLElement; + /** + * Retrieve DOM elements marked with x-ref inside the component. + */ + $refs: Record; + /** + * Access registered global Alpine stores. + */ + $store: AlpineData; + /** + * Dispatch browser events. + * + * @param event the event name + * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property + */ + $dispatch: (event: string, data?: any) => void; + /** + * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. + * + * @param name the name of the id + * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop + */ + $id: (name: string, key?: number | string) => string; + /** + * Execute a given expression AFTER Alpine has made its reactive DOM updates. + * + * @param callback a callback that will be fired after Alpine finishes updating the DOM + */ + $nextTick: (callback?: () => void) => Promise; + /** + * Fire the given callback when the value in the property is changed. + * + * @param property the component property + * @param callback a callback that will fire when a given property is changed + */ + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + protected binding(obj: AlpineBindingContext): AlpineBindingContext; +} diff --git a/types/Global.d.ts b/types/Global.d.ts new file mode 100644 index 0000000..973da58 --- /dev/null +++ b/types/Global.d.ts @@ -0,0 +1,60 @@ +/** + * Type declarations for Alpine and browser window global. + */ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from './Store'; +import type { AlpineComponentConstructor } from './Component'; +/** + * Define the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type Alpine = AlpineType | AlpineWithComponents; +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export declare function satisfiesAlpineWithComponents(obj: Alpine): boolean; +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export declare function castToAlpineWithComponents(obj?: Alpine): AlpineWithComponents | null; +declare global { + /** + * Expose window.Alpine and window.AlpineComponents globals. + * + * @public + */ + interface Window { + Alpine: AlpineWithComponents; + AlpineComponents: ComponentStore; + } +} diff --git a/types/Plugin.d.ts b/types/Plugin.d.ts new file mode 100644 index 0000000..0a83d57 --- /dev/null +++ b/types/Plugin.d.ts @@ -0,0 +1,56 @@ +import type Alpine from 'alpinejs'; +import type * as Globals from './Global'; +import { type ComponentList } from './Store'; +export declare namespace AlpineComponents { + /** + * Bootstrap options. + * + * @public + */ + interface Options { + /** + * List of named components to register. + */ + components: ComponentList; + /** + * Create Alpine object and inject into window.Alpine? + */ + bootstrapAlpine: boolean; + /** + * Call Alpine.start()? + */ + startAlpine: boolean; + /** + * Log errors to console? + */ + logErrors: boolean; + } + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + const defaultOptions: Options; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options?: Partial, alpine?: typeof Alpine): void; +} +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/types/Store.d.ts b/types/Store.d.ts new file mode 100644 index 0000000..695e678 --- /dev/null +++ b/types/Store.d.ts @@ -0,0 +1,66 @@ +import type Alpine from 'alpinejs'; +import type * as Impl from './Component'; +import { AlpineComponent } from './Component'; +/** + * Type definition for list of named component constructors. + * + * @public + */ +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private readonly logErrors; + private initialized; + private alpine; + private components; + constructor(alpinejs: typeof Alpine, components?: ComponentList, logErrors?: boolean); + private init; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + /** + * Register a generic object (alpine data) as a component. + * + * @param name The name of the component (registered to alpine for use with x-data.) + * @param component The function that returns component data. + */ + register(name: string, component: Impl.KnownConstructor): void; + /** + * Register a class inheriting from {@link Impl.AlpineComponent} as a component. + * + * @param component The name/symbol of the class to register as a component. + * @param name The name of the component (registered to alpine for use with x-data.) + */ + register(component: Impl.KnownClassConstructor, name?: string): void; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export declare function transformToAlpineData(instance: T): object; +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..e4004f6 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,12 @@ +/** + * Export functions and types. + */ +export { type AlpineBindingContext, type AlpineComponentConstructor, type AlpineData, type AlpineDataContext, type KnownConstructor, type KnownClassConstructor, type KnownGenericConstructor, AlpineComponent } from './Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; From 70c4d3f6dc2c024e7f4392cde4c0fece42a853a0 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Mon, 25 Sep 2023 18:19:04 +1000 Subject: [PATCH 28/33] remove src dir --- src/Component.d.ts | 83 ------------------- src/Component.js | 15 ---- src/Global.d.ts | 48 ----------- src/Global.js | 25 ------ src/Plugin.d.ts | 48 ----------- src/Plugin.js | 69 ---------------- src/Store.d.ts | 64 --------------- src/Store.js | 194 --------------------------------------------- 8 files changed, 546 deletions(-) delete mode 100644 src/Component.d.ts delete mode 100644 src/Component.js delete mode 100644 src/Global.d.ts delete mode 100644 src/Global.js delete mode 100644 src/Plugin.d.ts delete mode 100644 src/Plugin.js delete mode 100644 src/Store.d.ts delete mode 100644 src/Store.js diff --git a/src/Component.d.ts b/src/Component.d.ts deleted file mode 100644 index 62827cc..0000000 --- a/src/Component.d.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Type definition for known class constructors. - */ -export type KnownClassConstructor = new (...args: any[]) => T; -/** - * Type definition for known generic constructors. - */ -export type KnownGenericConstructor = (...args: any[]) => T; -/** - * Type definition for supported constructor functions. - */ -export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; -/** - * Type definition for alpine component constructors. - */ -export type AlpineComponentConstructor = (...args: any[]) => any; -/** - * Copied from @types/alpinejs because it isn't exported. - */ -export declare interface AlpineDataContext { - /** - * Will be executed before Alpine initializes teh rest of the component. - */ - init?(): void; - [stateKey: string]: any; -} -/** - * Copied from @types/alpinejs because it isn't exported. - */ -export declare type AlpineData = AlpineDataContext | string | number | boolean; -/** - * Light-weight interface for class based components. - * - * Provides property declarations for Alpine magics that will exist when - * used as an Alpine component. - * - * Property declarations copied from @types/alpinejs. - */ -export declare abstract class AlpineComponent implements AlpineDataContext { - /** - * Access to current Alpine data. - */ - $data: this; - /** - * Retrieve the current DOM node. - */ - $el: HTMLElement; - /** - * Retrieve DOM elements marked with x-ref inside the component. - */ - $refs: Record; - /** - * Access registered global Alpine stores. - */ - $store: AlpineData; - /** - * Dispatch browser events. - * - * @param event the event name - * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property - */ - $dispatch: (event: string, data?: any) => void; - /** - * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. - * - * @param name the name of the id - * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop - */ - $id: (name: string, key?: number | string) => string; - /** - * Execute a given expression AFTER Alpine has made its reactive DOM updates. - * - * @param callback a callback that will be fired after Alpine finishes updating the DOM - */ - $nextTick: (callback?: () => void) => Promise; - /** - * Fire the given callback when the value in the property is changed. - * - * @param property the component property - * @param callback a callback that will fire when a given property is changed - */ - $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; -} diff --git a/src/Component.js b/src/Component.js deleted file mode 100644 index 0c3f12c..0000000 --- a/src/Component.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Light-weight interface for class based components. - * - * Provides property declarations for Alpine magics that will exist when - * used as an Alpine component. - * - * Property declarations copied from @types/alpinejs. - */ -var AlpineComponent = /** @class */ (function () { - function AlpineComponent() { - } - return AlpineComponent; -}()); -export { AlpineComponent }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9DQTs7Ozs7OztHQU9HO0FBQ0g7SUFBQTtJQXdEQSxDQUFDO0lBQUQsc0JBQUM7QUFBRCxDQUFDLEFBeERELElBd0RDIn0= diff --git a/src/Global.d.ts b/src/Global.d.ts deleted file mode 100644 index 3086771..0000000 --- a/src/Global.d.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Type declarations for Alpine and browser window global. - */ -import type { Alpine as AlpineType } from 'alpinejs'; -import type { ComponentStore } from './Store'; -import type { AlpineComponentConstructor } from './Component'; -/** - * Define the properties we add to the window.Alpine object. - */ -export declare interface AlpineComponentMixins { - Components: ComponentStore; - component: (name: string) => AlpineComponentConstructor; -} -/** - * Expose the properties we add to the window.Alpine object. - */ -export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; -/** - * Expose the properties we add to the window.Alpine object. - */ -export declare type Alpine = AlpineType | AlpineWithComponents; -/** - * Check if an {@link Alpine} object has the components properties. - * - * @param obj The Alpine object to check - * - * @return True if component properties are injected, false otherwise. - */ -export declare function satisfiesAlpineWithComponents(obj: Alpine): boolean; -/** - * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it - * has the injected properties. - * - * @param obj The Alpine object to cast - * - * @return The object cast to {@link AlpineWithComponents} if properties are - * injected, null otherwise. - */ -export declare function castToAlpineWithComponents(obj?: Alpine): AlpineWithComponents | null; -declare global { - /** - * Expose window.Alpine and window.AlpineComponents globals. - */ - interface Window { - Alpine: AlpineWithComponents; - AlpineComponents: ComponentStore; - } -} diff --git a/src/Global.js b/src/Global.js deleted file mode 100644 index 5f33a78..0000000 --- a/src/Global.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Check if an {@link Alpine} object has the components properties. - * - * @param obj The Alpine object to check - * - * @return True if component properties are injected, false otherwise. - */ -export function satisfiesAlpineWithComponents(obj) { - // @ts-ignore - return !!(obj.Components && obj.component); -} -/** - * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it - * has the injected properties. - * - * @param obj The Alpine object to cast - * - * @return The object cast to {@link AlpineWithComponents} if properties are - * injected, null otherwise. - */ -export function castToAlpineWithComponents(obj) { - if (obj === void 0) { obj = window.Alpine; } - return satisfiesAlpineWithComponents(obj) ? obj : null; -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlCQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsR0FBVztJQUN4RCxhQUFhO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsR0FBMkI7SUFBM0Isb0JBQUEsRUFBQSxNQUFjLE1BQU0sQ0FBQyxNQUFNO0lBQ3JFLE9BQU8sNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUF1QixHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM5RSxDQUFDIn0= diff --git a/src/Plugin.d.ts b/src/Plugin.d.ts deleted file mode 100644 index 99f7cf3..0000000 --- a/src/Plugin.d.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Globals from './Global'; -import { type ComponentList } from './Store'; -export declare namespace AlpineComponents { - /** - * Bootstrap options. - */ - interface Options { - /** - * List of named components to register. - */ - components: ComponentList; - /** - * Create Alpine object and inject into window.Alpine? - */ - bootstrapAlpine: boolean; - /** - * Call Alpine.start()? - */ - startAlpine: boolean; - /** - * Log errors to console? - */ - logErrors: boolean; - } - /** - * Default bootstrap options. - * - * Assumes production environment. - */ - const defaultOptions: Options; - /** - * Bootstrap the components package. - * - * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) - * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when - * the bootstrapAlpine option is set) - */ - function bootstrap(options?: Partial, alpine?: typeof Alpine): void; -} -/** - * Export a function to be used with alpine.plugin(). - * - * Calls {@link AlpineComponents.bootstrap} with sensible options. - * - * @param alpine - */ -export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/src/Plugin.js b/src/Plugin.js deleted file mode 100644 index 4c49eb1..0000000 --- a/src/Plugin.js +++ /dev/null @@ -1,69 +0,0 @@ -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -import { ComponentStore } from './Store'; -export var AlpineComponents; -(function (AlpineComponents) { - /** - * Default bootstrap options. - * - * Assumes production environment. - */ - AlpineComponents.defaultOptions = { - components: {}, - bootstrapAlpine: false, - startAlpine: true, - logErrors: false - }; - /** - * Bootstrap the components package. - * - * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) - * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when - * the bootstrapAlpine option is set) - */ - function bootstrap(options, alpine) { - if (options === void 0) { options = AlpineComponents.defaultOptions; } - if (alpine === void 0) { alpine = window.Alpine; } - var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); - if (opts.bootstrapAlpine && alpine !== undefined) { - if (opts.logErrors) { - console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); - } - return; - } - Promise.resolve(opts.bootstrapAlpine ? - import('alpinejs').then(function (imp) { return imp.default; }) : alpine).then(function (alpine) { - if (opts.bootstrapAlpine) { - window.Alpine = alpine; - } - window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); - if (opts.startAlpine) { - alpine.start(); - } - }); - } - AlpineComponents.bootstrap = bootstrap; -})(AlpineComponents || (AlpineComponents = {})); -/** - * Export a function to be used with alpine.plugin(). - * - * Calls {@link AlpineComponents.bootstrap} with sensible options. - * - * @param alpine - */ -export function componentsPlugin(alpine) { - AlpineComponents.bootstrap({ - bootstrapAlpine: false, - startAlpine: false - }, alpine); -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUEsT0FBTyxFQUVOLGNBQWMsRUFDZCxNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLEtBQVcsZ0JBQWdCLENBK0VoQztBQS9FRCxXQUFpQixnQkFBZ0I7SUEwQmhDOzs7O09BSUc7SUFDVSwrQkFBYyxHQUFZO1FBQ3RDLFVBQVUsRUFBRSxFQUFFO1FBRWQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFFakIsU0FBUyxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILFNBQWdCLFNBQVMsQ0FDeEIsT0FBMEMsRUFDMUMsTUFBcUM7UUFEckMsd0JBQUEsRUFBQSxVQUE0QiwrQkFBYztRQUMxQyx1QkFBQSxFQUFBLFNBQXdCLE1BQU0sQ0FBQyxNQUFNO1FBRXJDLElBQU0sSUFBSSx5QkFDTixpQkFBQSxjQUFjLEdBQ2QsT0FBTyxDQUNWLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUNqRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQzthQUNoRjtZQUNELE9BQU87U0FDUDtRQUVELE9BQU8sQ0FBQyxPQUFPLENBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxHQUFHLElBQUssT0FBQSxHQUFHLENBQUMsT0FBTyxFQUFYLENBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQ3ZELENBQUMsSUFBSSxDQUFDLFVBQUMsTUFBcUI7WUFDNUIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN6QixNQUFNLENBQUMsTUFBTSxHQUFpQyxNQUFNLENBQUM7YUFDckQ7WUFFRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXRGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2Y7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUE5QmUsMEJBQVMsWUE4QnhCLENBQUE7QUFFRixDQUFDLEVBL0VnQixnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBK0VoQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFzQjtJQUN0RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDMUIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLEtBQUs7S0FDbEIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNaLENBQUMifQ== diff --git a/src/Store.d.ts b/src/Store.d.ts deleted file mode 100644 index 8bbca78..0000000 --- a/src/Store.d.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Impl from './Component'; -import { AlpineComponent } from './Component'; -/** - * Type definition for list of named component constructors. - */ -export type ComponentList = { - [name: string]: Impl.KnownConstructor; -}; -export declare class ComponentStore { - private readonly logErrors; - private initialized; - private alpine; - private components; - constructor(alpinejs: typeof Alpine, components?: ComponentList, logErrors?: boolean); - private init; - /** - * Retrieve a registered component constructor. - * - * @param name The component name - * - * @return ComponentConstructor - * - * If registered, returns a callable that accepts the component constructor arguments - * and creates the component object. Returns undefined if not registered. - */ - component(name: string): Impl.AlpineComponentConstructor; - registerAll(components: ComponentList): void; - /** - * Register a generic object (alpine data) as a component. - * - * @param name The name of the component (registered to alpine for use with x-data.) - * @param component The function that returns component data. - */ - register(name: string, component: Impl.KnownConstructor): void; - /** - * Register a class inheriting from {@link Impl.AlpineComponent} as a component. - * - * @param component The name/symbol of the class to register as a component. - * @param name The name of the component (registered to alpine for use with x-data.) - */ - register(component: Impl.KnownClassConstructor, name?: string): void; - /** - * Register a component to Alpine through Alpine.data(). - * - * @param name The name of the component (must already be registered to the store.) - */ - private registerConstructorAsAlpineData; - private static getObjectData; - private static getClassData; - private logRegisterFailure; -} -/** - * Copy prototype functions and object properties to an empty object. - * - * @param instance The object to copy functions and properties from - */ -export declare function transformToAlpineData(instance: T): object; -/** - * Transform a class constructor into an alpine constructor function. - * - * @param component The class constructor - */ -export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/src/Store.js b/src/Store.js deleted file mode 100644 index 8f60ee5..0000000 --- a/src/Store.js +++ /dev/null @@ -1,194 +0,0 @@ -var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); -}; -import { AlpineComponent } from './Component'; -/** - * @see https://www.w3schools.com/js/js_reserved.asp - */ -var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', - 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', - 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', - 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', - 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', - 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', - 'with', 'yield']; -var RegisterComponentFailure; -(function (RegisterComponentFailure) { - RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; - RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; - RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; - RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; -})(RegisterComponentFailure || (RegisterComponentFailure = {})); -var ComponentStore = /** @class */ (function () { - function ComponentStore(alpinejs, components, logErrors) { - var _this = this; - if (components === void 0) { components = {}; } - if (logErrors === void 0) { logErrors = false; } - this.logErrors = logErrors; - this.initialized = false; - this.components = {}; - this.alpine = alpinejs; - this.alpine.Components = this; - this.alpine.component = this.component; - Object.entries(components).forEach(function (_a) { - var name = _a[0], component = _a[1]; - _this.register(name, component); - }); - window.addEventListener('alpine:init', function () { - _this.init(); - }); - } - ComponentStore.prototype.init = function () { - var _this = this; - if (this.initialized) { - return; - } - document.dispatchEvent(new CustomEvent('alpine-components:init')); - Object.entries(this.components) - .forEach(function (_a) { - var name = _a[0]; - return _this.registerConstructorAsAlpineData(name); - }); - this.initialized = true; - }; - /** - * Retrieve a registered component constructor. - * - * @param name The component name - * - * @return ComponentConstructor - * - * If registered, returns a callable that accepts the component constructor arguments - * and creates the component object. Returns undefined if not registered. - */ - ComponentStore.prototype.component = function (name) { - // @ts-ignore - return this.components[name]; - }; - ComponentStore.prototype.registerAll = function (components) { - var _this = this; - Object.entries(components) - .forEach(function (_a) { - var name = _a[0], component = _a[1]; - return _this.register(name, component); - }); - }; - ComponentStore.prototype.register = function ( - // @ts-expect-error TS3244 - nameOrComponentClass, constructorOrComponentName) { - if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } - var component; - if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) - if (typeof constructorOrComponentName === 'string') { - this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); - return; - } - component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); - } - else if (typeof nameOrComponentClass === 'function') { // register class as component - component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); - if (component.name === "") { - this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); - } - } - else { - this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); - return; - } - if (ReservedNames.includes(component.name)) { - this.logRegisterFailure(RegisterComponentFailure.ReservedName); - } - this.components[component.name] = component.constructor; - if (this.initialized) { - this.registerConstructorAsAlpineData(component.name); - } - }; - /** - * Register a component to Alpine through Alpine.data(). - * - * @param name The name of the component (must already be registered to the store.) - */ - ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { - this.alpine.data(name, this.component(name)); - }; - ComponentStore.getObjectData = function (name, component) { - return { - name: name, - constructor: ((component.prototype instanceof AlpineComponent) ? - // @ts-ignore - makeAlpineConstructor(component) : component) - }; - }; - ComponentStore.getClassData = function (component, name) { - var resolvedName = (name !== undefined ? name : component.prototype.name); - return { - name: resolvedName, - constructor: makeAlpineConstructor(component) - }; - }; - ComponentStore.prototype.logRegisterFailure = function (reason) { - if (!this.logErrors) { - return; - } - switch (reason) { - case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: - console.error("Second argument must be a constructor function for component."); - break; - case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: - // should be impossible because we fall back to prototype name - console.error("Component name must be provided when class doesn't specify a default."); - break; - case RegisterComponentFailure.UnknownArgumentTypes: - console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); - break; - case RegisterComponentFailure.ReservedName: - console.error("Cannot register component with name matching a reserved keyword."); - break; - } - }; - return ComponentStore; -}()); -export { ComponentStore }; -/** - * Copy prototype functions and object properties to an empty object. - * - * @param instance The object to copy functions and properties from - */ -export function transformToAlpineData(instance) { - var methodNames = []; - for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { - Object.getOwnPropertyNames(prototype).forEach(function (name) { - if (methodNames.includes(name)) { - return; - } - methodNames.push(name); - }); - } - return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance) // properties - , true).reduce(function (obj, name) { - // @ts-ignore - obj[name] = instance[name]; - return obj; - }, {}); -} -/** - * Transform a class constructor into an alpine constructor function. - * - * @param component The class constructor - */ -export function makeAlpineConstructor(component) { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); - }; -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFJQSxPQUFPLEVBQUMsZUFBZSxFQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUU3RTs7R0FFRztBQUNILElBQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUN0RyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUNwRyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSztJQUNwRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQ25HLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQWlCbEIsSUFBSyx3QkFLSjtBQUxELFdBQUssd0JBQXdCO0lBQzVCLDZIQUErQixDQUFBO0lBQy9CLHFKQUEyQyxDQUFBO0lBQzNDLHVH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 From 636c972654142f4cfe2a5d2f8c2256c4cd4d3122 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Mon, 25 Sep 2023 08:27:41 +0000 Subject: [PATCH 29/33] [create-pull-request] update tsc build dist files --- dist/Component.js | 41 +++++++ dist/Global.js | 29 +++++ dist/Plugin.js | 75 +++++++++++++ dist/Store.js | 201 +++++++++++++++++++++++++++++++++ dist/index.js | 13 +++ src/Component.ts | 161 --------------------------- src/Global.ts | 73 ------------ src/Plugin.ts | 109 ------------------ src/Store.ts | 256 ------------------------------------------- src/index.ts | 35 ------ types/Component.d.ts | 135 +++++++++++++++++++++++ types/Global.d.ts | 60 ++++++++++ types/Plugin.d.ts | 56 ++++++++++ types/Store.d.ts | 66 +++++++++++ types/index.d.ts | 12 ++ 15 files changed, 688 insertions(+), 634 deletions(-) create mode 100644 dist/Component.js create mode 100644 dist/Global.js create mode 100644 dist/Plugin.js create mode 100644 dist/Store.js create mode 100644 dist/index.js delete mode 100644 src/Component.ts delete mode 100644 src/Global.ts delete mode 100644 src/Plugin.ts delete mode 100644 src/Store.ts delete mode 100644 src/index.ts create mode 100644 types/Component.d.ts create mode 100644 types/Global.d.ts create mode 100644 types/Plugin.d.ts create mode 100644 types/Store.d.ts create mode 100644 types/index.d.ts diff --git a/dist/Component.js b/dist/Component.js new file mode 100644 index 0000000..d9eb78a --- /dev/null +++ b/dist/Component.js @@ -0,0 +1,41 @@ +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +var AlpineComponent = /** @class */ (function () { + function AlpineComponent() { + } + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + AlpineComponent.prototype.binding = function (obj) { + return obj; + }; + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxRUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSDtJQUFBO0lBK0VBLENBQUM7SUF2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNPLGlDQUFPLEdBQWpCLFVBQWtELEdBQXVEO1FBQ3hHLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVGLHNCQUFDO0FBQUQsQ0FBQyxBQS9FRCxJQStFQyJ9 \ No newline at end of file diff --git a/dist/Global.js b/dist/Global.js new file mode 100644 index 0000000..914352e --- /dev/null +++ b/dist/Global.js @@ -0,0 +1,29 @@ +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export function satisfiesAlpineWithComponents(obj) { + // @ts-ignore + return !!(obj.Components && obj.component); +} +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export function castToAlpineWithComponents(obj) { + if (obj === void 0) { obj = window.Alpine; } + return satisfiesAlpineWithComponents(obj) ? obj : null; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsR0FBVztJQUN4RCxhQUFhO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxHQUEyQjtJQUEzQixvQkFBQSxFQUFBLE1BQWMsTUFBTSxDQUFDLE1BQU07SUFDckUsT0FBTyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzlFLENBQUMifQ== \ No newline at end of file diff --git a/dist/Plugin.js b/dist/Plugin.js new file mode 100644 index 0000000..48405e6 --- /dev/null +++ b/dist/Plugin.js @@ -0,0 +1,75 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from './Store'; +export var AlpineComponents; +(function (AlpineComponents) { + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + AlpineComponents.defaultOptions = { + components: {}, + bootstrapAlpine: false, + startAlpine: true, + logErrors: false + }; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + if (opts.bootstrapAlpine && alpine !== undefined) { + if (opts.logErrors) { + console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); + } + return; + } + Promise.resolve(opts.bootstrapAlpine ? + import('alpinejs').then(function (imp) { return imp.default; }) : alpine).then(function (alpine) { + if (opts.bootstrapAlpine) { + window.Alpine = alpine; + } + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + }); + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + bootstrapAlpine: false, + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBLE9BQU8sRUFFTixjQUFjLEVBQ2QsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxLQUFXLGdCQUFnQixDQXFGaEM7QUFyRkQsV0FBaUIsZ0JBQWdCO0lBNEJoQzs7Ozs7O09BTUc7SUFDVSwrQkFBYyxHQUFZO1FBQ3RDLFVBQVUsRUFBRSxFQUFFO1FBRWQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFFakIsU0FBUyxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUVGOzs7Ozs7OztPQVFHO0lBQ0gsU0FBZ0IsU0FBUyxDQUN4QixPQUEwQyxFQUMxQyxNQUFxQztRQURyQyx3QkFBQSxFQUFBLFVBQTRCLCtCQUFjO1FBQzFDLHVCQUFBLEVBQUEsU0FBd0IsTUFBTSxDQUFDLE1BQU07UUFFckMsSUFBTSxJQUFJLHlCQUNOLGlCQUFBLGNBQWMsR0FDZCxPQUFPLENBQ1YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTztTQUNQO1FBRUQsT0FBTyxDQUFDLE9BQU8sQ0FDZCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxPQUFPLEVBQVgsQ0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxJQUFJLENBQUMsVUFBQyxNQUFxQjtZQUM1QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3pCLE1BQU0sQ0FBQyxNQUFNLEdBQWlDLE1BQU0sQ0FBQzthQUNyRDtZQUVELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNyQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDZjtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQTlCZSwwQkFBUyxZQThCeEIsQ0FBQTtBQUVGLENBQUMsRUFyRmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFxRmhDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBc0I7SUFDdEQsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1FBQzFCLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLFdBQVcsRUFBRSxLQUFLO0tBQ2xCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDWixDQUFDIn0= \ No newline at end of file diff --git a/dist/Store.js b/dist/Store.js new file mode 100644 index 0000000..7066f9a --- /dev/null +++ b/dist/Store.js @@ -0,0 +1,201 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from './Component'; +/** + * @see https://www.w3schools.com/js/js_reserved.asp + * + * @internal + */ +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +/** + * Internal component registration failure reasons. + * + * @internal + */ +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = /** @class */ (function () { + function ComponentStore(alpinejs, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + this.alpine = alpinejs; + this.alpine.Components = this; + this.alpine.component = this.component; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + ComponentStore.prototype.component = function (name) { + // @ts-ignore + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function ( + // @ts-expect-error TS3244 + nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { // register class as component + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + // @ts-ignore + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + // should be impossible because we fall back to prototype name + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance) // properties + , true).reduce(function (obj, name) { + // @ts-ignore + obj[name] = instance[name]; + return obj; + }, {}); +} +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBSUEsT0FBTyxFQUFDLGVBQWUsRUFBa0MsTUFBTSxhQUFhLENBQUM7QUFFN0U7Ozs7R0FJRztBQUNILElBQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUN0RyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUNwRyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSztJQUNwRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQ25HLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQXFCbEI7Ozs7R0FJRztBQUNILElBQUssd0JBS0o7QUFMRCxXQUFLLHdCQUF3QjtJQUM1Qiw2SEFBK0IsQ0FBQTtJQUMv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 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..6cbf7c1 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,13 @@ +/** + * Export functions and types. + */ +export { AlpineComponent } from './Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBUU4sZUFBZSxFQUNmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFFTixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUdsQjs7R0FFRztBQUNILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMxQyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.ts b/src/Component.ts deleted file mode 100644 index fab0602..0000000 --- a/src/Component.ts +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Type definition for known class constructors. - * - * @public - */ -export type KnownClassConstructor = new (...args: any[]) => T; -/** - * Type definition for known generic constructors. - * - * @public - */ -export type KnownGenericConstructor = (...args: any[]) => T; -/** - * Type definition for supported constructor functions. - * - * @public - */ -export type KnownConstructor = KnownGenericConstructor| - // @ts-expect-error TS2344 - KnownClassConstructor; - -/** - * Type definition for alpine component constructors. - * - * @public - */ -export type AlpineComponentConstructor = (...args: any[]) => any; - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare interface AlpineDataContext { - /** - * Will be executed before Alpine initializes teh rest of the component. - */ - init?(): void; - [stateKey: string]: any; -} - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare type AlpineData = AlpineDataContext | string | number | boolean; - -/** - * Type used to define properties that will exist on an x-bind object at runtime. - * - * @template T The component type - * @template Keys The properties to expose to the context (defaults to everything - * accessible with `keyof`) - * @template HiddenKeys Define accessible properties (protected/private) that are - * not included by `keyof` - */ -export type AlpineBindingContext< - T extends AlpineComponent, - Keys extends keyof T = keyof T, - HiddenKeys extends string = '' -> = Record | (Pick & { - [K in HiddenKeys]: string | number | boolean; -}); - -/** - * Light-weight interface for class based components. - * - * Provides property declarations for Alpine magics that will exist when - * used as an Alpine component. - * - * Property declarations copied from @types/alpinejs. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export abstract class AlpineComponent implements AlpineDataContext { - - /** - * Access to current Alpine data. - */ - declare $data: this; - - /** - * Retrieve the current DOM node. - */ - declare $el: HTMLElement; - - /** - * Retrieve DOM elements marked with x-ref inside the component. - */ - declare $refs: Record; - - /** - * Access registered global Alpine stores. - */ - declare $store: AlpineData; - - /** - * Dispatch browser events. - * - * @param event the event name - * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property - */ - declare $dispatch: (event: string, data?: any) => void; - - /** - * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. - * - * @param name the name of the id - * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop - */ - declare $id: (name: string, key?: number | string) => string; - - /** - * Execute a given expression AFTER Alpine has made its reactive DOM updates. - * - * @param callback a callback that will be fired after Alpine finishes updating the DOM - */ - declare $nextTick: (callback?: () => void) => Promise; - - /** - * Fire the given callback when the value in the property is changed. - * - * @param property the component property - * @param callback a callback that will fire when a given property is changed - */ - declare $watch: ( - property: K, - callback: (newValue: V, oldValue: V) => void, - ) => void; - - /** - * Declare an object as an x-bind property for this component. - * - * Use this method to define properties for use with x-bind: - * ```typescript - * protected myBinding = this.binding({ - * ["@click.prevent"]() { console.log("click prevented!") } - * }); - * ``` - * - * @protected - * - * @template HiddenKeys Define accessible properties (protected/private) - * that are not included by `keyof` - * - * @param obj The object for use with x-bind - * - * @return The same object passed to {@link obj} - */ - protected binding(obj: AlpineBindingContext) { - return obj; - } - -} diff --git a/src/Global.ts b/src/Global.ts deleted file mode 100644 index 0b6c4bf..0000000 --- a/src/Global.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Type declarations for Alpine and browser window global. - */ -import type {Alpine as AlpineType} from 'alpinejs'; -import type {ComponentStore} from './Store'; -import type {AlpineComponentConstructor} from './Component'; - -/** - * Define the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare interface AlpineComponentMixins { - Components: ComponentStore; - component: (name: string) => AlpineComponentConstructor; -} - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type AlpineWithComponents = AlpineType&AlpineComponentMixins; - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type Alpine = AlpineType|AlpineWithComponents; - -/** - * Check if an {@link Alpine} object has the components properties. - * - * @public - * - * @param obj The Alpine object to check - * - * @return True if component properties are injected, false otherwise. - */ -export function satisfiesAlpineWithComponents(obj: Alpine): boolean { - // @ts-ignore - return !!(obj.Components && obj.component); -} - -/** - * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it - * has the injected properties. - * - * @public - * - * @param obj The Alpine object to cast - * - * @return The object cast to {@link AlpineWithComponents} if properties are - * injected, null otherwise. - */ -export function castToAlpineWithComponents(obj: Alpine = window.Alpine): AlpineWithComponents|null { - return satisfiesAlpineWithComponents(obj) ? obj : null; -} - -declare global { - - /** - * Expose window.Alpine and window.AlpineComponents globals. - * - * @public - */ - interface Window { - Alpine: AlpineWithComponents; - AlpineComponents: ComponentStore; - } - -} diff --git a/src/Plugin.ts b/src/Plugin.ts deleted file mode 100644 index 6bc6947..0000000 --- a/src/Plugin.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Globals from './Global'; -import { - type ComponentList, - ComponentStore -} from './Store'; - -export namespace AlpineComponents { - - /** - * Bootstrap options. - * - * @public - */ - export interface Options { - /** - * List of named components to register. - */ - components: ComponentList, - - /** - * Create Alpine object and inject into window.Alpine? - */ - bootstrapAlpine: boolean; - /** - * Call Alpine.start()? - */ - startAlpine: boolean; - - /** - * Log errors to console? - */ - logErrors: boolean; - } - - /** - * Default bootstrap options. - * - * Assumes production environment. - * - * @public - */ - export const defaultOptions: Options = { - components: {}, - - bootstrapAlpine: false, - startAlpine: true, - - logErrors: false - }; - - /** - * Bootstrap the components package. - * - * @public - * - * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) - * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when - * the bootstrapAlpine option is set) - */ - export function bootstrap( - options: Partial = defaultOptions, - alpine: typeof Alpine = window.Alpine - ): void { - const opts: Options = { - ...defaultOptions, - ...options - }; - - if (opts.bootstrapAlpine && alpine !== undefined) { - if (opts.logErrors) { - console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); - } - return; - } - - Promise.resolve( - opts.bootstrapAlpine ? - import('alpinejs').then((imp) => imp.default) : alpine - ).then((alpine: typeof Alpine): void => { - if (opts.bootstrapAlpine) { - window.Alpine = alpine; - } - - window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); - - if (opts.startAlpine) { - alpine.start(); - } - }); - } - -} - -/** - * Export a function to be used with `Alpine.plugin()`. - * - * @public - * - * Calls {@link AlpineComponents.bootstrap} with sensible options. - * - * @param alpine - */ -export function componentsPlugin(alpine: Globals.Alpine) { - AlpineComponents.bootstrap({ - bootstrapAlpine: false, - startAlpine: false - }, alpine); -} diff --git a/src/Store.ts b/src/Store.ts deleted file mode 100644 index 7e62333..0000000 --- a/src/Store.ts +++ /dev/null @@ -1,256 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Impl from './Component'; -import type * as Globals from './Global'; - -import {AlpineComponent, type AlpineComponentConstructor} from './Component'; - -/** - * @see https://www.w3schools.com/js/js_reserved.asp - * - * @internal - */ -const ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', - 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', - 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', - 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', - 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', - 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', - 'with', 'yield']; - -/** - * Type definition for list of named component constructors. - * - * @public - */ -export type ComponentList = { - [name: string]: Impl.KnownConstructor -}; - -/** - * Internal type for component registration. - * - * @internal - */ -type ComponentConstructorData = { - name: string, - constructor: Impl.AlpineComponentConstructor -}; - -/** - * Internal component registration failure reasons. - * - * @internal - */ -enum RegisterComponentFailure { - GenericMustHaveFunctionAsSecond, - NameMustBeProvidedForComponentWithNoDefault, - UnknownArgumentTypes, - ReservedName -} - -export class ComponentStore { - private initialized: boolean = false; - - private alpine: Globals.AlpineWithComponents; - - private components: Record = {}; - - constructor( - alpinejs: typeof Alpine, - components: ComponentList = {}, - private readonly logErrors: boolean = false - ) { - this.alpine = alpinejs; - this.alpine.Components = this; - this.alpine.component = this.component; - - Object.entries(components).forEach(([name, component]): void => { - this.register(name, component); - }); - - window.addEventListener('alpine:init', (): void => { - this.init(); - }); - } - - private init(): void { - if (this.initialized) { - return; - } - - document.dispatchEvent(new CustomEvent('alpine-components:init')); - - Object.entries(this.components) - .forEach(([name]) => - this.registerConstructorAsAlpineData(name)); - - this.initialized = true; - } - - /** - * Retrieve a registered component constructor. - * - * @param name The component name - * - * @return ComponentConstructor - * - * If registered, returns a callable that accepts the component constructor arguments - * and creates the component object. Returns undefined if not registered. - */ - component(name: string): Impl.AlpineComponentConstructor { - // @ts-ignore - return this.components[name]; - } - - registerAll(components: ComponentList): void { - Object.entries(components) - .forEach(([name, component]) => - this.register(name, component)); - } - - /** - * Register a generic object (alpine data) as a component. - * - * @param name The name of the component (registered to alpine for use with x-data.) - * @param component The function that returns component data. - */ - register(name: string, component: Impl.KnownConstructor): void; - - /** - * Register a class inheriting from {@link Impl.AlpineComponent} as a component. - * - * @param component The name/symbol of the class to register as a component. - * @param name The name of the component (registered to alpine for use with x-data.) - */ - register(component: Impl.KnownClassConstructor, name?: string): void; - - register( - // @ts-expect-error TS3244 - nameOrComponentClass: string|Impl.KnownConstructor|Impl.KnownClassConstructor, - constructorOrComponentName: Impl.KnownConstructor|string = '' - ): void { - let component: ComponentConstructorData; - - if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) - if (typeof constructorOrComponentName === 'string') { - this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); - return; - } - component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); - } else if (typeof nameOrComponentClass === 'function') { // register class as component - component = ComponentStore.getClassData(>nameOrComponentClass, constructorOrComponentName); - if (component.name === "") { - this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); - } - } else { - this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); - return; - } - - if (ReservedNames.includes(component.name)) { - this.logRegisterFailure(RegisterComponentFailure.ReservedName); - } - - this.components[component.name] = component.constructor; - - if (this.initialized) { - this.registerConstructorAsAlpineData(component.name); - } - } - - /** - * Register a component to Alpine through Alpine.data(). - * - * @param name The name of the component (must already be registered to the store.) - */ - private registerConstructorAsAlpineData(name: string): void { - this.alpine.data(name, this.component(name)); - } - - private static getObjectData( - name: string, - component: Impl.KnownConstructor - ): ComponentConstructorData { - return { - name: name, - constructor: ((component.prototype instanceof AlpineComponent) ? - // @ts-ignore - makeAlpineConstructor(component) : component) - }; - } - - private static getClassData( - component: Impl.KnownClassConstructor, - name?: string - ): ComponentConstructorData { - const resolvedName: string = (name !== undefined ? name : component.prototype.name); - - return { - name: resolvedName, - constructor: makeAlpineConstructor(component) - }; - } - - private logRegisterFailure(reason: RegisterComponentFailure): void { - if (!this.logErrors) { - return; - } - - switch (reason) { - case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: - console.error(`Second argument must be a constructor function for component.`); - break; - case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: - // should be impossible because we fall back to prototype name - console.error(`Component name must be provided when class doesn't specify a default.`); - break; - case RegisterComponentFailure.UnknownArgumentTypes: - console.error(`Cannot register component with provided argument types. Check Typescript definitions for usage.`); - break; - case RegisterComponentFailure.ReservedName: - console.error(`Cannot register component with name matching a reserved keyword.`); - break; - } - } - -} - -/** - * Copy prototype functions and object properties to an empty object. - * - * @param instance The object to copy functions and properties from - */ -export function transformToAlpineData(instance: T): object { - let methodNames: string[] = []; - for ( - let prototype = Object.getPrototypeOf(instance); - prototype.constructor.name !== 'Object'; - prototype = Object.getPrototypeOf(prototype) - ) { - Object.getOwnPropertyNames(prototype).forEach((name: string): void => { - if (methodNames.includes(name)) { - return; - } - methodNames.push(name); - }); - } - - return [ - ...methodNames, // methods - ...Object.getOwnPropertyNames(instance) // properties - ].reduce((obj: {}, name: string) => { - // @ts-ignore - obj[name] = instance[name]; - - return obj; - }, {}); -} - -/** - * Transform a class constructor into an alpine constructor function. - * - * @param component The class constructor - */ -export function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor { - return (...args: any[]) => transformToAlpineData(new component(...args)); -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index ca546e5..0000000 --- a/src/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Export functions and types. - */ - -export { - type AlpineBindingContext, - type AlpineComponentConstructor, - type AlpineData, - type AlpineDataContext, - type KnownConstructor, - type KnownClassConstructor, - type KnownGenericConstructor, - AlpineComponent -} from './Component'; - -export { - type ComponentList, - ComponentStore, - transformToAlpineData, - makeAlpineConstructor -} from './Store'; - -export * as Globals from './Global'; - -export { - AlpineComponents, - componentsPlugin -} from './Plugin'; - - -/** - * Alpine plugin as default export. - */ -import {componentsPlugin} from './Plugin'; -export default componentsPlugin; diff --git a/types/Component.d.ts b/types/Component.d.ts new file mode 100644 index 0000000..8f6ce9d --- /dev/null +++ b/types/Component.d.ts @@ -0,0 +1,135 @@ +/** + * Type definition for known class constructors. + * + * @public + */ +export type KnownClassConstructor = new (...args: any[]) => T; +/** + * Type definition for known generic constructors. + * + * @public + */ +export type KnownGenericConstructor = (...args: any[]) => T; +/** + * Type definition for supported constructor functions. + * + * @public + */ +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +/** + * Type definition for alpine component constructors. + * + * @public + */ +export type AlpineComponentConstructor = (...args: any[]) => any; +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare interface AlpineDataContext { + /** + * Will be executed before Alpine initializes teh rest of the component. + */ + init?(): void; + [stateKey: string]: any; +} +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare type AlpineData = AlpineDataContext | string | number | boolean; +/** + * Type used to define properties that will exist on an x-bind object at runtime. + * + * @template T The component type + * @template Keys The properties to expose to the context (defaults to everything + * accessible with `keyof`) + * @template HiddenKeys Define accessible properties (protected/private) that are + * not included by `keyof` + */ +export type AlpineBindingContext = Record | (Pick & { + [K in HiddenKeys]: string | number | boolean; +}); +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare abstract class AlpineComponent implements AlpineDataContext { + /** + * Access to current Alpine data. + */ + $data: this; + /** + * Retrieve the current DOM node. + */ + $el: HTMLElement; + /** + * Retrieve DOM elements marked with x-ref inside the component. + */ + $refs: Record; + /** + * Access registered global Alpine stores. + */ + $store: AlpineData; + /** + * Dispatch browser events. + * + * @param event the event name + * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property + */ + $dispatch: (event: string, data?: any) => void; + /** + * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. + * + * @param name the name of the id + * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop + */ + $id: (name: string, key?: number | string) => string; + /** + * Execute a given expression AFTER Alpine has made its reactive DOM updates. + * + * @param callback a callback that will be fired after Alpine finishes updating the DOM + */ + $nextTick: (callback?: () => void) => Promise; + /** + * Fire the given callback when the value in the property is changed. + * + * @param property the component property + * @param callback a callback that will fire when a given property is changed + */ + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + protected binding(obj: AlpineBindingContext): AlpineBindingContext; +} diff --git a/types/Global.d.ts b/types/Global.d.ts new file mode 100644 index 0000000..973da58 --- /dev/null +++ b/types/Global.d.ts @@ -0,0 +1,60 @@ +/** + * Type declarations for Alpine and browser window global. + */ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from './Store'; +import type { AlpineComponentConstructor } from './Component'; +/** + * Define the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type Alpine = AlpineType | AlpineWithComponents; +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export declare function satisfiesAlpineWithComponents(obj: Alpine): boolean; +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export declare function castToAlpineWithComponents(obj?: Alpine): AlpineWithComponents | null; +declare global { + /** + * Expose window.Alpine and window.AlpineComponents globals. + * + * @public + */ + interface Window { + Alpine: AlpineWithComponents; + AlpineComponents: ComponentStore; + } +} diff --git a/types/Plugin.d.ts b/types/Plugin.d.ts new file mode 100644 index 0000000..0a83d57 --- /dev/null +++ b/types/Plugin.d.ts @@ -0,0 +1,56 @@ +import type Alpine from 'alpinejs'; +import type * as Globals from './Global'; +import { type ComponentList } from './Store'; +export declare namespace AlpineComponents { + /** + * Bootstrap options. + * + * @public + */ + interface Options { + /** + * List of named components to register. + */ + components: ComponentList; + /** + * Create Alpine object and inject into window.Alpine? + */ + bootstrapAlpine: boolean; + /** + * Call Alpine.start()? + */ + startAlpine: boolean; + /** + * Log errors to console? + */ + logErrors: boolean; + } + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + const defaultOptions: Options; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options?: Partial, alpine?: typeof Alpine): void; +} +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/types/Store.d.ts b/types/Store.d.ts new file mode 100644 index 0000000..695e678 --- /dev/null +++ b/types/Store.d.ts @@ -0,0 +1,66 @@ +import type Alpine from 'alpinejs'; +import type * as Impl from './Component'; +import { AlpineComponent } from './Component'; +/** + * Type definition for list of named component constructors. + * + * @public + */ +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private readonly logErrors; + private initialized; + private alpine; + private components; + constructor(alpinejs: typeof Alpine, components?: ComponentList, logErrors?: boolean); + private init; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + /** + * Register a generic object (alpine data) as a component. + * + * @param name The name of the component (registered to alpine for use with x-data.) + * @param component The function that returns component data. + */ + register(name: string, component: Impl.KnownConstructor): void; + /** + * Register a class inheriting from {@link Impl.AlpineComponent} as a component. + * + * @param component The name/symbol of the class to register as a component. + * @param name The name of the component (registered to alpine for use with x-data.) + */ + register(component: Impl.KnownClassConstructor, name?: string): void; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export declare function transformToAlpineData(instance: T): object; +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..e4004f6 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,12 @@ +/** + * Export functions and types. + */ +export { type AlpineBindingContext, type AlpineComponentConstructor, type AlpineData, type AlpineDataContext, type KnownConstructor, type KnownClassConstructor, type KnownGenericConstructor, AlpineComponent } from './Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; From 139d1c07443482932e8a84a73c61f724a65757d3 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Mon, 25 Sep 2023 08:53:42 +0000 Subject: [PATCH 30/33] [create-pull-request] update tsc build dist files --- dist/Component.js | 41 +++++++ dist/Global.js | 29 +++++ dist/Plugin.js | 75 +++++++++++++ dist/Store.js | 201 +++++++++++++++++++++++++++++++++ dist/index.js | 13 +++ src/Component.ts | 161 --------------------------- src/Global.ts | 73 ------------ src/Plugin.ts | 109 ------------------ src/Store.ts | 256 ------------------------------------------- src/index.ts | 35 ------ types/Component.d.ts | 135 +++++++++++++++++++++++ types/Global.d.ts | 60 ++++++++++ types/Plugin.d.ts | 56 ++++++++++ types/Store.d.ts | 66 +++++++++++ types/index.d.ts | 12 ++ 15 files changed, 688 insertions(+), 634 deletions(-) create mode 100644 dist/Component.js create mode 100644 dist/Global.js create mode 100644 dist/Plugin.js create mode 100644 dist/Store.js create mode 100644 dist/index.js delete mode 100644 src/Component.ts delete mode 100644 src/Global.ts delete mode 100644 src/Plugin.ts delete mode 100644 src/Store.ts delete mode 100644 src/index.ts create mode 100644 types/Component.d.ts create mode 100644 types/Global.d.ts create mode 100644 types/Plugin.d.ts create mode 100644 types/Store.d.ts create mode 100644 types/index.d.ts diff --git a/dist/Component.js b/dist/Component.js new file mode 100644 index 0000000..d9eb78a --- /dev/null +++ b/dist/Component.js @@ -0,0 +1,41 @@ +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +var AlpineComponent = /** @class */ (function () { + function AlpineComponent() { + } + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + AlpineComponent.prototype.binding = function (obj) { + return obj; + }; + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxRUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSDtJQUFBO0lBK0VBLENBQUM7SUF2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNPLGlDQUFPLEdBQWpCLFVBQWtELEdBQXVEO1FBQ3hHLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVGLHNCQUFDO0FBQUQsQ0FBQyxBQS9FRCxJQStFQyJ9 \ No newline at end of file diff --git a/dist/Global.js b/dist/Global.js new file mode 100644 index 0000000..914352e --- /dev/null +++ b/dist/Global.js @@ -0,0 +1,29 @@ +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export function satisfiesAlpineWithComponents(obj) { + // @ts-ignore + return !!(obj.Components && obj.component); +} +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export function castToAlpineWithComponents(obj) { + if (obj === void 0) { obj = window.Alpine; } + return satisfiesAlpineWithComponents(obj) ? obj : null; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsR0FBVztJQUN4RCxhQUFhO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxHQUEyQjtJQUEzQixvQkFBQSxFQUFBLE1BQWMsTUFBTSxDQUFDLE1BQU07SUFDckUsT0FBTyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzlFLENBQUMifQ== \ No newline at end of file diff --git a/dist/Plugin.js b/dist/Plugin.js new file mode 100644 index 0000000..48405e6 --- /dev/null +++ b/dist/Plugin.js @@ -0,0 +1,75 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from './Store'; +export var AlpineComponents; +(function (AlpineComponents) { + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + AlpineComponents.defaultOptions = { + components: {}, + bootstrapAlpine: false, + startAlpine: true, + logErrors: false + }; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + if (opts.bootstrapAlpine && alpine !== undefined) { + if (opts.logErrors) { + console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); + } + return; + } + Promise.resolve(opts.bootstrapAlpine ? + import('alpinejs').then(function (imp) { return imp.default; }) : alpine).then(function (alpine) { + if (opts.bootstrapAlpine) { + window.Alpine = alpine; + } + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + }); + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + bootstrapAlpine: false, + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBLE9BQU8sRUFFTixjQUFjLEVBQ2QsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxLQUFXLGdCQUFnQixDQXFGaEM7QUFyRkQsV0FBaUIsZ0JBQWdCO0lBNEJoQzs7Ozs7O09BTUc7SUFDVSwrQkFBYyxHQUFZO1FBQ3RDLFVBQVUsRUFBRSxFQUFFO1FBRWQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFFakIsU0FBUyxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUVGOzs7Ozs7OztPQVFHO0lBQ0gsU0FBZ0IsU0FBUyxDQUN4QixPQUEwQyxFQUMxQyxNQUFxQztRQURyQyx3QkFBQSxFQUFBLFVBQTRCLCtCQUFjO1FBQzFDLHVCQUFBLEVBQUEsU0FBd0IsTUFBTSxDQUFDLE1BQU07UUFFckMsSUFBTSxJQUFJLHlCQUNOLGlCQUFBLGNBQWMsR0FDZCxPQUFPLENBQ1YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTztTQUNQO1FBRUQsT0FBTyxDQUFDLE9BQU8sQ0FDZCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxPQUFPLEVBQVgsQ0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxJQUFJLENBQUMsVUFBQyxNQUFxQjtZQUM1QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3pCLE1BQU0sQ0FBQyxNQUFNLEdBQWlDLE1BQU0sQ0FBQzthQUNyRDtZQUVELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNyQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDZjtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQTlCZSwwQkFBUyxZQThCeEIsQ0FBQTtBQUVGLENBQUMsRUFyRmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFxRmhDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBc0I7SUFDdEQsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1FBQzFCLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLFdBQVcsRUFBRSxLQUFLO0tBQ2xCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDWixDQUFDIn0= \ No newline at end of file diff --git a/dist/Store.js b/dist/Store.js new file mode 100644 index 0000000..7066f9a --- /dev/null +++ b/dist/Store.js @@ -0,0 +1,201 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from './Component'; +/** + * @see https://www.w3schools.com/js/js_reserved.asp + * + * @internal + */ +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +/** + * Internal component registration failure reasons. + * + * @internal + */ +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = /** @class */ (function () { + function ComponentStore(alpinejs, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + this.alpine = alpinejs; + this.alpine.Components = this; + this.alpine.component = this.component; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + ComponentStore.prototype.component = function (name) { + // @ts-ignore + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function ( + // @ts-expect-error TS3244 + nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { // register class as component + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + // @ts-ignore + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + // should be impossible because we fall back to prototype name + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance) // properties + , true).reduce(function (obj, name) { + // @ts-ignore + obj[name] = instance[name]; + return obj; + }, {}); +} +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBSUEsT0FBTyxFQUFDLGVBQWUsRUFBa0MsTUFBTSxhQUFhLENBQUM7QUFFN0U7Ozs7R0FJRztBQUNILElBQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUN0RyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUNwRyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSztJQUNwRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQ25HLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQXFCbEI7Ozs7R0FJRztBQUNILElBQUssd0JBS0o7QUFMRCxXQUFLLHdCQUF3QjtJQUM1Qiw2SEFBK0IsQ0FBQTtJQUMv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 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..6cbf7c1 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,13 @@ +/** + * Export functions and types. + */ +export { AlpineComponent } from './Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBUU4sZUFBZSxFQUNmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFFTixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUdsQjs7R0FFRztBQUNILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMxQyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.ts b/src/Component.ts deleted file mode 100644 index fab0602..0000000 --- a/src/Component.ts +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Type definition for known class constructors. - * - * @public - */ -export type KnownClassConstructor = new (...args: any[]) => T; -/** - * Type definition for known generic constructors. - * - * @public - */ -export type KnownGenericConstructor = (...args: any[]) => T; -/** - * Type definition for supported constructor functions. - * - * @public - */ -export type KnownConstructor = KnownGenericConstructor| - // @ts-expect-error TS2344 - KnownClassConstructor; - -/** - * Type definition for alpine component constructors. - * - * @public - */ -export type AlpineComponentConstructor = (...args: any[]) => any; - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare interface AlpineDataContext { - /** - * Will be executed before Alpine initializes teh rest of the component. - */ - init?(): void; - [stateKey: string]: any; -} - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare type AlpineData = AlpineDataContext | string | number | boolean; - -/** - * Type used to define properties that will exist on an x-bind object at runtime. - * - * @template T The component type - * @template Keys The properties to expose to the context (defaults to everything - * accessible with `keyof`) - * @template HiddenKeys Define accessible properties (protected/private) that are - * not included by `keyof` - */ -export type AlpineBindingContext< - T extends AlpineComponent, - Keys extends keyof T = keyof T, - HiddenKeys extends string = '' -> = Record | (Pick & { - [K in HiddenKeys]: string | number | boolean; -}); - -/** - * Light-weight interface for class based components. - * - * Provides property declarations for Alpine magics that will exist when - * used as an Alpine component. - * - * Property declarations copied from @types/alpinejs. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export abstract class AlpineComponent implements AlpineDataContext { - - /** - * Access to current Alpine data. - */ - declare $data: this; - - /** - * Retrieve the current DOM node. - */ - declare $el: HTMLElement; - - /** - * Retrieve DOM elements marked with x-ref inside the component. - */ - declare $refs: Record; - - /** - * Access registered global Alpine stores. - */ - declare $store: AlpineData; - - /** - * Dispatch browser events. - * - * @param event the event name - * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property - */ - declare $dispatch: (event: string, data?: any) => void; - - /** - * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. - * - * @param name the name of the id - * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop - */ - declare $id: (name: string, key?: number | string) => string; - - /** - * Execute a given expression AFTER Alpine has made its reactive DOM updates. - * - * @param callback a callback that will be fired after Alpine finishes updating the DOM - */ - declare $nextTick: (callback?: () => void) => Promise; - - /** - * Fire the given callback when the value in the property is changed. - * - * @param property the component property - * @param callback a callback that will fire when a given property is changed - */ - declare $watch: ( - property: K, - callback: (newValue: V, oldValue: V) => void, - ) => void; - - /** - * Declare an object as an x-bind property for this component. - * - * Use this method to define properties for use with x-bind: - * ```typescript - * protected myBinding = this.binding({ - * ["@click.prevent"]() { console.log("click prevented!") } - * }); - * ``` - * - * @protected - * - * @template HiddenKeys Define accessible properties (protected/private) - * that are not included by `keyof` - * - * @param obj The object for use with x-bind - * - * @return The same object passed to {@link obj} - */ - protected binding(obj: AlpineBindingContext) { - return obj; - } - -} diff --git a/src/Global.ts b/src/Global.ts deleted file mode 100644 index 0b6c4bf..0000000 --- a/src/Global.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Type declarations for Alpine and browser window global. - */ -import type {Alpine as AlpineType} from 'alpinejs'; -import type {ComponentStore} from './Store'; -import type {AlpineComponentConstructor} from './Component'; - -/** - * Define the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare interface AlpineComponentMixins { - Components: ComponentStore; - component: (name: string) => AlpineComponentConstructor; -} - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type AlpineWithComponents = AlpineType&AlpineComponentMixins; - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type Alpine = AlpineType|AlpineWithComponents; - -/** - * Check if an {@link Alpine} object has the components properties. - * - * @public - * - * @param obj The Alpine object to check - * - * @return True if component properties are injected, false otherwise. - */ -export function satisfiesAlpineWithComponents(obj: Alpine): boolean { - // @ts-ignore - return !!(obj.Components && obj.component); -} - -/** - * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it - * has the injected properties. - * - * @public - * - * @param obj The Alpine object to cast - * - * @return The object cast to {@link AlpineWithComponents} if properties are - * injected, null otherwise. - */ -export function castToAlpineWithComponents(obj: Alpine = window.Alpine): AlpineWithComponents|null { - return satisfiesAlpineWithComponents(obj) ? obj : null; -} - -declare global { - - /** - * Expose window.Alpine and window.AlpineComponents globals. - * - * @public - */ - interface Window { - Alpine: AlpineWithComponents; - AlpineComponents: ComponentStore; - } - -} diff --git a/src/Plugin.ts b/src/Plugin.ts deleted file mode 100644 index 6bc6947..0000000 --- a/src/Plugin.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Globals from './Global'; -import { - type ComponentList, - ComponentStore -} from './Store'; - -export namespace AlpineComponents { - - /** - * Bootstrap options. - * - * @public - */ - export interface Options { - /** - * List of named components to register. - */ - components: ComponentList, - - /** - * Create Alpine object and inject into window.Alpine? - */ - bootstrapAlpine: boolean; - /** - * Call Alpine.start()? - */ - startAlpine: boolean; - - /** - * Log errors to console? - */ - logErrors: boolean; - } - - /** - * Default bootstrap options. - * - * Assumes production environment. - * - * @public - */ - export const defaultOptions: Options = { - components: {}, - - bootstrapAlpine: false, - startAlpine: true, - - logErrors: false - }; - - /** - * Bootstrap the components package. - * - * @public - * - * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) - * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when - * the bootstrapAlpine option is set) - */ - export function bootstrap( - options: Partial = defaultOptions, - alpine: typeof Alpine = window.Alpine - ): void { - const opts: Options = { - ...defaultOptions, - ...options - }; - - if (opts.bootstrapAlpine && alpine !== undefined) { - if (opts.logErrors) { - console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); - } - return; - } - - Promise.resolve( - opts.bootstrapAlpine ? - import('alpinejs').then((imp) => imp.default) : alpine - ).then((alpine: typeof Alpine): void => { - if (opts.bootstrapAlpine) { - window.Alpine = alpine; - } - - window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); - - if (opts.startAlpine) { - alpine.start(); - } - }); - } - -} - -/** - * Export a function to be used with `Alpine.plugin()`. - * - * @public - * - * Calls {@link AlpineComponents.bootstrap} with sensible options. - * - * @param alpine - */ -export function componentsPlugin(alpine: Globals.Alpine) { - AlpineComponents.bootstrap({ - bootstrapAlpine: false, - startAlpine: false - }, alpine); -} diff --git a/src/Store.ts b/src/Store.ts deleted file mode 100644 index 7e62333..0000000 --- a/src/Store.ts +++ /dev/null @@ -1,256 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Impl from './Component'; -import type * as Globals from './Global'; - -import {AlpineComponent, type AlpineComponentConstructor} from './Component'; - -/** - * @see https://www.w3schools.com/js/js_reserved.asp - * - * @internal - */ -const ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', - 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', - 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', - 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', - 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', - 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', - 'with', 'yield']; - -/** - * Type definition for list of named component constructors. - * - * @public - */ -export type ComponentList = { - [name: string]: Impl.KnownConstructor -}; - -/** - * Internal type for component registration. - * - * @internal - */ -type ComponentConstructorData = { - name: string, - constructor: Impl.AlpineComponentConstructor -}; - -/** - * Internal component registration failure reasons. - * - * @internal - */ -enum RegisterComponentFailure { - GenericMustHaveFunctionAsSecond, - NameMustBeProvidedForComponentWithNoDefault, - UnknownArgumentTypes, - ReservedName -} - -export class ComponentStore { - private initialized: boolean = false; - - private alpine: Globals.AlpineWithComponents; - - private components: Record = {}; - - constructor( - alpinejs: typeof Alpine, - components: ComponentList = {}, - private readonly logErrors: boolean = false - ) { - this.alpine = alpinejs; - this.alpine.Components = this; - this.alpine.component = this.component; - - Object.entries(components).forEach(([name, component]): void => { - this.register(name, component); - }); - - window.addEventListener('alpine:init', (): void => { - this.init(); - }); - } - - private init(): void { - if (this.initialized) { - return; - } - - document.dispatchEvent(new CustomEvent('alpine-components:init')); - - Object.entries(this.components) - .forEach(([name]) => - this.registerConstructorAsAlpineData(name)); - - this.initialized = true; - } - - /** - * Retrieve a registered component constructor. - * - * @param name The component name - * - * @return ComponentConstructor - * - * If registered, returns a callable that accepts the component constructor arguments - * and creates the component object. Returns undefined if not registered. - */ - component(name: string): Impl.AlpineComponentConstructor { - // @ts-ignore - return this.components[name]; - } - - registerAll(components: ComponentList): void { - Object.entries(components) - .forEach(([name, component]) => - this.register(name, component)); - } - - /** - * Register a generic object (alpine data) as a component. - * - * @param name The name of the component (registered to alpine for use with x-data.) - * @param component The function that returns component data. - */ - register(name: string, component: Impl.KnownConstructor): void; - - /** - * Register a class inheriting from {@link Impl.AlpineComponent} as a component. - * - * @param component The name/symbol of the class to register as a component. - * @param name The name of the component (registered to alpine for use with x-data.) - */ - register(component: Impl.KnownClassConstructor, name?: string): void; - - register( - // @ts-expect-error TS3244 - nameOrComponentClass: string|Impl.KnownConstructor|Impl.KnownClassConstructor, - constructorOrComponentName: Impl.KnownConstructor|string = '' - ): void { - let component: ComponentConstructorData; - - if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) - if (typeof constructorOrComponentName === 'string') { - this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); - return; - } - component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); - } else if (typeof nameOrComponentClass === 'function') { // register class as component - component = ComponentStore.getClassData(>nameOrComponentClass, constructorOrComponentName); - if (component.name === "") { - this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); - } - } else { - this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); - return; - } - - if (ReservedNames.includes(component.name)) { - this.logRegisterFailure(RegisterComponentFailure.ReservedName); - } - - this.components[component.name] = component.constructor; - - if (this.initialized) { - this.registerConstructorAsAlpineData(component.name); - } - } - - /** - * Register a component to Alpine through Alpine.data(). - * - * @param name The name of the component (must already be registered to the store.) - */ - private registerConstructorAsAlpineData(name: string): void { - this.alpine.data(name, this.component(name)); - } - - private static getObjectData( - name: string, - component: Impl.KnownConstructor - ): ComponentConstructorData { - return { - name: name, - constructor: ((component.prototype instanceof AlpineComponent) ? - // @ts-ignore - makeAlpineConstructor(component) : component) - }; - } - - private static getClassData( - component: Impl.KnownClassConstructor, - name?: string - ): ComponentConstructorData { - const resolvedName: string = (name !== undefined ? name : component.prototype.name); - - return { - name: resolvedName, - constructor: makeAlpineConstructor(component) - }; - } - - private logRegisterFailure(reason: RegisterComponentFailure): void { - if (!this.logErrors) { - return; - } - - switch (reason) { - case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: - console.error(`Second argument must be a constructor function for component.`); - break; - case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: - // should be impossible because we fall back to prototype name - console.error(`Component name must be provided when class doesn't specify a default.`); - break; - case RegisterComponentFailure.UnknownArgumentTypes: - console.error(`Cannot register component with provided argument types. Check Typescript definitions for usage.`); - break; - case RegisterComponentFailure.ReservedName: - console.error(`Cannot register component with name matching a reserved keyword.`); - break; - } - } - -} - -/** - * Copy prototype functions and object properties to an empty object. - * - * @param instance The object to copy functions and properties from - */ -export function transformToAlpineData(instance: T): object { - let methodNames: string[] = []; - for ( - let prototype = Object.getPrototypeOf(instance); - prototype.constructor.name !== 'Object'; - prototype = Object.getPrototypeOf(prototype) - ) { - Object.getOwnPropertyNames(prototype).forEach((name: string): void => { - if (methodNames.includes(name)) { - return; - } - methodNames.push(name); - }); - } - - return [ - ...methodNames, // methods - ...Object.getOwnPropertyNames(instance) // properties - ].reduce((obj: {}, name: string) => { - // @ts-ignore - obj[name] = instance[name]; - - return obj; - }, {}); -} - -/** - * Transform a class constructor into an alpine constructor function. - * - * @param component The class constructor - */ -export function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor { - return (...args: any[]) => transformToAlpineData(new component(...args)); -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index ca546e5..0000000 --- a/src/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Export functions and types. - */ - -export { - type AlpineBindingContext, - type AlpineComponentConstructor, - type AlpineData, - type AlpineDataContext, - type KnownConstructor, - type KnownClassConstructor, - type KnownGenericConstructor, - AlpineComponent -} from './Component'; - -export { - type ComponentList, - ComponentStore, - transformToAlpineData, - makeAlpineConstructor -} from './Store'; - -export * as Globals from './Global'; - -export { - AlpineComponents, - componentsPlugin -} from './Plugin'; - - -/** - * Alpine plugin as default export. - */ -import {componentsPlugin} from './Plugin'; -export default componentsPlugin; diff --git a/types/Component.d.ts b/types/Component.d.ts new file mode 100644 index 0000000..8f6ce9d --- /dev/null +++ b/types/Component.d.ts @@ -0,0 +1,135 @@ +/** + * Type definition for known class constructors. + * + * @public + */ +export type KnownClassConstructor = new (...args: any[]) => T; +/** + * Type definition for known generic constructors. + * + * @public + */ +export type KnownGenericConstructor = (...args: any[]) => T; +/** + * Type definition for supported constructor functions. + * + * @public + */ +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +/** + * Type definition for alpine component constructors. + * + * @public + */ +export type AlpineComponentConstructor = (...args: any[]) => any; +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare interface AlpineDataContext { + /** + * Will be executed before Alpine initializes teh rest of the component. + */ + init?(): void; + [stateKey: string]: any; +} +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare type AlpineData = AlpineDataContext | string | number | boolean; +/** + * Type used to define properties that will exist on an x-bind object at runtime. + * + * @template T The component type + * @template Keys The properties to expose to the context (defaults to everything + * accessible with `keyof`) + * @template HiddenKeys Define accessible properties (protected/private) that are + * not included by `keyof` + */ +export type AlpineBindingContext = Record | (Pick & { + [K in HiddenKeys]: string | number | boolean; +}); +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare abstract class AlpineComponent implements AlpineDataContext { + /** + * Access to current Alpine data. + */ + $data: this; + /** + * Retrieve the current DOM node. + */ + $el: HTMLElement; + /** + * Retrieve DOM elements marked with x-ref inside the component. + */ + $refs: Record; + /** + * Access registered global Alpine stores. + */ + $store: AlpineData; + /** + * Dispatch browser events. + * + * @param event the event name + * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property + */ + $dispatch: (event: string, data?: any) => void; + /** + * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. + * + * @param name the name of the id + * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop + */ + $id: (name: string, key?: number | string) => string; + /** + * Execute a given expression AFTER Alpine has made its reactive DOM updates. + * + * @param callback a callback that will be fired after Alpine finishes updating the DOM + */ + $nextTick: (callback?: () => void) => Promise; + /** + * Fire the given callback when the value in the property is changed. + * + * @param property the component property + * @param callback a callback that will fire when a given property is changed + */ + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + protected binding(obj: AlpineBindingContext): AlpineBindingContext; +} diff --git a/types/Global.d.ts b/types/Global.d.ts new file mode 100644 index 0000000..973da58 --- /dev/null +++ b/types/Global.d.ts @@ -0,0 +1,60 @@ +/** + * Type declarations for Alpine and browser window global. + */ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from './Store'; +import type { AlpineComponentConstructor } from './Component'; +/** + * Define the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type Alpine = AlpineType | AlpineWithComponents; +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export declare function satisfiesAlpineWithComponents(obj: Alpine): boolean; +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export declare function castToAlpineWithComponents(obj?: Alpine): AlpineWithComponents | null; +declare global { + /** + * Expose window.Alpine and window.AlpineComponents globals. + * + * @public + */ + interface Window { + Alpine: AlpineWithComponents; + AlpineComponents: ComponentStore; + } +} diff --git a/types/Plugin.d.ts b/types/Plugin.d.ts new file mode 100644 index 0000000..0a83d57 --- /dev/null +++ b/types/Plugin.d.ts @@ -0,0 +1,56 @@ +import type Alpine from 'alpinejs'; +import type * as Globals from './Global'; +import { type ComponentList } from './Store'; +export declare namespace AlpineComponents { + /** + * Bootstrap options. + * + * @public + */ + interface Options { + /** + * List of named components to register. + */ + components: ComponentList; + /** + * Create Alpine object and inject into window.Alpine? + */ + bootstrapAlpine: boolean; + /** + * Call Alpine.start()? + */ + startAlpine: boolean; + /** + * Log errors to console? + */ + logErrors: boolean; + } + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + const defaultOptions: Options; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options?: Partial, alpine?: typeof Alpine): void; +} +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/types/Store.d.ts b/types/Store.d.ts new file mode 100644 index 0000000..695e678 --- /dev/null +++ b/types/Store.d.ts @@ -0,0 +1,66 @@ +import type Alpine from 'alpinejs'; +import type * as Impl from './Component'; +import { AlpineComponent } from './Component'; +/** + * Type definition for list of named component constructors. + * + * @public + */ +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private readonly logErrors; + private initialized; + private alpine; + private components; + constructor(alpinejs: typeof Alpine, components?: ComponentList, logErrors?: boolean); + private init; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + /** + * Register a generic object (alpine data) as a component. + * + * @param name The name of the component (registered to alpine for use with x-data.) + * @param component The function that returns component data. + */ + register(name: string, component: Impl.KnownConstructor): void; + /** + * Register a class inheriting from {@link Impl.AlpineComponent} as a component. + * + * @param component The name/symbol of the class to register as a component. + * @param name The name of the component (registered to alpine for use with x-data.) + */ + register(component: Impl.KnownClassConstructor, name?: string): void; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export declare function transformToAlpineData(instance: T): object; +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..e4004f6 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,12 @@ +/** + * Export functions and types. + */ +export { type AlpineBindingContext, type AlpineComponentConstructor, type AlpineData, type AlpineDataContext, type KnownConstructor, type KnownClassConstructor, type KnownGenericConstructor, AlpineComponent } from './Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; From c96d295365205053fa60313fa42ff8588c980880 Mon Sep 17 00:00:00 2001 From: JackNoordhuis Date: Mon, 25 Sep 2023 09:04:13 +0000 Subject: [PATCH 31/33] [create-pull-request] update tsc build dist files --- dist/Component.js | 41 +++++++ dist/Global.js | 29 +++++ dist/Plugin.js | 75 +++++++++++++ dist/Store.js | 201 +++++++++++++++++++++++++++++++++ dist/index.js | 13 +++ src/Component.ts | 161 --------------------------- src/Global.ts | 73 ------------ src/Plugin.ts | 109 ------------------ src/Store.ts | 256 ------------------------------------------- src/index.ts | 35 ------ types/Component.d.ts | 135 +++++++++++++++++++++++ types/Global.d.ts | 60 ++++++++++ types/Plugin.d.ts | 56 ++++++++++ types/Store.d.ts | 66 +++++++++++ types/index.d.ts | 12 ++ 15 files changed, 688 insertions(+), 634 deletions(-) create mode 100644 dist/Component.js create mode 100644 dist/Global.js create mode 100644 dist/Plugin.js create mode 100644 dist/Store.js create mode 100644 dist/index.js delete mode 100644 src/Component.ts delete mode 100644 src/Global.ts delete mode 100644 src/Plugin.ts delete mode 100644 src/Store.ts delete mode 100644 src/index.ts create mode 100644 types/Component.d.ts create mode 100644 types/Global.d.ts create mode 100644 types/Plugin.d.ts create mode 100644 types/Store.d.ts create mode 100644 types/index.d.ts diff --git a/dist/Component.js b/dist/Component.js new file mode 100644 index 0000000..d9eb78a --- /dev/null +++ b/dist/Component.js @@ -0,0 +1,41 @@ +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +var AlpineComponent = /** @class */ (function () { + function AlpineComponent() { + } + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + AlpineComponent.prototype.binding = function (obj) { + return obj; + }; + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxRUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSDtJQUFBO0lBK0VBLENBQUM7SUF2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNPLGlDQUFPLEdBQWpCLFVBQWtELEdBQXVEO1FBQ3hHLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVGLHNCQUFDO0FBQUQsQ0FBQyxBQS9FRCxJQStFQyJ9 \ No newline at end of file diff --git a/dist/Global.js b/dist/Global.js new file mode 100644 index 0000000..914352e --- /dev/null +++ b/dist/Global.js @@ -0,0 +1,29 @@ +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export function satisfiesAlpineWithComponents(obj) { + // @ts-ignore + return !!(obj.Components && obj.component); +} +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export function castToAlpineWithComponents(obj) { + if (obj === void 0) { obj = window.Alpine; } + return satisfiesAlpineWithComponents(obj) ? obj : null; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsR0FBVztJQUN4RCxhQUFhO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxHQUEyQjtJQUEzQixvQkFBQSxFQUFBLE1BQWMsTUFBTSxDQUFDLE1BQU07SUFDckUsT0FBTyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzlFLENBQUMifQ== \ No newline at end of file diff --git a/dist/Plugin.js b/dist/Plugin.js new file mode 100644 index 0000000..48405e6 --- /dev/null +++ b/dist/Plugin.js @@ -0,0 +1,75 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from './Store'; +export var AlpineComponents; +(function (AlpineComponents) { + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + AlpineComponents.defaultOptions = { + components: {}, + bootstrapAlpine: false, + startAlpine: true, + logErrors: false + }; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + if (opts.bootstrapAlpine && alpine !== undefined) { + if (opts.logErrors) { + console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); + } + return; + } + Promise.resolve(opts.bootstrapAlpine ? + import('alpinejs').then(function (imp) { return imp.default; }) : alpine).then(function (alpine) { + if (opts.bootstrapAlpine) { + window.Alpine = alpine; + } + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + }); + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + bootstrapAlpine: false, + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBLE9BQU8sRUFFTixjQUFjLEVBQ2QsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxLQUFXLGdCQUFnQixDQXFGaEM7QUFyRkQsV0FBaUIsZ0JBQWdCO0lBNEJoQzs7Ozs7O09BTUc7SUFDVSwrQkFBYyxHQUFZO1FBQ3RDLFVBQVUsRUFBRSxFQUFFO1FBRWQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFFakIsU0FBUyxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUVGOzs7Ozs7OztPQVFHO0lBQ0gsU0FBZ0IsU0FBUyxDQUN4QixPQUEwQyxFQUMxQyxNQUFxQztRQURyQyx3QkFBQSxFQUFBLFVBQTRCLCtCQUFjO1FBQzFDLHVCQUFBLEVBQUEsU0FBd0IsTUFBTSxDQUFDLE1BQU07UUFFckMsSUFBTSxJQUFJLHlCQUNOLGlCQUFBLGNBQWMsR0FDZCxPQUFPLENBQ1YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTztTQUNQO1FBRUQsT0FBTyxDQUFDLE9BQU8sQ0FDZCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxPQUFPLEVBQVgsQ0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxJQUFJLENBQUMsVUFBQyxNQUFxQjtZQUM1QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3pCLE1BQU0sQ0FBQyxNQUFNLEdBQWlDLE1BQU0sQ0FBQzthQUNyRDtZQUVELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNyQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDZjtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQTlCZSwwQkFBUyxZQThCeEIsQ0FBQTtBQUVGLENBQUMsRUFyRmdCLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFxRmhDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBc0I7SUFDdEQsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1FBQzFCLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLFdBQVcsRUFBRSxLQUFLO0tBQ2xCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDWixDQUFDIn0= \ No newline at end of file diff --git a/dist/Store.js b/dist/Store.js new file mode 100644 index 0000000..7066f9a --- /dev/null +++ b/dist/Store.js @@ -0,0 +1,201 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from './Component'; +/** + * @see https://www.w3schools.com/js/js_reserved.asp + * + * @internal + */ +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +/** + * Internal component registration failure reasons. + * + * @internal + */ +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = /** @class */ (function () { + function ComponentStore(alpinejs, components, logErrors) { + var _this = this; + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + this.alpine = alpinejs; + this.alpine.Components = this; + this.alpine.component = this.component; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + ComponentStore.prototype.component = function (name) { + // @ts-ignore + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function ( + // @ts-expect-error TS3244 + nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { // register class as component + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + // @ts-ignore + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + // should be impossible because we fall back to prototype name + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance) // properties + , true).reduce(function (obj, name) { + // @ts-ignore + obj[name] = instance[name]; + return obj; + }, {}); +} +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBSUEsT0FBTyxFQUFDLGVBQWUsRUFBa0MsTUFBTSxhQUFhLENBQUM7QUFFN0U7Ozs7R0FJRztBQUNILElBQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUN0RyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUNwRyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSztJQUNwRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQ25HLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQXFCbEI7Ozs7R0FJRztBQUNILElBQUssd0JBS0o7QUFMRCxXQUFLLHdCQUF3QjtJQUM1Qiw2SEFBK0IsQ0FBQTtJQUMv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 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..6cbf7c1 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,13 @@ +/** + * Export functions and types. + */ +export { AlpineComponent } from './Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBUU4sZUFBZSxFQUNmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFFTixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUdsQjs7R0FFRztBQUNILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMxQyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.ts b/src/Component.ts deleted file mode 100644 index fab0602..0000000 --- a/src/Component.ts +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Type definition for known class constructors. - * - * @public - */ -export type KnownClassConstructor = new (...args: any[]) => T; -/** - * Type definition for known generic constructors. - * - * @public - */ -export type KnownGenericConstructor = (...args: any[]) => T; -/** - * Type definition for supported constructor functions. - * - * @public - */ -export type KnownConstructor = KnownGenericConstructor| - // @ts-expect-error TS2344 - KnownClassConstructor; - -/** - * Type definition for alpine component constructors. - * - * @public - */ -export type AlpineComponentConstructor = (...args: any[]) => any; - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare interface AlpineDataContext { - /** - * Will be executed before Alpine initializes teh rest of the component. - */ - init?(): void; - [stateKey: string]: any; -} - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare type AlpineData = AlpineDataContext | string | number | boolean; - -/** - * Type used to define properties that will exist on an x-bind object at runtime. - * - * @template T The component type - * @template Keys The properties to expose to the context (defaults to everything - * accessible with `keyof`) - * @template HiddenKeys Define accessible properties (protected/private) that are - * not included by `keyof` - */ -export type AlpineBindingContext< - T extends AlpineComponent, - Keys extends keyof T = keyof T, - HiddenKeys extends string = '' -> = Record | (Pick & { - [K in HiddenKeys]: string | number | boolean; -}); - -/** - * Light-weight interface for class based components. - * - * Provides property declarations for Alpine magics that will exist when - * used as an Alpine component. - * - * Property declarations copied from @types/alpinejs. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export abstract class AlpineComponent implements AlpineDataContext { - - /** - * Access to current Alpine data. - */ - declare $data: this; - - /** - * Retrieve the current DOM node. - */ - declare $el: HTMLElement; - - /** - * Retrieve DOM elements marked with x-ref inside the component. - */ - declare $refs: Record; - - /** - * Access registered global Alpine stores. - */ - declare $store: AlpineData; - - /** - * Dispatch browser events. - * - * @param event the event name - * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property - */ - declare $dispatch: (event: string, data?: any) => void; - - /** - * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. - * - * @param name the name of the id - * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop - */ - declare $id: (name: string, key?: number | string) => string; - - /** - * Execute a given expression AFTER Alpine has made its reactive DOM updates. - * - * @param callback a callback that will be fired after Alpine finishes updating the DOM - */ - declare $nextTick: (callback?: () => void) => Promise; - - /** - * Fire the given callback when the value in the property is changed. - * - * @param property the component property - * @param callback a callback that will fire when a given property is changed - */ - declare $watch: ( - property: K, - callback: (newValue: V, oldValue: V) => void, - ) => void; - - /** - * Declare an object as an x-bind property for this component. - * - * Use this method to define properties for use with x-bind: - * ```typescript - * protected myBinding = this.binding({ - * ["@click.prevent"]() { console.log("click prevented!") } - * }); - * ``` - * - * @protected - * - * @template HiddenKeys Define accessible properties (protected/private) - * that are not included by `keyof` - * - * @param obj The object for use with x-bind - * - * @return The same object passed to {@link obj} - */ - protected binding(obj: AlpineBindingContext) { - return obj; - } - -} diff --git a/src/Global.ts b/src/Global.ts deleted file mode 100644 index 0b6c4bf..0000000 --- a/src/Global.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Type declarations for Alpine and browser window global. - */ -import type {Alpine as AlpineType} from 'alpinejs'; -import type {ComponentStore} from './Store'; -import type {AlpineComponentConstructor} from './Component'; - -/** - * Define the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare interface AlpineComponentMixins { - Components: ComponentStore; - component: (name: string) => AlpineComponentConstructor; -} - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type AlpineWithComponents = AlpineType&AlpineComponentMixins; - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type Alpine = AlpineType|AlpineWithComponents; - -/** - * Check if an {@link Alpine} object has the components properties. - * - * @public - * - * @param obj The Alpine object to check - * - * @return True if component properties are injected, false otherwise. - */ -export function satisfiesAlpineWithComponents(obj: Alpine): boolean { - // @ts-ignore - return !!(obj.Components && obj.component); -} - -/** - * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it - * has the injected properties. - * - * @public - * - * @param obj The Alpine object to cast - * - * @return The object cast to {@link AlpineWithComponents} if properties are - * injected, null otherwise. - */ -export function castToAlpineWithComponents(obj: Alpine = window.Alpine): AlpineWithComponents|null { - return satisfiesAlpineWithComponents(obj) ? obj : null; -} - -declare global { - - /** - * Expose window.Alpine and window.AlpineComponents globals. - * - * @public - */ - interface Window { - Alpine: AlpineWithComponents; - AlpineComponents: ComponentStore; - } - -} diff --git a/src/Plugin.ts b/src/Plugin.ts deleted file mode 100644 index 6bc6947..0000000 --- a/src/Plugin.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Globals from './Global'; -import { - type ComponentList, - ComponentStore -} from './Store'; - -export namespace AlpineComponents { - - /** - * Bootstrap options. - * - * @public - */ - export interface Options { - /** - * List of named components to register. - */ - components: ComponentList, - - /** - * Create Alpine object and inject into window.Alpine? - */ - bootstrapAlpine: boolean; - /** - * Call Alpine.start()? - */ - startAlpine: boolean; - - /** - * Log errors to console? - */ - logErrors: boolean; - } - - /** - * Default bootstrap options. - * - * Assumes production environment. - * - * @public - */ - export const defaultOptions: Options = { - components: {}, - - bootstrapAlpine: false, - startAlpine: true, - - logErrors: false - }; - - /** - * Bootstrap the components package. - * - * @public - * - * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) - * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when - * the bootstrapAlpine option is set) - */ - export function bootstrap( - options: Partial = defaultOptions, - alpine: typeof Alpine = window.Alpine - ): void { - const opts: Options = { - ...defaultOptions, - ...options - }; - - if (opts.bootstrapAlpine && alpine !== undefined) { - if (opts.logErrors) { - console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); - } - return; - } - - Promise.resolve( - opts.bootstrapAlpine ? - import('alpinejs').then((imp) => imp.default) : alpine - ).then((alpine: typeof Alpine): void => { - if (opts.bootstrapAlpine) { - window.Alpine = alpine; - } - - window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); - - if (opts.startAlpine) { - alpine.start(); - } - }); - } - -} - -/** - * Export a function to be used with `Alpine.plugin()`. - * - * @public - * - * Calls {@link AlpineComponents.bootstrap} with sensible options. - * - * @param alpine - */ -export function componentsPlugin(alpine: Globals.Alpine) { - AlpineComponents.bootstrap({ - bootstrapAlpine: false, - startAlpine: false - }, alpine); -} diff --git a/src/Store.ts b/src/Store.ts deleted file mode 100644 index 7e62333..0000000 --- a/src/Store.ts +++ /dev/null @@ -1,256 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Impl from './Component'; -import type * as Globals from './Global'; - -import {AlpineComponent, type AlpineComponentConstructor} from './Component'; - -/** - * @see https://www.w3schools.com/js/js_reserved.asp - * - * @internal - */ -const ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', - 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', - 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', - 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', - 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', - 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', - 'with', 'yield']; - -/** - * Type definition for list of named component constructors. - * - * @public - */ -export type ComponentList = { - [name: string]: Impl.KnownConstructor -}; - -/** - * Internal type for component registration. - * - * @internal - */ -type ComponentConstructorData = { - name: string, - constructor: Impl.AlpineComponentConstructor -}; - -/** - * Internal component registration failure reasons. - * - * @internal - */ -enum RegisterComponentFailure { - GenericMustHaveFunctionAsSecond, - NameMustBeProvidedForComponentWithNoDefault, - UnknownArgumentTypes, - ReservedName -} - -export class ComponentStore { - private initialized: boolean = false; - - private alpine: Globals.AlpineWithComponents; - - private components: Record = {}; - - constructor( - alpinejs: typeof Alpine, - components: ComponentList = {}, - private readonly logErrors: boolean = false - ) { - this.alpine = alpinejs; - this.alpine.Components = this; - this.alpine.component = this.component; - - Object.entries(components).forEach(([name, component]): void => { - this.register(name, component); - }); - - window.addEventListener('alpine:init', (): void => { - this.init(); - }); - } - - private init(): void { - if (this.initialized) { - return; - } - - document.dispatchEvent(new CustomEvent('alpine-components:init')); - - Object.entries(this.components) - .forEach(([name]) => - this.registerConstructorAsAlpineData(name)); - - this.initialized = true; - } - - /** - * Retrieve a registered component constructor. - * - * @param name The component name - * - * @return ComponentConstructor - * - * If registered, returns a callable that accepts the component constructor arguments - * and creates the component object. Returns undefined if not registered. - */ - component(name: string): Impl.AlpineComponentConstructor { - // @ts-ignore - return this.components[name]; - } - - registerAll(components: ComponentList): void { - Object.entries(components) - .forEach(([name, component]) => - this.register(name, component)); - } - - /** - * Register a generic object (alpine data) as a component. - * - * @param name The name of the component (registered to alpine for use with x-data.) - * @param component The function that returns component data. - */ - register(name: string, component: Impl.KnownConstructor): void; - - /** - * Register a class inheriting from {@link Impl.AlpineComponent} as a component. - * - * @param component The name/symbol of the class to register as a component. - * @param name The name of the component (registered to alpine for use with x-data.) - */ - register(component: Impl.KnownClassConstructor, name?: string): void; - - register( - // @ts-expect-error TS3244 - nameOrComponentClass: string|Impl.KnownConstructor|Impl.KnownClassConstructor, - constructorOrComponentName: Impl.KnownConstructor|string = '' - ): void { - let component: ComponentConstructorData; - - if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) - if (typeof constructorOrComponentName === 'string') { - this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); - return; - } - component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); - } else if (typeof nameOrComponentClass === 'function') { // register class as component - component = ComponentStore.getClassData(>nameOrComponentClass, constructorOrComponentName); - if (component.name === "") { - this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); - } - } else { - this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); - return; - } - - if (ReservedNames.includes(component.name)) { - this.logRegisterFailure(RegisterComponentFailure.ReservedName); - } - - this.components[component.name] = component.constructor; - - if (this.initialized) { - this.registerConstructorAsAlpineData(component.name); - } - } - - /** - * Register a component to Alpine through Alpine.data(). - * - * @param name The name of the component (must already be registered to the store.) - */ - private registerConstructorAsAlpineData(name: string): void { - this.alpine.data(name, this.component(name)); - } - - private static getObjectData( - name: string, - component: Impl.KnownConstructor - ): ComponentConstructorData { - return { - name: name, - constructor: ((component.prototype instanceof AlpineComponent) ? - // @ts-ignore - makeAlpineConstructor(component) : component) - }; - } - - private static getClassData( - component: Impl.KnownClassConstructor, - name?: string - ): ComponentConstructorData { - const resolvedName: string = (name !== undefined ? name : component.prototype.name); - - return { - name: resolvedName, - constructor: makeAlpineConstructor(component) - }; - } - - private logRegisterFailure(reason: RegisterComponentFailure): void { - if (!this.logErrors) { - return; - } - - switch (reason) { - case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: - console.error(`Second argument must be a constructor function for component.`); - break; - case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: - // should be impossible because we fall back to prototype name - console.error(`Component name must be provided when class doesn't specify a default.`); - break; - case RegisterComponentFailure.UnknownArgumentTypes: - console.error(`Cannot register component with provided argument types. Check Typescript definitions for usage.`); - break; - case RegisterComponentFailure.ReservedName: - console.error(`Cannot register component with name matching a reserved keyword.`); - break; - } - } - -} - -/** - * Copy prototype functions and object properties to an empty object. - * - * @param instance The object to copy functions and properties from - */ -export function transformToAlpineData(instance: T): object { - let methodNames: string[] = []; - for ( - let prototype = Object.getPrototypeOf(instance); - prototype.constructor.name !== 'Object'; - prototype = Object.getPrototypeOf(prototype) - ) { - Object.getOwnPropertyNames(prototype).forEach((name: string): void => { - if (methodNames.includes(name)) { - return; - } - methodNames.push(name); - }); - } - - return [ - ...methodNames, // methods - ...Object.getOwnPropertyNames(instance) // properties - ].reduce((obj: {}, name: string) => { - // @ts-ignore - obj[name] = instance[name]; - - return obj; - }, {}); -} - -/** - * Transform a class constructor into an alpine constructor function. - * - * @param component The class constructor - */ -export function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor { - return (...args: any[]) => transformToAlpineData(new component(...args)); -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index ca546e5..0000000 --- a/src/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Export functions and types. - */ - -export { - type AlpineBindingContext, - type AlpineComponentConstructor, - type AlpineData, - type AlpineDataContext, - type KnownConstructor, - type KnownClassConstructor, - type KnownGenericConstructor, - AlpineComponent -} from './Component'; - -export { - type ComponentList, - ComponentStore, - transformToAlpineData, - makeAlpineConstructor -} from './Store'; - -export * as Globals from './Global'; - -export { - AlpineComponents, - componentsPlugin -} from './Plugin'; - - -/** - * Alpine plugin as default export. - */ -import {componentsPlugin} from './Plugin'; -export default componentsPlugin; diff --git a/types/Component.d.ts b/types/Component.d.ts new file mode 100644 index 0000000..8f6ce9d --- /dev/null +++ b/types/Component.d.ts @@ -0,0 +1,135 @@ +/** + * Type definition for known class constructors. + * + * @public + */ +export type KnownClassConstructor = new (...args: any[]) => T; +/** + * Type definition for known generic constructors. + * + * @public + */ +export type KnownGenericConstructor = (...args: any[]) => T; +/** + * Type definition for supported constructor functions. + * + * @public + */ +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +/** + * Type definition for alpine component constructors. + * + * @public + */ +export type AlpineComponentConstructor = (...args: any[]) => any; +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare interface AlpineDataContext { + /** + * Will be executed before Alpine initializes teh rest of the component. + */ + init?(): void; + [stateKey: string]: any; +} +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare type AlpineData = AlpineDataContext | string | number | boolean; +/** + * Type used to define properties that will exist on an x-bind object at runtime. + * + * @template T The component type + * @template Keys The properties to expose to the context (defaults to everything + * accessible with `keyof`) + * @template HiddenKeys Define accessible properties (protected/private) that are + * not included by `keyof` + */ +export type AlpineBindingContext = Record | (Pick & { + [K in HiddenKeys]: string | number | boolean; +}); +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare abstract class AlpineComponent implements AlpineDataContext { + /** + * Access to current Alpine data. + */ + $data: this; + /** + * Retrieve the current DOM node. + */ + $el: HTMLElement; + /** + * Retrieve DOM elements marked with x-ref inside the component. + */ + $refs: Record; + /** + * Access registered global Alpine stores. + */ + $store: AlpineData; + /** + * Dispatch browser events. + * + * @param event the event name + * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property + */ + $dispatch: (event: string, data?: any) => void; + /** + * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. + * + * @param name the name of the id + * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop + */ + $id: (name: string, key?: number | string) => string; + /** + * Execute a given expression AFTER Alpine has made its reactive DOM updates. + * + * @param callback a callback that will be fired after Alpine finishes updating the DOM + */ + $nextTick: (callback?: () => void) => Promise; + /** + * Fire the given callback when the value in the property is changed. + * + * @param property the component property + * @param callback a callback that will fire when a given property is changed + */ + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + protected binding(obj: AlpineBindingContext): AlpineBindingContext; +} diff --git a/types/Global.d.ts b/types/Global.d.ts new file mode 100644 index 0000000..973da58 --- /dev/null +++ b/types/Global.d.ts @@ -0,0 +1,60 @@ +/** + * Type declarations for Alpine and browser window global. + */ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from './Store'; +import type { AlpineComponentConstructor } from './Component'; +/** + * Define the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type Alpine = AlpineType | AlpineWithComponents; +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export declare function satisfiesAlpineWithComponents(obj: Alpine): boolean; +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export declare function castToAlpineWithComponents(obj?: Alpine): AlpineWithComponents | null; +declare global { + /** + * Expose window.Alpine and window.AlpineComponents globals. + * + * @public + */ + interface Window { + Alpine: AlpineWithComponents; + AlpineComponents: ComponentStore; + } +} diff --git a/types/Plugin.d.ts b/types/Plugin.d.ts new file mode 100644 index 0000000..0a83d57 --- /dev/null +++ b/types/Plugin.d.ts @@ -0,0 +1,56 @@ +import type Alpine from 'alpinejs'; +import type * as Globals from './Global'; +import { type ComponentList } from './Store'; +export declare namespace AlpineComponents { + /** + * Bootstrap options. + * + * @public + */ + interface Options { + /** + * List of named components to register. + */ + components: ComponentList; + /** + * Create Alpine object and inject into window.Alpine? + */ + bootstrapAlpine: boolean; + /** + * Call Alpine.start()? + */ + startAlpine: boolean; + /** + * Log errors to console? + */ + logErrors: boolean; + } + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + const defaultOptions: Options; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options?: Partial, alpine?: typeof Alpine): void; +} +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/types/Store.d.ts b/types/Store.d.ts new file mode 100644 index 0000000..695e678 --- /dev/null +++ b/types/Store.d.ts @@ -0,0 +1,66 @@ +import type Alpine from 'alpinejs'; +import type * as Impl from './Component'; +import { AlpineComponent } from './Component'; +/** + * Type definition for list of named component constructors. + * + * @public + */ +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private readonly logErrors; + private initialized; + private alpine; + private components; + constructor(alpinejs: typeof Alpine, components?: ComponentList, logErrors?: boolean); + private init; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + /** + * Register a generic object (alpine data) as a component. + * + * @param name The name of the component (registered to alpine for use with x-data.) + * @param component The function that returns component data. + */ + register(name: string, component: Impl.KnownConstructor): void; + /** + * Register a class inheriting from {@link Impl.AlpineComponent} as a component. + * + * @param component The name/symbol of the class to register as a component. + * @param name The name of the component (registered to alpine for use with x-data.) + */ + register(component: Impl.KnownClassConstructor, name?: string): void; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export declare function transformToAlpineData(instance: T): object; +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..e4004f6 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,12 @@ +/** + * Export functions and types. + */ +export { type AlpineBindingContext, type AlpineComponentConstructor, type AlpineData, type AlpineDataContext, type KnownConstructor, type KnownClassConstructor, type KnownGenericConstructor, AlpineComponent } from './Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; From 51e8f2f2bb5c1ca9f3ba2c5a7894bc7afdb6dc7f Mon Sep 17 00:00:00 2001 From: JackNoordhuis <10399774+JackNoordhuis@users.noreply.github.com> Date: Wed, 11 Dec 2024 04:02:50 +0000 Subject: [PATCH 32/33] [create-pull-request] update tsc build dist files --- dist/Component.js | 41 +++++++ dist/Global.js | 29 +++++ dist/Plugin.js | 75 +++++++++++++ dist/Store.js | 201 +++++++++++++++++++++++++++++++++ dist/index.js | 13 +++ src/Component.ts | 161 --------------------------- src/Global.ts | 73 ------------ src/Plugin.ts | 109 ------------------ src/Store.ts | 256 ------------------------------------------- src/index.ts | 35 ------ types/Component.d.ts | 135 +++++++++++++++++++++++ types/Global.d.ts | 60 ++++++++++ types/Plugin.d.ts | 56 ++++++++++ types/Store.d.ts | 66 +++++++++++ types/index.d.ts | 12 ++ 15 files changed, 688 insertions(+), 634 deletions(-) create mode 100644 dist/Component.js create mode 100644 dist/Global.js create mode 100644 dist/Plugin.js create mode 100644 dist/Store.js create mode 100644 dist/index.js delete mode 100644 src/Component.ts delete mode 100644 src/Global.ts delete mode 100644 src/Plugin.ts delete mode 100644 src/Store.ts delete mode 100644 src/index.ts create mode 100644 types/Component.d.ts create mode 100644 types/Global.d.ts create mode 100644 types/Plugin.d.ts create mode 100644 types/Store.d.ts create mode 100644 types/index.d.ts diff --git a/dist/Component.js b/dist/Component.js new file mode 100644 index 0000000..d9eb78a --- /dev/null +++ b/dist/Component.js @@ -0,0 +1,41 @@ +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +var AlpineComponent = /** @class */ (function () { + function AlpineComponent() { + } + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + AlpineComponent.prototype.binding = function (obj) { + return obj; + }; + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxRUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSDtJQUFBO0lBK0VBLENBQUM7SUF2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNPLGlDQUFPLEdBQWpCLFVBQWtELEdBQXVEO1FBQ3hHLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVGLHNCQUFDO0FBQUQsQ0FBQyxBQS9FRCxJQStFQyJ9 \ No newline at end of file diff --git a/dist/Global.js b/dist/Global.js new file mode 100644 index 0000000..914352e --- /dev/null +++ b/dist/Global.js @@ -0,0 +1,29 @@ +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export function satisfiesAlpineWithComponents(obj) { + // @ts-ignore + return !!(obj.Components && obj.component); +} +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export function castToAlpineWithComponents(obj) { + if (obj === void 0) { obj = window.Alpine; } + return satisfiesAlpineWithComponents(obj) ? obj : null; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsR0FBVztJQUN4RCxhQUFhO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxHQUEyQjtJQUEzQixvQkFBQSxFQUFBLE1BQWMsTUFBTSxDQUFDLE1BQU07SUFDckUsT0FBTyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzlFLENBQUMifQ== \ No newline at end of file diff --git a/dist/Plugin.js b/dist/Plugin.js new file mode 100644 index 0000000..a18250c --- /dev/null +++ b/dist/Plugin.js @@ -0,0 +1,75 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from './Store'; +export var AlpineComponents; +(function (AlpineComponents) { + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + AlpineComponents.defaultOptions = { + components: {}, + bootstrapAlpine: false, + startAlpine: true, + logErrors: false + }; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + if (opts.bootstrapAlpine && alpine !== undefined) { + if (opts.logErrors) { + console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); + } + return; + } + Promise.resolve(opts.bootstrapAlpine ? + import('alpinejs').then(function (imp) { return imp.default; }) : alpine).then(function (alpine) { + if (opts.bootstrapAlpine) { + window.Alpine = alpine; + } + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + }); + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + bootstrapAlpine: false, + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBLE9BQU8sRUFFTixjQUFjLEVBQ2QsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxLQUFXLGdCQUFnQixDQXFGaEM7QUFyRkQsV0FBaUIsZ0JBQWdCO0lBNEJoQzs7Ozs7O09BTUc7SUFDVSwrQkFBYyxHQUFZO1FBQ3RDLFVBQVUsRUFBRSxFQUFFO1FBRWQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFFakIsU0FBUyxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUVGOzs7Ozs7OztPQVFHO0lBQ0gsU0FBZ0IsU0FBUyxDQUN4QixPQUEwQyxFQUMxQyxNQUFxQztRQURyQyx3QkFBQSxFQUFBLFVBQTRCLCtCQUFjO1FBQzFDLHVCQUFBLEVBQUEsU0FBd0IsTUFBTSxDQUFDLE1BQU07UUFFckMsSUFBTSxJQUFJLHlCQUNOLGlCQUFBLGNBQWMsR0FDZCxPQUFPLENBQ1YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztZQUNqRixDQUFDO1lBQ0QsT0FBTztRQUNSLENBQUM7UUFFRCxPQUFPLENBQUMsT0FBTyxDQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsR0FBRyxJQUFLLE9BQUEsR0FBRyxDQUFDLE9BQU8sRUFBWCxDQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUN2RCxDQUFDLElBQUksQ0FBQyxVQUFDLE1BQXFCO1lBQzVCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMxQixNQUFNLENBQUMsTUFBTSxHQUFpQyxNQUFNLENBQUM7WUFDdEQsQ0FBQztZQUVELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBOUJlLDBCQUFTLFlBOEJ4QixDQUFBO0FBRUYsQ0FBQyxFQXJGZ0IsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQXFGaEM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFzQjtJQUN0RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDMUIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLEtBQUs7S0FDbEIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNaLENBQUMifQ== \ No newline at end of file diff --git a/dist/Store.js b/dist/Store.js new file mode 100644 index 0000000..ed83629 --- /dev/null +++ b/dist/Store.js @@ -0,0 +1,201 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from './Component'; +/** + * @see https://www.w3schools.com/js/js_reserved.asp + * + * @internal + */ +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +/** + * Internal component registration failure reasons. + * + * @internal + */ +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = /** @class */ (function () { + function ComponentStore(alpinejs, components, logErrors) { + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + var _this = this; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + this.alpine = alpinejs; + this.alpine.Components = this; + this.alpine.component = this.component; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + ComponentStore.prototype.component = function (name) { + // @ts-ignore + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function ( + // @ts-expect-error TS3244 + nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { // register class as component + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + // @ts-ignore + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + // should be impossible because we fall back to prototype name + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance) // properties + , true).reduce(function (obj, name) { + // @ts-ignore + obj[name] = instance[name]; + return obj; + }, {}); +} +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBSUEsT0FBTyxFQUFDLGVBQWUsRUFBa0MsTUFBTSxhQUFhLENBQUM7QUFFN0U7Ozs7R0FJRztBQUNILElBQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUN0RyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUNwRyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSztJQUNwRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQ25HLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQXFCbEI7Ozs7R0FJRztBQUNILElBQUssd0JBS0o7QUFMRCxXQUFLLHdCQUF3QjtJQUM1Qiw2SEFBK0IsQ0FBQTtJQUMv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 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..6cbf7c1 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,13 @@ +/** + * Export functions and types. + */ +export { AlpineComponent } from './Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBUU4sZUFBZSxFQUNmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFFTixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUdsQjs7R0FFRztBQUNILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMxQyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.ts b/src/Component.ts deleted file mode 100644 index fab0602..0000000 --- a/src/Component.ts +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Type definition for known class constructors. - * - * @public - */ -export type KnownClassConstructor = new (...args: any[]) => T; -/** - * Type definition for known generic constructors. - * - * @public - */ -export type KnownGenericConstructor = (...args: any[]) => T; -/** - * Type definition for supported constructor functions. - * - * @public - */ -export type KnownConstructor = KnownGenericConstructor| - // @ts-expect-error TS2344 - KnownClassConstructor; - -/** - * Type definition for alpine component constructors. - * - * @public - */ -export type AlpineComponentConstructor = (...args: any[]) => any; - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare interface AlpineDataContext { - /** - * Will be executed before Alpine initializes teh rest of the component. - */ - init?(): void; - [stateKey: string]: any; -} - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare type AlpineData = AlpineDataContext | string | number | boolean; - -/** - * Type used to define properties that will exist on an x-bind object at runtime. - * - * @template T The component type - * @template Keys The properties to expose to the context (defaults to everything - * accessible with `keyof`) - * @template HiddenKeys Define accessible properties (protected/private) that are - * not included by `keyof` - */ -export type AlpineBindingContext< - T extends AlpineComponent, - Keys extends keyof T = keyof T, - HiddenKeys extends string = '' -> = Record | (Pick & { - [K in HiddenKeys]: string | number | boolean; -}); - -/** - * Light-weight interface for class based components. - * - * Provides property declarations for Alpine magics that will exist when - * used as an Alpine component. - * - * Property declarations copied from @types/alpinejs. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export abstract class AlpineComponent implements AlpineDataContext { - - /** - * Access to current Alpine data. - */ - declare $data: this; - - /** - * Retrieve the current DOM node. - */ - declare $el: HTMLElement; - - /** - * Retrieve DOM elements marked with x-ref inside the component. - */ - declare $refs: Record; - - /** - * Access registered global Alpine stores. - */ - declare $store: AlpineData; - - /** - * Dispatch browser events. - * - * @param event the event name - * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property - */ - declare $dispatch: (event: string, data?: any) => void; - - /** - * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. - * - * @param name the name of the id - * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop - */ - declare $id: (name: string, key?: number | string) => string; - - /** - * Execute a given expression AFTER Alpine has made its reactive DOM updates. - * - * @param callback a callback that will be fired after Alpine finishes updating the DOM - */ - declare $nextTick: (callback?: () => void) => Promise; - - /** - * Fire the given callback when the value in the property is changed. - * - * @param property the component property - * @param callback a callback that will fire when a given property is changed - */ - declare $watch: ( - property: K, - callback: (newValue: V, oldValue: V) => void, - ) => void; - - /** - * Declare an object as an x-bind property for this component. - * - * Use this method to define properties for use with x-bind: - * ```typescript - * protected myBinding = this.binding({ - * ["@click.prevent"]() { console.log("click prevented!") } - * }); - * ``` - * - * @protected - * - * @template HiddenKeys Define accessible properties (protected/private) - * that are not included by `keyof` - * - * @param obj The object for use with x-bind - * - * @return The same object passed to {@link obj} - */ - protected binding(obj: AlpineBindingContext) { - return obj; - } - -} diff --git a/src/Global.ts b/src/Global.ts deleted file mode 100644 index 0b6c4bf..0000000 --- a/src/Global.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Type declarations for Alpine and browser window global. - */ -import type {Alpine as AlpineType} from 'alpinejs'; -import type {ComponentStore} from './Store'; -import type {AlpineComponentConstructor} from './Component'; - -/** - * Define the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare interface AlpineComponentMixins { - Components: ComponentStore; - component: (name: string) => AlpineComponentConstructor; -} - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type AlpineWithComponents = AlpineType&AlpineComponentMixins; - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type Alpine = AlpineType|AlpineWithComponents; - -/** - * Check if an {@link Alpine} object has the components properties. - * - * @public - * - * @param obj The Alpine object to check - * - * @return True if component properties are injected, false otherwise. - */ -export function satisfiesAlpineWithComponents(obj: Alpine): boolean { - // @ts-ignore - return !!(obj.Components && obj.component); -} - -/** - * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it - * has the injected properties. - * - * @public - * - * @param obj The Alpine object to cast - * - * @return The object cast to {@link AlpineWithComponents} if properties are - * injected, null otherwise. - */ -export function castToAlpineWithComponents(obj: Alpine = window.Alpine): AlpineWithComponents|null { - return satisfiesAlpineWithComponents(obj) ? obj : null; -} - -declare global { - - /** - * Expose window.Alpine and window.AlpineComponents globals. - * - * @public - */ - interface Window { - Alpine: AlpineWithComponents; - AlpineComponents: ComponentStore; - } - -} diff --git a/src/Plugin.ts b/src/Plugin.ts deleted file mode 100644 index 6bc6947..0000000 --- a/src/Plugin.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Globals from './Global'; -import { - type ComponentList, - ComponentStore -} from './Store'; - -export namespace AlpineComponents { - - /** - * Bootstrap options. - * - * @public - */ - export interface Options { - /** - * List of named components to register. - */ - components: ComponentList, - - /** - * Create Alpine object and inject into window.Alpine? - */ - bootstrapAlpine: boolean; - /** - * Call Alpine.start()? - */ - startAlpine: boolean; - - /** - * Log errors to console? - */ - logErrors: boolean; - } - - /** - * Default bootstrap options. - * - * Assumes production environment. - * - * @public - */ - export const defaultOptions: Options = { - components: {}, - - bootstrapAlpine: false, - startAlpine: true, - - logErrors: false - }; - - /** - * Bootstrap the components package. - * - * @public - * - * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) - * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when - * the bootstrapAlpine option is set) - */ - export function bootstrap( - options: Partial = defaultOptions, - alpine: typeof Alpine = window.Alpine - ): void { - const opts: Options = { - ...defaultOptions, - ...options - }; - - if (opts.bootstrapAlpine && alpine !== undefined) { - if (opts.logErrors) { - console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); - } - return; - } - - Promise.resolve( - opts.bootstrapAlpine ? - import('alpinejs').then((imp) => imp.default) : alpine - ).then((alpine: typeof Alpine): void => { - if (opts.bootstrapAlpine) { - window.Alpine = alpine; - } - - window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); - - if (opts.startAlpine) { - alpine.start(); - } - }); - } - -} - -/** - * Export a function to be used with `Alpine.plugin()`. - * - * @public - * - * Calls {@link AlpineComponents.bootstrap} with sensible options. - * - * @param alpine - */ -export function componentsPlugin(alpine: Globals.Alpine) { - AlpineComponents.bootstrap({ - bootstrapAlpine: false, - startAlpine: false - }, alpine); -} diff --git a/src/Store.ts b/src/Store.ts deleted file mode 100644 index 7e62333..0000000 --- a/src/Store.ts +++ /dev/null @@ -1,256 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Impl from './Component'; -import type * as Globals from './Global'; - -import {AlpineComponent, type AlpineComponentConstructor} from './Component'; - -/** - * @see https://www.w3schools.com/js/js_reserved.asp - * - * @internal - */ -const ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', - 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', - 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', - 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', - 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', - 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', - 'with', 'yield']; - -/** - * Type definition for list of named component constructors. - * - * @public - */ -export type ComponentList = { - [name: string]: Impl.KnownConstructor -}; - -/** - * Internal type for component registration. - * - * @internal - */ -type ComponentConstructorData = { - name: string, - constructor: Impl.AlpineComponentConstructor -}; - -/** - * Internal component registration failure reasons. - * - * @internal - */ -enum RegisterComponentFailure { - GenericMustHaveFunctionAsSecond, - NameMustBeProvidedForComponentWithNoDefault, - UnknownArgumentTypes, - ReservedName -} - -export class ComponentStore { - private initialized: boolean = false; - - private alpine: Globals.AlpineWithComponents; - - private components: Record = {}; - - constructor( - alpinejs: typeof Alpine, - components: ComponentList = {}, - private readonly logErrors: boolean = false - ) { - this.alpine = alpinejs; - this.alpine.Components = this; - this.alpine.component = this.component; - - Object.entries(components).forEach(([name, component]): void => { - this.register(name, component); - }); - - window.addEventListener('alpine:init', (): void => { - this.init(); - }); - } - - private init(): void { - if (this.initialized) { - return; - } - - document.dispatchEvent(new CustomEvent('alpine-components:init')); - - Object.entries(this.components) - .forEach(([name]) => - this.registerConstructorAsAlpineData(name)); - - this.initialized = true; - } - - /** - * Retrieve a registered component constructor. - * - * @param name The component name - * - * @return ComponentConstructor - * - * If registered, returns a callable that accepts the component constructor arguments - * and creates the component object. Returns undefined if not registered. - */ - component(name: string): Impl.AlpineComponentConstructor { - // @ts-ignore - return this.components[name]; - } - - registerAll(components: ComponentList): void { - Object.entries(components) - .forEach(([name, component]) => - this.register(name, component)); - } - - /** - * Register a generic object (alpine data) as a component. - * - * @param name The name of the component (registered to alpine for use with x-data.) - * @param component The function that returns component data. - */ - register(name: string, component: Impl.KnownConstructor): void; - - /** - * Register a class inheriting from {@link Impl.AlpineComponent} as a component. - * - * @param component The name/symbol of the class to register as a component. - * @param name The name of the component (registered to alpine for use with x-data.) - */ - register(component: Impl.KnownClassConstructor, name?: string): void; - - register( - // @ts-expect-error TS3244 - nameOrComponentClass: string|Impl.KnownConstructor|Impl.KnownClassConstructor, - constructorOrComponentName: Impl.KnownConstructor|string = '' - ): void { - let component: ComponentConstructorData; - - if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) - if (typeof constructorOrComponentName === 'string') { - this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); - return; - } - component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); - } else if (typeof nameOrComponentClass === 'function') { // register class as component - component = ComponentStore.getClassData(>nameOrComponentClass, constructorOrComponentName); - if (component.name === "") { - this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); - } - } else { - this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); - return; - } - - if (ReservedNames.includes(component.name)) { - this.logRegisterFailure(RegisterComponentFailure.ReservedName); - } - - this.components[component.name] = component.constructor; - - if (this.initialized) { - this.registerConstructorAsAlpineData(component.name); - } - } - - /** - * Register a component to Alpine through Alpine.data(). - * - * @param name The name of the component (must already be registered to the store.) - */ - private registerConstructorAsAlpineData(name: string): void { - this.alpine.data(name, this.component(name)); - } - - private static getObjectData( - name: string, - component: Impl.KnownConstructor - ): ComponentConstructorData { - return { - name: name, - constructor: ((component.prototype instanceof AlpineComponent) ? - // @ts-ignore - makeAlpineConstructor(component) : component) - }; - } - - private static getClassData( - component: Impl.KnownClassConstructor, - name?: string - ): ComponentConstructorData { - const resolvedName: string = (name !== undefined ? name : component.prototype.name); - - return { - name: resolvedName, - constructor: makeAlpineConstructor(component) - }; - } - - private logRegisterFailure(reason: RegisterComponentFailure): void { - if (!this.logErrors) { - return; - } - - switch (reason) { - case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: - console.error(`Second argument must be a constructor function for component.`); - break; - case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: - // should be impossible because we fall back to prototype name - console.error(`Component name must be provided when class doesn't specify a default.`); - break; - case RegisterComponentFailure.UnknownArgumentTypes: - console.error(`Cannot register component with provided argument types. Check Typescript definitions for usage.`); - break; - case RegisterComponentFailure.ReservedName: - console.error(`Cannot register component with name matching a reserved keyword.`); - break; - } - } - -} - -/** - * Copy prototype functions and object properties to an empty object. - * - * @param instance The object to copy functions and properties from - */ -export function transformToAlpineData(instance: T): object { - let methodNames: string[] = []; - for ( - let prototype = Object.getPrototypeOf(instance); - prototype.constructor.name !== 'Object'; - prototype = Object.getPrototypeOf(prototype) - ) { - Object.getOwnPropertyNames(prototype).forEach((name: string): void => { - if (methodNames.includes(name)) { - return; - } - methodNames.push(name); - }); - } - - return [ - ...methodNames, // methods - ...Object.getOwnPropertyNames(instance) // properties - ].reduce((obj: {}, name: string) => { - // @ts-ignore - obj[name] = instance[name]; - - return obj; - }, {}); -} - -/** - * Transform a class constructor into an alpine constructor function. - * - * @param component The class constructor - */ -export function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor { - return (...args: any[]) => transformToAlpineData(new component(...args)); -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index ca546e5..0000000 --- a/src/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Export functions and types. - */ - -export { - type AlpineBindingContext, - type AlpineComponentConstructor, - type AlpineData, - type AlpineDataContext, - type KnownConstructor, - type KnownClassConstructor, - type KnownGenericConstructor, - AlpineComponent -} from './Component'; - -export { - type ComponentList, - ComponentStore, - transformToAlpineData, - makeAlpineConstructor -} from './Store'; - -export * as Globals from './Global'; - -export { - AlpineComponents, - componentsPlugin -} from './Plugin'; - - -/** - * Alpine plugin as default export. - */ -import {componentsPlugin} from './Plugin'; -export default componentsPlugin; diff --git a/types/Component.d.ts b/types/Component.d.ts new file mode 100644 index 0000000..8f6ce9d --- /dev/null +++ b/types/Component.d.ts @@ -0,0 +1,135 @@ +/** + * Type definition for known class constructors. + * + * @public + */ +export type KnownClassConstructor = new (...args: any[]) => T; +/** + * Type definition for known generic constructors. + * + * @public + */ +export type KnownGenericConstructor = (...args: any[]) => T; +/** + * Type definition for supported constructor functions. + * + * @public + */ +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +/** + * Type definition for alpine component constructors. + * + * @public + */ +export type AlpineComponentConstructor = (...args: any[]) => any; +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare interface AlpineDataContext { + /** + * Will be executed before Alpine initializes teh rest of the component. + */ + init?(): void; + [stateKey: string]: any; +} +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare type AlpineData = AlpineDataContext | string | number | boolean; +/** + * Type used to define properties that will exist on an x-bind object at runtime. + * + * @template T The component type + * @template Keys The properties to expose to the context (defaults to everything + * accessible with `keyof`) + * @template HiddenKeys Define accessible properties (protected/private) that are + * not included by `keyof` + */ +export type AlpineBindingContext = Record | (Pick & { + [K in HiddenKeys]: string | number | boolean; +}); +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare abstract class AlpineComponent implements AlpineDataContext { + /** + * Access to current Alpine data. + */ + $data: this; + /** + * Retrieve the current DOM node. + */ + $el: HTMLElement; + /** + * Retrieve DOM elements marked with x-ref inside the component. + */ + $refs: Record; + /** + * Access registered global Alpine stores. + */ + $store: AlpineData; + /** + * Dispatch browser events. + * + * @param event the event name + * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property + */ + $dispatch: (event: string, data?: any) => void; + /** + * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. + * + * @param name the name of the id + * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop + */ + $id: (name: string, key?: number | string) => string; + /** + * Execute a given expression AFTER Alpine has made its reactive DOM updates. + * + * @param callback a callback that will be fired after Alpine finishes updating the DOM + */ + $nextTick: (callback?: () => void) => Promise; + /** + * Fire the given callback when the value in the property is changed. + * + * @param property the component property + * @param callback a callback that will fire when a given property is changed + */ + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + protected binding(obj: AlpineBindingContext): AlpineBindingContext; +} diff --git a/types/Global.d.ts b/types/Global.d.ts new file mode 100644 index 0000000..973da58 --- /dev/null +++ b/types/Global.d.ts @@ -0,0 +1,60 @@ +/** + * Type declarations for Alpine and browser window global. + */ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from './Store'; +import type { AlpineComponentConstructor } from './Component'; +/** + * Define the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type Alpine = AlpineType | AlpineWithComponents; +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export declare function satisfiesAlpineWithComponents(obj: Alpine): boolean; +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export declare function castToAlpineWithComponents(obj?: Alpine): AlpineWithComponents | null; +declare global { + /** + * Expose window.Alpine and window.AlpineComponents globals. + * + * @public + */ + interface Window { + Alpine: AlpineWithComponents; + AlpineComponents: ComponentStore; + } +} diff --git a/types/Plugin.d.ts b/types/Plugin.d.ts new file mode 100644 index 0000000..0a83d57 --- /dev/null +++ b/types/Plugin.d.ts @@ -0,0 +1,56 @@ +import type Alpine from 'alpinejs'; +import type * as Globals from './Global'; +import { type ComponentList } from './Store'; +export declare namespace AlpineComponents { + /** + * Bootstrap options. + * + * @public + */ + interface Options { + /** + * List of named components to register. + */ + components: ComponentList; + /** + * Create Alpine object and inject into window.Alpine? + */ + bootstrapAlpine: boolean; + /** + * Call Alpine.start()? + */ + startAlpine: boolean; + /** + * Log errors to console? + */ + logErrors: boolean; + } + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + const defaultOptions: Options; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options?: Partial, alpine?: typeof Alpine): void; +} +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/types/Store.d.ts b/types/Store.d.ts new file mode 100644 index 0000000..695e678 --- /dev/null +++ b/types/Store.d.ts @@ -0,0 +1,66 @@ +import type Alpine from 'alpinejs'; +import type * as Impl from './Component'; +import { AlpineComponent } from './Component'; +/** + * Type definition for list of named component constructors. + * + * @public + */ +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private readonly logErrors; + private initialized; + private alpine; + private components; + constructor(alpinejs: typeof Alpine, components?: ComponentList, logErrors?: boolean); + private init; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + /** + * Register a generic object (alpine data) as a component. + * + * @param name The name of the component (registered to alpine for use with x-data.) + * @param component The function that returns component data. + */ + register(name: string, component: Impl.KnownConstructor): void; + /** + * Register a class inheriting from {@link Impl.AlpineComponent} as a component. + * + * @param component The name/symbol of the class to register as a component. + * @param name The name of the component (registered to alpine for use with x-data.) + */ + register(component: Impl.KnownClassConstructor, name?: string): void; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export declare function transformToAlpineData(instance: T): object; +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..e4004f6 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,12 @@ +/** + * Export functions and types. + */ +export { type AlpineBindingContext, type AlpineComponentConstructor, type AlpineData, type AlpineDataContext, type KnownConstructor, type KnownClassConstructor, type KnownGenericConstructor, AlpineComponent } from './Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; From befc7988d6c190de571674a334b641af006a3ec3 Mon Sep 17 00:00:00 2001 From: JackNoordhuis <10399774+JackNoordhuis@users.noreply.github.com> Date: Wed, 11 Dec 2024 04:17:33 +0000 Subject: [PATCH 33/33] [create-pull-request] update tsc build dist files --- dist/Component.js | 41 +++++++ dist/Global.js | 29 +++++ dist/Plugin.js | 75 +++++++++++++ dist/Store.js | 201 +++++++++++++++++++++++++++++++++ dist/index.js | 13 +++ src/Component.ts | 161 --------------------------- src/Global.ts | 73 ------------ src/Plugin.ts | 109 ------------------ src/Store.ts | 256 ------------------------------------------- src/index.ts | 35 ------ types/Component.d.ts | 135 +++++++++++++++++++++++ types/Global.d.ts | 60 ++++++++++ types/Plugin.d.ts | 56 ++++++++++ types/Store.d.ts | 66 +++++++++++ types/index.d.ts | 12 ++ 15 files changed, 688 insertions(+), 634 deletions(-) create mode 100644 dist/Component.js create mode 100644 dist/Global.js create mode 100644 dist/Plugin.js create mode 100644 dist/Store.js create mode 100644 dist/index.js delete mode 100644 src/Component.ts delete mode 100644 src/Global.ts delete mode 100644 src/Plugin.ts delete mode 100644 src/Store.ts delete mode 100644 src/index.ts create mode 100644 types/Component.d.ts create mode 100644 types/Global.d.ts create mode 100644 types/Plugin.d.ts create mode 100644 types/Store.d.ts create mode 100644 types/index.d.ts diff --git a/dist/Component.js b/dist/Component.js new file mode 100644 index 0000000..d9eb78a --- /dev/null +++ b/dist/Component.js @@ -0,0 +1,41 @@ +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +var AlpineComponent = /** @class */ (function () { + function AlpineComponent() { + } + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + AlpineComponent.prototype.binding = function (obj) { + return obj; + }; + return AlpineComponent; +}()); +export { AlpineComponent }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxRUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSDtJQUFBO0lBK0VBLENBQUM7SUF2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNPLGlDQUFPLEdBQWpCLFVBQWtELEdBQXVEO1FBQ3hHLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVGLHNCQUFDO0FBQUQsQ0FBQyxBQS9FRCxJQStFQyJ9 \ No newline at end of file diff --git a/dist/Global.js b/dist/Global.js new file mode 100644 index 0000000..914352e --- /dev/null +++ b/dist/Global.js @@ -0,0 +1,29 @@ +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export function satisfiesAlpineWithComponents(obj) { + // @ts-ignore + return !!(obj.Components && obj.component); +} +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export function castToAlpineWithComponents(obj) { + if (obj === void 0) { obj = window.Alpine; } + return satisfiesAlpineWithComponents(obj) ? obj : null; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsR0FBVztJQUN4RCxhQUFhO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxHQUEyQjtJQUEzQixvQkFBQSxFQUFBLE1BQWMsTUFBTSxDQUFDLE1BQU07SUFDckUsT0FBTyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzlFLENBQUMifQ== \ No newline at end of file diff --git a/dist/Plugin.js b/dist/Plugin.js new file mode 100644 index 0000000..a18250c --- /dev/null +++ b/dist/Plugin.js @@ -0,0 +1,75 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { ComponentStore } from './Store'; +export var AlpineComponents; +(function (AlpineComponents) { + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + AlpineComponents.defaultOptions = { + components: {}, + bootstrapAlpine: false, + startAlpine: true, + logErrors: false + }; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options, alpine) { + if (options === void 0) { options = AlpineComponents.defaultOptions; } + if (alpine === void 0) { alpine = window.Alpine; } + var opts = __assign(__assign({}, AlpineComponents.defaultOptions), options); + if (opts.bootstrapAlpine && alpine !== undefined) { + if (opts.logErrors) { + console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); + } + return; + } + Promise.resolve(opts.bootstrapAlpine ? + import('alpinejs').then(function (imp) { return imp.default; }) : alpine).then(function (alpine) { + if (opts.bootstrapAlpine) { + window.Alpine = alpine; + } + window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); + if (opts.startAlpine) { + alpine.start(); + } + }); + } + AlpineComponents.bootstrap = bootstrap; +})(AlpineComponents || (AlpineComponents = {})); +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export function componentsPlugin(alpine) { + AlpineComponents.bootstrap({ + bootstrapAlpine: false, + startAlpine: false + }, alpine); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBLE9BQU8sRUFFTixjQUFjLEVBQ2QsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxLQUFXLGdCQUFnQixDQXFGaEM7QUFyRkQsV0FBaUIsZ0JBQWdCO0lBNEJoQzs7Ozs7O09BTUc7SUFDVSwrQkFBYyxHQUFZO1FBQ3RDLFVBQVUsRUFBRSxFQUFFO1FBRWQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFFakIsU0FBUyxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUVGOzs7Ozs7OztPQVFHO0lBQ0gsU0FBZ0IsU0FBUyxDQUN4QixPQUEwQyxFQUMxQyxNQUFxQztRQURyQyx3QkFBQSxFQUFBLFVBQTRCLCtCQUFjO1FBQzFDLHVCQUFBLEVBQUEsU0FBd0IsTUFBTSxDQUFDLE1BQU07UUFFckMsSUFBTSxJQUFJLHlCQUNOLGlCQUFBLGNBQWMsR0FDZCxPQUFPLENBQ1YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztZQUNqRixDQUFDO1lBQ0QsT0FBTztRQUNSLENBQUM7UUFFRCxPQUFPLENBQUMsT0FBTyxDQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsR0FBRyxJQUFLLE9BQUEsR0FBRyxDQUFDLE9BQU8sRUFBWCxDQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUN2RCxDQUFDLElBQUksQ0FBQyxVQUFDLE1BQXFCO1lBQzVCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMxQixNQUFNLENBQUMsTUFBTSxHQUFpQyxNQUFNLENBQUM7WUFDdEQsQ0FBQztZQUVELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBOUJlLDBCQUFTLFlBOEJ4QixDQUFBO0FBRUYsQ0FBQyxFQXJGZ0IsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQXFGaEM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFzQjtJQUN0RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDMUIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsV0FBVyxFQUFFLEtBQUs7S0FDbEIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNaLENBQUMifQ== \ No newline at end of file diff --git a/dist/Store.js b/dist/Store.js new file mode 100644 index 0000000..ed83629 --- /dev/null +++ b/dist/Store.js @@ -0,0 +1,201 @@ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { AlpineComponent } from './Component'; +/** + * @see https://www.w3schools.com/js/js_reserved.asp + * + * @internal + */ +var ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', + 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', + 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', + 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', + 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', + 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', + 'with', 'yield']; +/** + * Internal component registration failure reasons. + * + * @internal + */ +var RegisterComponentFailure; +(function (RegisterComponentFailure) { + RegisterComponentFailure[RegisterComponentFailure["GenericMustHaveFunctionAsSecond"] = 0] = "GenericMustHaveFunctionAsSecond"; + RegisterComponentFailure[RegisterComponentFailure["NameMustBeProvidedForComponentWithNoDefault"] = 1] = "NameMustBeProvidedForComponentWithNoDefault"; + RegisterComponentFailure[RegisterComponentFailure["UnknownArgumentTypes"] = 2] = "UnknownArgumentTypes"; + RegisterComponentFailure[RegisterComponentFailure["ReservedName"] = 3] = "ReservedName"; +})(RegisterComponentFailure || (RegisterComponentFailure = {})); +var ComponentStore = /** @class */ (function () { + function ComponentStore(alpinejs, components, logErrors) { + if (components === void 0) { components = {}; } + if (logErrors === void 0) { logErrors = false; } + var _this = this; + this.logErrors = logErrors; + this.initialized = false; + this.components = {}; + this.alpine = alpinejs; + this.alpine.Components = this; + this.alpine.component = this.component; + Object.entries(components).forEach(function (_a) { + var name = _a[0], component = _a[1]; + _this.register(name, component); + }); + window.addEventListener('alpine:init', function () { + _this.init(); + }); + } + ComponentStore.prototype.init = function () { + var _this = this; + if (this.initialized) { + return; + } + document.dispatchEvent(new CustomEvent('alpine-components:init')); + Object.entries(this.components) + .forEach(function (_a) { + var name = _a[0]; + return _this.registerConstructorAsAlpineData(name); + }); + this.initialized = true; + }; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + ComponentStore.prototype.component = function (name) { + // @ts-ignore + return this.components[name]; + }; + ComponentStore.prototype.registerAll = function (components) { + var _this = this; + Object.entries(components) + .forEach(function (_a) { + var name = _a[0], component = _a[1]; + return _this.register(name, component); + }); + }; + ComponentStore.prototype.register = function ( + // @ts-expect-error TS3244 + nameOrComponentClass, constructorOrComponentName) { + if (constructorOrComponentName === void 0) { constructorOrComponentName = ''; } + var component; + if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) + if (typeof constructorOrComponentName === 'string') { + this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); + return; + } + component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); + } + else if (typeof nameOrComponentClass === 'function') { // register class as component + component = ComponentStore.getClassData(nameOrComponentClass, constructorOrComponentName); + if (component.name === "") { + this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); + } + } + else { + this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); + return; + } + if (ReservedNames.includes(component.name)) { + this.logRegisterFailure(RegisterComponentFailure.ReservedName); + } + this.components[component.name] = component.constructor; + if (this.initialized) { + this.registerConstructorAsAlpineData(component.name); + } + }; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + ComponentStore.prototype.registerConstructorAsAlpineData = function (name) { + this.alpine.data(name, this.component(name)); + }; + ComponentStore.getObjectData = function (name, component) { + return { + name: name, + constructor: ((component.prototype instanceof AlpineComponent) ? + // @ts-ignore + makeAlpineConstructor(component) : component) + }; + }; + ComponentStore.getClassData = function (component, name) { + var resolvedName = (name !== undefined ? name : component.prototype.name); + return { + name: resolvedName, + constructor: makeAlpineConstructor(component) + }; + }; + ComponentStore.prototype.logRegisterFailure = function (reason) { + if (!this.logErrors) { + return; + } + switch (reason) { + case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: + console.error("Second argument must be a constructor function for component."); + break; + case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: + // should be impossible because we fall back to prototype name + console.error("Component name must be provided when class doesn't specify a default."); + break; + case RegisterComponentFailure.UnknownArgumentTypes: + console.error("Cannot register component with provided argument types. Check Typescript definitions for usage."); + break; + case RegisterComponentFailure.ReservedName: + console.error("Cannot register component with name matching a reserved keyword."); + break; + } + }; + return ComponentStore; +}()); +export { ComponentStore }; +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export function transformToAlpineData(instance) { + var methodNames = []; + for (var prototype = Object.getPrototypeOf(instance); prototype.constructor.name !== 'Object'; prototype = Object.getPrototypeOf(prototype)) { + Object.getOwnPropertyNames(prototype).forEach(function (name) { + if (methodNames.includes(name)) { + return; + } + methodNames.push(name); + }); + } + return __spreadArray(__spreadArray([], methodNames, true), Object.getOwnPropertyNames(instance) // properties + , true).reduce(function (obj, name) { + // @ts-ignore + obj[name] = instance[name]; + return obj; + }, {}); +} +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export function makeAlpineConstructor(component) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return transformToAlpineData(new (component.bind.apply(component, __spreadArray([void 0], args, false)))()); + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBSUEsT0FBTyxFQUFDLGVBQWUsRUFBa0MsTUFBTSxhQUFhLENBQUM7QUFFN0U7Ozs7R0FJRztBQUNILElBQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUN0RyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTTtJQUNwRyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSztJQUNwRyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPO0lBQ25HLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQXFCbEI7Ozs7R0FJRztBQUNILElBQUssd0JBS0o7QUFMRCxXQUFLLHdCQUF3QjtJQUM1Qiw2SEFBK0IsQ0FBQTtJQUMvQixxSkFBMkMsQ0FBQTtJQUMzQyx1R0FBb0IsQ0FBQTtJQUNwQix1RkFBWSxDQUFBO0FBQ2IsQ0FBQyxFQUxJLHdCQUF3QixLQUF4Qix3QkFBd0IsUUFLNUI7QUFFRDtJQU9DLHdCQUNDLFFBQXVCLEVBQ3ZCLFVBQThCLEVBQ2IsU0FBMEI7UUFEM0MsMkJBQUEsRUFBQSxlQUE4QjtRQUNiLDBCQUFBLEVBQUEsaUJBQTBCO1FBSDVDLGlCQWdCQztRQWJpQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQVRwQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUk3QixlQUFVLEdBQStDLEVBQUUsQ0FBQztRQU9uRSxJQUFJLENBQUMsTUFBTSxHQUFpQyxRQUFRLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxFQUFpQjtnQkFBaEIsSUFBSSxRQUFBLEVBQUUsU0FBUyxRQUFBO1lBQ25ELEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRTtZQUN0QyxLQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyw2QkFBSSxHQUFaO1FBQUEsaUJBWUM7UUFYQSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPO1FBQ1IsQ0FBQztRQUVELFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO1FBRWxFLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUM3QixPQUFPLENBQUMsVUFBQyxFQUFNO2dCQUFMLElBQUksUUFBQTtZQUNkLE9BQUEsS0FBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQztRQUExQyxDQUEwQyxDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILGtDQUFTLEdBQVQsVUFBVSxJQUFZO1FBQ3JCLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELG9DQUFXLEdBQVgsVUFBWSxVQUF5QjtRQUFyQyxpQkFJQztRQUhBLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2FBQ3hCLE9BQU8sQ0FBQyxVQUFDLEVBQWlCO2dCQUFoQixJQUFJLFFBQUEsRUFBRSxTQUFTLFFBQUE7WUFDekIsT0FBQSxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7UUFBOUIsQ0FBOEIsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFrQkQsaUNBQVEsR0FBUjtJQUNDLDBCQUEwQjtJQUMxQixvQkFBbUYsRUFDbkYsMEJBQWdFO1FBQWhFLDJDQUFBLEVBQUEsK0JBQWdFO1FBRWhFLElBQUksU0FBbUMsQ0FBQztRQUV4QyxJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7WUFDOUYsSUFBSSxPQUFPLDBCQUEwQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDbEYsT0FBTztZQUNSLENBQUM7WUFDRCxTQUFTLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBSSxvQkFBb0IsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQy9GLENBQUM7YUFBTSxJQUFJLE9BQU8sb0JBQW9CLEtBQUssVUFBVSxFQUFFLENBQUMsQ0FBQyw4QkFBOEI7WUFDdEYsU0FBUyxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQW1ELG9CQUFvQixFQUFVLDBCQUEwQixDQUFDLENBQUM7WUFDcEosSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUMvRixDQUFDO1FBQ0YsQ0FBQzthQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxPQUFPO1FBQ1IsQ0FBQztRQUVELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFFeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLCtCQUErQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx3REFBK0IsR0FBdkMsVUFBd0MsSUFBWTtRQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFYyw0QkFBYSxHQUE1QixVQUNDLElBQVksRUFDWixTQUFtQztRQUVuQyxPQUFPO1lBQ04sSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQThCLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxZQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLGFBQWE7Z0JBQ2IscUJBQXFCLENBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVjLDJCQUFZLEdBQTNCLFVBQ0MsU0FBd0MsRUFDeEMsSUFBYTtRQUViLElBQU0sWUFBWSxHQUFXLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBGLE9BQU87WUFDTixJQUFJLEVBQUUsWUFBWTtZQUNsQixXQUFXLEVBQUUscUJBQXFCLENBQUksU0FBUyxDQUFDO1NBQ2hELENBQUM7SUFDSCxDQUFDO0lBRU8sMkNBQWtCLEdBQTFCLFVBQTJCLE1BQWdDO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckIsT0FBTztRQUNSLENBQUM7UUFFRCxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLEtBQUssd0JBQXdCLENBQUMsK0JBQStCO2dCQUM1RCxPQUFPLENBQUMsS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7Z0JBQy9FLE1BQU07WUFDUCxLQUFLLHdCQUF3QixDQUFDLDJDQUEyQztnQkFDeEUsOERBQThEO2dCQUM5RCxPQUFPLENBQUMsS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUM7Z0JBQ3ZGLE1BQU07WUFDUCxLQUFLLHdCQUF3QixDQUFDLG9CQUFvQjtnQkFDakQsT0FBTyxDQUFDLEtBQUssQ0FBQyxpR0FBaUcsQ0FBQyxDQUFDO2dCQUNqSCxNQUFNO1lBQ1AsS0FBSyx3QkFBd0IsQ0FBQyxZQUFZO2dCQUN6QyxPQUFPLENBQUMsS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7Z0JBQ2xGLE1BQU07UUFDUixDQUFDO0lBQ0YsQ0FBQztJQUVGLHFCQUFDO0FBQUQsQ0FBQyxBQXJLRCxJQXFLQzs7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUE0QixRQUFXO0lBQzNFLElBQUksV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUMvQixLQUNDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQy9DLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFDdkMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQzNDLENBQUM7UUFDRixNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBWTtZQUMxRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTztZQUNSLENBQUM7WUFDRCxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sZ0NBQ0gsV0FBVyxTQUNYLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhO1lBQ3BELE1BQU0sQ0FBQyxVQUFDLEdBQU8sRUFBRSxJQUFZO1FBQzlCLGFBQWE7UUFDYixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNCLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQTRCLFNBQXdDO0lBQ3hHLE9BQU87UUFBQyxjQUFjO2FBQWQsVUFBYyxFQUFkLHFCQUFjLEVBQWQsSUFBYztZQUFkLHlCQUFjOztRQUFLLE9BQUEscUJBQXFCLE1BQUssU0FBUyxZQUFULFNBQVMsMEJBQUksSUFBSSxhQUFFO0lBQTdDLENBQTZDLENBQUM7QUFDMUUsQ0FBQyJ9 \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..6cbf7c1 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,13 @@ +/** + * Export functions and types. + */ +export { AlpineComponent } from './Component'; +export { ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBUU4sZUFBZSxFQUNmLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFFTixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQ04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUdsQjs7R0FFRztBQUNILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMxQyxlQUFlLGdCQUFnQixDQUFDIn0= \ No newline at end of file diff --git a/src/Component.ts b/src/Component.ts deleted file mode 100644 index fab0602..0000000 --- a/src/Component.ts +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Type definition for known class constructors. - * - * @public - */ -export type KnownClassConstructor = new (...args: any[]) => T; -/** - * Type definition for known generic constructors. - * - * @public - */ -export type KnownGenericConstructor = (...args: any[]) => T; -/** - * Type definition for supported constructor functions. - * - * @public - */ -export type KnownConstructor = KnownGenericConstructor| - // @ts-expect-error TS2344 - KnownClassConstructor; - -/** - * Type definition for alpine component constructors. - * - * @public - */ -export type AlpineComponentConstructor = (...args: any[]) => any; - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare interface AlpineDataContext { - /** - * Will be executed before Alpine initializes teh rest of the component. - */ - init?(): void; - [stateKey: string]: any; -} - -/** - * Copied from @types/alpinejs because it isn't exported. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export declare type AlpineData = AlpineDataContext | string | number | boolean; - -/** - * Type used to define properties that will exist on an x-bind object at runtime. - * - * @template T The component type - * @template Keys The properties to expose to the context (defaults to everything - * accessible with `keyof`) - * @template HiddenKeys Define accessible properties (protected/private) that are - * not included by `keyof` - */ -export type AlpineBindingContext< - T extends AlpineComponent, - Keys extends keyof T = keyof T, - HiddenKeys extends string = '' -> = Record | (Pick & { - [K in HiddenKeys]: string | number | boolean; -}); - -/** - * Light-weight interface for class based components. - * - * Provides property declarations for Alpine magics that will exist when - * used as an Alpine component. - * - * Property declarations copied from @types/alpinejs. - * - * {@link https://www.npmjs.com/package/@types/alpinejs} - * - * @public - */ -export abstract class AlpineComponent implements AlpineDataContext { - - /** - * Access to current Alpine data. - */ - declare $data: this; - - /** - * Retrieve the current DOM node. - */ - declare $el: HTMLElement; - - /** - * Retrieve DOM elements marked with x-ref inside the component. - */ - declare $refs: Record; - - /** - * Access registered global Alpine stores. - */ - declare $store: AlpineData; - - /** - * Dispatch browser events. - * - * @param event the event name - * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property - */ - declare $dispatch: (event: string, data?: any) => void; - - /** - * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. - * - * @param name the name of the id - * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop - */ - declare $id: (name: string, key?: number | string) => string; - - /** - * Execute a given expression AFTER Alpine has made its reactive DOM updates. - * - * @param callback a callback that will be fired after Alpine finishes updating the DOM - */ - declare $nextTick: (callback?: () => void) => Promise; - - /** - * Fire the given callback when the value in the property is changed. - * - * @param property the component property - * @param callback a callback that will fire when a given property is changed - */ - declare $watch: ( - property: K, - callback: (newValue: V, oldValue: V) => void, - ) => void; - - /** - * Declare an object as an x-bind property for this component. - * - * Use this method to define properties for use with x-bind: - * ```typescript - * protected myBinding = this.binding({ - * ["@click.prevent"]() { console.log("click prevented!") } - * }); - * ``` - * - * @protected - * - * @template HiddenKeys Define accessible properties (protected/private) - * that are not included by `keyof` - * - * @param obj The object for use with x-bind - * - * @return The same object passed to {@link obj} - */ - protected binding(obj: AlpineBindingContext) { - return obj; - } - -} diff --git a/src/Global.ts b/src/Global.ts deleted file mode 100644 index 0b6c4bf..0000000 --- a/src/Global.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Type declarations for Alpine and browser window global. - */ -import type {Alpine as AlpineType} from 'alpinejs'; -import type {ComponentStore} from './Store'; -import type {AlpineComponentConstructor} from './Component'; - -/** - * Define the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare interface AlpineComponentMixins { - Components: ComponentStore; - component: (name: string) => AlpineComponentConstructor; -} - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type AlpineWithComponents = AlpineType&AlpineComponentMixins; - -/** - * Expose the properties we add to the `window.Alpine` object. - * - * @public - */ -export declare type Alpine = AlpineType|AlpineWithComponents; - -/** - * Check if an {@link Alpine} object has the components properties. - * - * @public - * - * @param obj The Alpine object to check - * - * @return True if component properties are injected, false otherwise. - */ -export function satisfiesAlpineWithComponents(obj: Alpine): boolean { - // @ts-ignore - return !!(obj.Components && obj.component); -} - -/** - * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it - * has the injected properties. - * - * @public - * - * @param obj The Alpine object to cast - * - * @return The object cast to {@link AlpineWithComponents} if properties are - * injected, null otherwise. - */ -export function castToAlpineWithComponents(obj: Alpine = window.Alpine): AlpineWithComponents|null { - return satisfiesAlpineWithComponents(obj) ? obj : null; -} - -declare global { - - /** - * Expose window.Alpine and window.AlpineComponents globals. - * - * @public - */ - interface Window { - Alpine: AlpineWithComponents; - AlpineComponents: ComponentStore; - } - -} diff --git a/src/Plugin.ts b/src/Plugin.ts deleted file mode 100644 index 6bc6947..0000000 --- a/src/Plugin.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Globals from './Global'; -import { - type ComponentList, - ComponentStore -} from './Store'; - -export namespace AlpineComponents { - - /** - * Bootstrap options. - * - * @public - */ - export interface Options { - /** - * List of named components to register. - */ - components: ComponentList, - - /** - * Create Alpine object and inject into window.Alpine? - */ - bootstrapAlpine: boolean; - /** - * Call Alpine.start()? - */ - startAlpine: boolean; - - /** - * Log errors to console? - */ - logErrors: boolean; - } - - /** - * Default bootstrap options. - * - * Assumes production environment. - * - * @public - */ - export const defaultOptions: Options = { - components: {}, - - bootstrapAlpine: false, - startAlpine: true, - - logErrors: false - }; - - /** - * Bootstrap the components package. - * - * @public - * - * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) - * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when - * the bootstrapAlpine option is set) - */ - export function bootstrap( - options: Partial = defaultOptions, - alpine: typeof Alpine = window.Alpine - ): void { - const opts: Options = { - ...defaultOptions, - ...options - }; - - if (opts.bootstrapAlpine && alpine !== undefined) { - if (opts.logErrors) { - console.error('Cannot bootstrap Alpine when window.Alpine is already defined.'); - } - return; - } - - Promise.resolve( - opts.bootstrapAlpine ? - import('alpinejs').then((imp) => imp.default) : alpine - ).then((alpine: typeof Alpine): void => { - if (opts.bootstrapAlpine) { - window.Alpine = alpine; - } - - window.AlpineComponents = new ComponentStore(alpine, opts.components, opts.logErrors); - - if (opts.startAlpine) { - alpine.start(); - } - }); - } - -} - -/** - * Export a function to be used with `Alpine.plugin()`. - * - * @public - * - * Calls {@link AlpineComponents.bootstrap} with sensible options. - * - * @param alpine - */ -export function componentsPlugin(alpine: Globals.Alpine) { - AlpineComponents.bootstrap({ - bootstrapAlpine: false, - startAlpine: false - }, alpine); -} diff --git a/src/Store.ts b/src/Store.ts deleted file mode 100644 index 7e62333..0000000 --- a/src/Store.ts +++ /dev/null @@ -1,256 +0,0 @@ -import type Alpine from 'alpinejs'; -import type * as Impl from './Component'; -import type * as Globals from './Global'; - -import {AlpineComponent, type AlpineComponentConstructor} from './Component'; - -/** - * @see https://www.w3schools.com/js/js_reserved.asp - * - * @internal - */ -const ReservedNames = ['abstract', 'arguments', 'await', 'boolean', 'break', 'byte', 'case', - 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', - 'enum', 'eval', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', - 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', - 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', - 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', - 'with', 'yield']; - -/** - * Type definition for list of named component constructors. - * - * @public - */ -export type ComponentList = { - [name: string]: Impl.KnownConstructor -}; - -/** - * Internal type for component registration. - * - * @internal - */ -type ComponentConstructorData = { - name: string, - constructor: Impl.AlpineComponentConstructor -}; - -/** - * Internal component registration failure reasons. - * - * @internal - */ -enum RegisterComponentFailure { - GenericMustHaveFunctionAsSecond, - NameMustBeProvidedForComponentWithNoDefault, - UnknownArgumentTypes, - ReservedName -} - -export class ComponentStore { - private initialized: boolean = false; - - private alpine: Globals.AlpineWithComponents; - - private components: Record = {}; - - constructor( - alpinejs: typeof Alpine, - components: ComponentList = {}, - private readonly logErrors: boolean = false - ) { - this.alpine = alpinejs; - this.alpine.Components = this; - this.alpine.component = this.component; - - Object.entries(components).forEach(([name, component]): void => { - this.register(name, component); - }); - - window.addEventListener('alpine:init', (): void => { - this.init(); - }); - } - - private init(): void { - if (this.initialized) { - return; - } - - document.dispatchEvent(new CustomEvent('alpine-components:init')); - - Object.entries(this.components) - .forEach(([name]) => - this.registerConstructorAsAlpineData(name)); - - this.initialized = true; - } - - /** - * Retrieve a registered component constructor. - * - * @param name The component name - * - * @return ComponentConstructor - * - * If registered, returns a callable that accepts the component constructor arguments - * and creates the component object. Returns undefined if not registered. - */ - component(name: string): Impl.AlpineComponentConstructor { - // @ts-ignore - return this.components[name]; - } - - registerAll(components: ComponentList): void { - Object.entries(components) - .forEach(([name, component]) => - this.register(name, component)); - } - - /** - * Register a generic object (alpine data) as a component. - * - * @param name The name of the component (registered to alpine for use with x-data.) - * @param component The function that returns component data. - */ - register(name: string, component: Impl.KnownConstructor): void; - - /** - * Register a class inheriting from {@link Impl.AlpineComponent} as a component. - * - * @param component The name/symbol of the class to register as a component. - * @param name The name of the component (registered to alpine for use with x-data.) - */ - register(component: Impl.KnownClassConstructor, name?: string): void; - - register( - // @ts-expect-error TS3244 - nameOrComponentClass: string|Impl.KnownConstructor|Impl.KnownClassConstructor, - constructorOrComponentName: Impl.KnownConstructor|string = '' - ): void { - let component: ComponentConstructorData; - - if (typeof nameOrComponentClass === 'string') { // register generic object (normal alpine data) - if (typeof constructorOrComponentName === 'string') { - this.logRegisterFailure(RegisterComponentFailure.GenericMustHaveFunctionAsSecond); - return; - } - component = ComponentStore.getObjectData(nameOrComponentClass, constructorOrComponentName); - } else if (typeof nameOrComponentClass === 'function') { // register class as component - component = ComponentStore.getClassData(>nameOrComponentClass, constructorOrComponentName); - if (component.name === "") { - this.logRegisterFailure(RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault); - } - } else { - this.logRegisterFailure(RegisterComponentFailure.UnknownArgumentTypes); - return; - } - - if (ReservedNames.includes(component.name)) { - this.logRegisterFailure(RegisterComponentFailure.ReservedName); - } - - this.components[component.name] = component.constructor; - - if (this.initialized) { - this.registerConstructorAsAlpineData(component.name); - } - } - - /** - * Register a component to Alpine through Alpine.data(). - * - * @param name The name of the component (must already be registered to the store.) - */ - private registerConstructorAsAlpineData(name: string): void { - this.alpine.data(name, this.component(name)); - } - - private static getObjectData( - name: string, - component: Impl.KnownConstructor - ): ComponentConstructorData { - return { - name: name, - constructor: ((component.prototype instanceof AlpineComponent) ? - // @ts-ignore - makeAlpineConstructor(component) : component) - }; - } - - private static getClassData( - component: Impl.KnownClassConstructor, - name?: string - ): ComponentConstructorData { - const resolvedName: string = (name !== undefined ? name : component.prototype.name); - - return { - name: resolvedName, - constructor: makeAlpineConstructor(component) - }; - } - - private logRegisterFailure(reason: RegisterComponentFailure): void { - if (!this.logErrors) { - return; - } - - switch (reason) { - case RegisterComponentFailure.GenericMustHaveFunctionAsSecond: - console.error(`Second argument must be a constructor function for component.`); - break; - case RegisterComponentFailure.NameMustBeProvidedForComponentWithNoDefault: - // should be impossible because we fall back to prototype name - console.error(`Component name must be provided when class doesn't specify a default.`); - break; - case RegisterComponentFailure.UnknownArgumentTypes: - console.error(`Cannot register component with provided argument types. Check Typescript definitions for usage.`); - break; - case RegisterComponentFailure.ReservedName: - console.error(`Cannot register component with name matching a reserved keyword.`); - break; - } - } - -} - -/** - * Copy prototype functions and object properties to an empty object. - * - * @param instance The object to copy functions and properties from - */ -export function transformToAlpineData(instance: T): object { - let methodNames: string[] = []; - for ( - let prototype = Object.getPrototypeOf(instance); - prototype.constructor.name !== 'Object'; - prototype = Object.getPrototypeOf(prototype) - ) { - Object.getOwnPropertyNames(prototype).forEach((name: string): void => { - if (methodNames.includes(name)) { - return; - } - methodNames.push(name); - }); - } - - return [ - ...methodNames, // methods - ...Object.getOwnPropertyNames(instance) // properties - ].reduce((obj: {}, name: string) => { - // @ts-ignore - obj[name] = instance[name]; - - return obj; - }, {}); -} - -/** - * Transform a class constructor into an alpine constructor function. - * - * @param component The class constructor - */ -export function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor { - return (...args: any[]) => transformToAlpineData(new component(...args)); -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index ca546e5..0000000 --- a/src/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Export functions and types. - */ - -export { - type AlpineBindingContext, - type AlpineComponentConstructor, - type AlpineData, - type AlpineDataContext, - type KnownConstructor, - type KnownClassConstructor, - type KnownGenericConstructor, - AlpineComponent -} from './Component'; - -export { - type ComponentList, - ComponentStore, - transformToAlpineData, - makeAlpineConstructor -} from './Store'; - -export * as Globals from './Global'; - -export { - AlpineComponents, - componentsPlugin -} from './Plugin'; - - -/** - * Alpine plugin as default export. - */ -import {componentsPlugin} from './Plugin'; -export default componentsPlugin; diff --git a/types/Component.d.ts b/types/Component.d.ts new file mode 100644 index 0000000..8f6ce9d --- /dev/null +++ b/types/Component.d.ts @@ -0,0 +1,135 @@ +/** + * Type definition for known class constructors. + * + * @public + */ +export type KnownClassConstructor = new (...args: any[]) => T; +/** + * Type definition for known generic constructors. + * + * @public + */ +export type KnownGenericConstructor = (...args: any[]) => T; +/** + * Type definition for supported constructor functions. + * + * @public + */ +export type KnownConstructor = KnownGenericConstructor | KnownClassConstructor; +/** + * Type definition for alpine component constructors. + * + * @public + */ +export type AlpineComponentConstructor = (...args: any[]) => any; +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare interface AlpineDataContext { + /** + * Will be executed before Alpine initializes teh rest of the component. + */ + init?(): void; + [stateKey: string]: any; +} +/** + * Copied from @types/alpinejs because it isn't exported. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare type AlpineData = AlpineDataContext | string | number | boolean; +/** + * Type used to define properties that will exist on an x-bind object at runtime. + * + * @template T The component type + * @template Keys The properties to expose to the context (defaults to everything + * accessible with `keyof`) + * @template HiddenKeys Define accessible properties (protected/private) that are + * not included by `keyof` + */ +export type AlpineBindingContext = Record | (Pick & { + [K in HiddenKeys]: string | number | boolean; +}); +/** + * Light-weight interface for class based components. + * + * Provides property declarations for Alpine magics that will exist when + * used as an Alpine component. + * + * Property declarations copied from @types/alpinejs. + * + * {@link https://www.npmjs.com/package/@types/alpinejs} + * + * @public + */ +export declare abstract class AlpineComponent implements AlpineDataContext { + /** + * Access to current Alpine data. + */ + $data: this; + /** + * Retrieve the current DOM node. + */ + $el: HTMLElement; + /** + * Retrieve DOM elements marked with x-ref inside the component. + */ + $refs: Record; + /** + * Access registered global Alpine stores. + */ + $store: AlpineData; + /** + * Dispatch browser events. + * + * @param event the event name + * @param data an event-dependent value associated with the event, the value is then available to the handler using the CustomEvent.detail property + */ + $dispatch: (event: string, data?: any) => void; + /** + * Generate an element's ID and ensure that it won't conflict with other IDs of the same name on the same page. + * + * @param name the name of the id + * @param key suffix on the end of the generated ID, usually helpful for the purpose of identifying id in a loop + */ + $id: (name: string, key?: number | string) => string; + /** + * Execute a given expression AFTER Alpine has made its reactive DOM updates. + * + * @param callback a callback that will be fired after Alpine finishes updating the DOM + */ + $nextTick: (callback?: () => void) => Promise; + /** + * Fire the given callback when the value in the property is changed. + * + * @param property the component property + * @param callback a callback that will fire when a given property is changed + */ + $watch: (property: K, callback: (newValue: V, oldValue: V) => void) => void; + /** + * Declare an object as an x-bind property for this component. + * + * Use this method to define properties for use with x-bind: + * ```typescript + * protected myBinding = this.binding({ + * ["@click.prevent"]() { console.log("click prevented!") } + * }); + * ``` + * + * @protected + * + * @template HiddenKeys Define accessible properties (protected/private) + * that are not included by `keyof` + * + * @param obj The object for use with x-bind + * + * @return The same object passed to {@link obj} + */ + protected binding(obj: AlpineBindingContext): AlpineBindingContext; +} diff --git a/types/Global.d.ts b/types/Global.d.ts new file mode 100644 index 0000000..973da58 --- /dev/null +++ b/types/Global.d.ts @@ -0,0 +1,60 @@ +/** + * Type declarations for Alpine and browser window global. + */ +import type { Alpine as AlpineType } from 'alpinejs'; +import type { ComponentStore } from './Store'; +import type { AlpineComponentConstructor } from './Component'; +/** + * Define the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare interface AlpineComponentMixins { + Components: ComponentStore; + component: (name: string) => AlpineComponentConstructor; +} +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type AlpineWithComponents = AlpineType & AlpineComponentMixins; +/** + * Expose the properties we add to the `window.Alpine` object. + * + * @public + */ +export declare type Alpine = AlpineType | AlpineWithComponents; +/** + * Check if an {@link Alpine} object has the components properties. + * + * @public + * + * @param obj The Alpine object to check + * + * @return True if component properties are injected, false otherwise. + */ +export declare function satisfiesAlpineWithComponents(obj: Alpine): boolean; +/** + * Cast an {@link Alpine} object to {@link AlpineWithComponents} if it + * has the injected properties. + * + * @public + * + * @param obj The Alpine object to cast + * + * @return The object cast to {@link AlpineWithComponents} if properties are + * injected, null otherwise. + */ +export declare function castToAlpineWithComponents(obj?: Alpine): AlpineWithComponents | null; +declare global { + /** + * Expose window.Alpine and window.AlpineComponents globals. + * + * @public + */ + interface Window { + Alpine: AlpineWithComponents; + AlpineComponents: ComponentStore; + } +} diff --git a/types/Plugin.d.ts b/types/Plugin.d.ts new file mode 100644 index 0000000..0a83d57 --- /dev/null +++ b/types/Plugin.d.ts @@ -0,0 +1,56 @@ +import type Alpine from 'alpinejs'; +import type * as Globals from './Global'; +import { type ComponentList } from './Store'; +export declare namespace AlpineComponents { + /** + * Bootstrap options. + * + * @public + */ + interface Options { + /** + * List of named components to register. + */ + components: ComponentList; + /** + * Create Alpine object and inject into window.Alpine? + */ + bootstrapAlpine: boolean; + /** + * Call Alpine.start()? + */ + startAlpine: boolean; + /** + * Log errors to console? + */ + logErrors: boolean; + } + /** + * Default bootstrap options. + * + * Assumes production environment. + * + * @public + */ + const defaultOptions: Options; + /** + * Bootstrap the components package. + * + * @public + * + * @param options Provided options (defaults applied to missing values {@link defaultOptions}.) + * @param alpine The Alpine instance to use (defaults to window.Alpine or creates Alpine when + * the bootstrapAlpine option is set) + */ + function bootstrap(options?: Partial, alpine?: typeof Alpine): void; +} +/** + * Export a function to be used with `Alpine.plugin()`. + * + * @public + * + * Calls {@link AlpineComponents.bootstrap} with sensible options. + * + * @param alpine + */ +export declare function componentsPlugin(alpine: Globals.Alpine): void; diff --git a/types/Store.d.ts b/types/Store.d.ts new file mode 100644 index 0000000..695e678 --- /dev/null +++ b/types/Store.d.ts @@ -0,0 +1,66 @@ +import type Alpine from 'alpinejs'; +import type * as Impl from './Component'; +import { AlpineComponent } from './Component'; +/** + * Type definition for list of named component constructors. + * + * @public + */ +export type ComponentList = { + [name: string]: Impl.KnownConstructor; +}; +export declare class ComponentStore { + private readonly logErrors; + private initialized; + private alpine; + private components; + constructor(alpinejs: typeof Alpine, components?: ComponentList, logErrors?: boolean); + private init; + /** + * Retrieve a registered component constructor. + * + * @param name The component name + * + * @return ComponentConstructor + * + * If registered, returns a callable that accepts the component constructor arguments + * and creates the component object. Returns undefined if not registered. + */ + component(name: string): Impl.AlpineComponentConstructor; + registerAll(components: ComponentList): void; + /** + * Register a generic object (alpine data) as a component. + * + * @param name The name of the component (registered to alpine for use with x-data.) + * @param component The function that returns component data. + */ + register(name: string, component: Impl.KnownConstructor): void; + /** + * Register a class inheriting from {@link Impl.AlpineComponent} as a component. + * + * @param component The name/symbol of the class to register as a component. + * @param name The name of the component (registered to alpine for use with x-data.) + */ + register(component: Impl.KnownClassConstructor, name?: string): void; + /** + * Register a component to Alpine through Alpine.data(). + * + * @param name The name of the component (must already be registered to the store.) + */ + private registerConstructorAsAlpineData; + private static getObjectData; + private static getClassData; + private logRegisterFailure; +} +/** + * Copy prototype functions and object properties to an empty object. + * + * @param instance The object to copy functions and properties from + */ +export declare function transformToAlpineData(instance: T): object; +/** + * Transform a class constructor into an alpine constructor function. + * + * @param component The class constructor + */ +export declare function makeAlpineConstructor(component: Impl.KnownClassConstructor): Impl.AlpineComponentConstructor; diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..e4004f6 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,12 @@ +/** + * Export functions and types. + */ +export { type AlpineBindingContext, type AlpineComponentConstructor, type AlpineData, type AlpineDataContext, type KnownConstructor, type KnownClassConstructor, type KnownGenericConstructor, AlpineComponent } from './Component'; +export { type ComponentList, ComponentStore, transformToAlpineData, makeAlpineConstructor } from './Store'; +export * as Globals from './Global'; +export { AlpineComponents, componentsPlugin } from './Plugin'; +/** + * Alpine plugin as default export. + */ +import { componentsPlugin } from './Plugin'; +export default componentsPlugin;