///
import { Service, Id } from '@feathersjs/feathers';
import { Params, Paginated } from '../utils';
import { EventEmitter } from 'events';
import { Store } from 'vuex';
import { Ref } from '@vue/composition-api';
export { Id } from '@feathersjs/feathers';
export interface FeathersVuexOptions {
serverAlias: string;
addOnUpsert?: boolean;
autoRemove?: boolean;
debug?: boolean;
enableEvents?: boolean;
handleEvents?: HandleEvents;
idField?: string;
tempIdField?: string;
keepCopiesInStore?: boolean;
debounceEventsTime?: number;
debounceEventsMaxWait?: number;
nameStyle?: string;
paramsForServer?: string[];
preferUpdate?: boolean;
replaceItems?: boolean;
skipRequestIfExists?: boolean;
whitelist?: string[];
}
export interface HandleEvents {
created?: Function;
patched?: Function;
updated?: Function;
removed?: Function;
}
export interface ServicePluginExtendOptions {
store: Store;
module: any;
}
export interface MakeServicePluginOptions {
Model: any;
service: Service;
idField?: string;
tempIdField?: string;
addOnUpsert?: boolean;
autoRemove?: boolean;
debug?: boolean;
enableEvents?: boolean;
preferUpdate?: boolean;
replaceItems?: boolean;
skipRequestIfExists?: boolean;
nameStyle?: string;
keepCopiesInStore?: boolean;
debounceEventsTime?: number;
debounceEventsMaxWait?: number;
servicePath?: string;
namespace?: string;
whitelist?: string[];
paramsForServer?: string[];
instanceDefaults?: () => {};
setupInstance?: (data: any, { models, store }: {
models: any;
store: any;
}) => {};
handleEvents?: HandleEvents;
extend?: (options: ServicePluginExtendOptions) => {
state?: any;
getters?: any;
mutations?: any;
actions?: any;
};
state?: {};
getters?: {};
mutations?: {};
actions?: {};
}
export interface FeathersVuexStoreState {
}
export interface FeathersVuexGlobalModels {
}
export declare type StoreState = keyof FeathersVuexStoreState extends never ? any : FeathersVuexStoreState;
export declare type GlobalModels = keyof FeathersVuexGlobalModels extends never ? any : FeathersVuexGlobalModels;
export interface PatchParams extends Params {
data?: Partial;
}
export interface ModelSetupContext {
/**
* The global Vuex store
*/
store: StoreState;
/**
* The global `models` object
*/
models: GlobalModels;
}
export interface ModelInstanceOptions {
/**
* Creating clone?
*
* Default: `false`
*/
clone?: boolean;
/**
* Add to store
*
* Default: `true`
*/
commit?: boolean;
/**
* Merge with existing?
*
* Default: `true`
*/
merge?: boolean;
}
export declare type AnyData = {
[key: string]: any;
};
/** Static Model interface */
export interface ModelStatic extends EventEmitter {
/**
* The path passed to `FeathersClient.service()` to create the service
*/
servicePath: string;
/**
* Holds the value that was used to register the module with Vuex.
* This will match the servicePath unless you've provided a custom
* namespace in the Service Module plugin options.
*/
namespace: string;
/**
* The global Vuex store
*/
readonly store: Store;
/**
* The field in each record that will contain the ID
*/
idField: string;
/**
* The field in each temporary record that contains the temporary ID
*/
tempIdField: string;
/**
* If `true`, calling `model.save()` will do an `update` instead of a `patch`.
*/
preferUpdate: boolean;
/**
* Server alias in the global `models` object
*/
serverAlias: string;
/**
* Model name used to circumvent Babel transpilation errors
*/
modelName: string;
/**
* The global `models` object
*/
readonly models: GlobalModels;
/**
* All model copies created using `model.clone()`
*/
readonly copiesById: {
[key: string]: Model | undefined;
[key: number]: Model | undefined;
};
/**
* The BaseModel constructor calls mergeWithAccessors(this, newData).
* This utility function correctly copies data between both regular
* objects and Vue.observable instances. If you create a class where
* you need to do your own merging, you probably don't want
* mergeWithAccessors to run twice. In this case, you can use the
* `merge: false` BaseModel instance option to prevent the internal
* merge. You can then access the mergeWithAccessors method by calling
* this method like MyModel.merge(this, newData).
* @param dest destination object
* @param source source object
* @param blacklist keys to ignore when merging
* @example
* class Todo extends BaseModel {
* public constructor(data, options?) {
* options.merge = false // Prevent the internal merge
* super(data, options)
* // ... your custom constructor logic happens here.
* // Call the static merge method to do your own merging.
* Todo.merge(this, data)
* }
* }
*/
merge(dest: unknown, source: unknown, blacklist?: string[]): void;
/**
* Create new Model
* @param data partial model data
* @param options model instance options
*/
new (data?: AnyData, options?: ModelInstanceOptions): Model;
prototype: Model;
/**
* The instanceDefaults API was created in version 1.7 to prevent
* requiring to specify data for new instances created throughout
* the app. Depending on the complexity of the service's "business
* logic", it can save a lot of boilerplate. Notice that it is
* similar to the setupInstance method added in 2.0. The instanceDefaults
* method should ONLY be used to return default values for a new
* instance. Use setupInstance to handle other transformations on
* the data.
* @param data the instance data
* @param ctx setup context
*/
instanceDefaults(data: AnyData, ctx: ModelSetupContext): AnyData;
/**
* A new setupInstance class method is now available in version 2.0.
* This method allows you to transform the data and setup the final
* instance based on incoming data. For example, you can access the
* models object to reference other service Model classes and create
* data associations.
* @param data the instance data
* @param ctx setup context
*/
setupInstance(data: AnyData, ctx: ModelSetupContext): AnyData;
/**
* Gets called just before sending the data to the API server. It gets
* called with the data and must return the diffed data.
*
* Default: `data => data`
* @param data the instance data
*/
diffOnPatch(data: AnyData): AnyData;
/**
* A proxy for the `find` action
* @param params Find params
*/
find(params?: Params): Promise>;
/**
* A proxy for the `find` getter
* @param params Find params
*/
findInStore(params?: Params | Ref): Paginated;
/**
* A proxy for the `count` action
* @param params Find params
*/
count(params?: Params): Promise;
/**
* A proxy for the `count` getter
* @param params Find params
*/
countInStore(params?: Params | Ref): number;
/**
* A proxy for the `get` action
* @param id ID of record to retrieve
* @param params Get params
*/
get(id: Id, params?: Params): Promise;
/**
* A proxy for the `get` getter
* @param id ID of record to retrieve
* @param params Get params
*/
getFromStore(id: Id | Ref, params?: Params | Ref): M | undefined;
}
/** Model instance interface */
export interface Model {
[key: string]: any;
/**
* model's temporary ID
*/
readonly __id?: string;
/**
* model is temporary?
*/
readonly __isTemp?: boolean;
/**
* model is a clone?
*/
readonly __isClone?: boolean;
/**
* `Create` is currently pending on this model
*/
readonly isCreatePending: boolean;
/**
* `Update` is currently pending on this model
*/
readonly isUpdatePending: boolean;
/**
* `Patch` is currently pending on this model
*/
readonly isPatchPending: boolean;
/**
* `Remove` is currently pending on this model
*/
readonly isRemovePending: boolean;
/**
* Any of `create`, `update` or `patch` is currently pending on this model
*/
readonly isSavePending: boolean;
/**
* Any method is currently pending on this model
*/
readonly isPending: boolean;
/**
* Creates a deep copy of the record and stores it on
* `Model.copiesById`. This allows you to make changes
* to the clone and not update visible data until you
* commit or save the data.
* @param data Properties to modify on the cloned instance
*/
clone(data?: AnyData): this;
/**
* The create method calls the create action (service method)
* using the instance data.
* @param params Params passed to the Feathers client request
*/
create(params?: Params): Promise;
/**
* The patch method calls the patch action (service method)
* using the instance data. The instance's id field is used
* for the patch id.
*
* You can provide an object as `params.data`, and Feathers-Vuex
* will use `params.data` as the patch data. This allows patching
* with partial data.
* @param params Params passed to the Feathers client request
*/
patch(params?: PatchParams): Promise;
/**
* The remove method calls the remove action (service method)
* using the instance data. The instance's id field is used
* for the remove id.
* @param params Params passed to the Feathers client request
*/
remove(params?: Params): Promise;
/**
* The update method calls the update action (service method)
* using the instance data. The instance's id field is used for
* the update id.
* @param params Params passed to the Feathers client request
*/
update(params?: Params): Promise;
/**
* The save method is a convenience wrapper for the create/patch
* methods, by default. If the records has no _id, the
* instance.create() method will be used.
* @param params Params passed to the Feathers client request
*/
save(params?: Params): Promise;
/**
* Commit changes from clone to original
*/
commit(): this;
/**
* Discards changes made on this clone and syncs with the original
*/
reset(): this;
}