import _get from 'lodash/get'
import _uniq from 'lodash/uniq'
import _property from 'lodash/property'
import _snakeCase from 'lodash/snakeCase'
import * as Mem from './userdata'
import { Model } from './model'
import { List } from './list'
import { Struct } from './struct'
import {
Cache,
DEPLOY,
CLASS,
SCHEMA,
SCOPE,
DEFAULT_RULE_TYPE,
QUERY_WITH_SCOPE,
ID,
NameBase,
PathCmd,
SortCmd,
OrderCmd,
RelationCmd,
} from './type'
import { Set } from './set'
import { Map } from './map'
import { Query } from './query'
import { Finder } from './finder'
import { PureObject, State } from './mem'
function rename(base: string): NameBase {
base = _snakeCase(base).replace(/s$/, '')
const name = Mem.Name[base]
if (name) {
return name
}
const list = `${base}s`
const o = (Mem.Name[list] = Mem.Name[base] = PureObject())
o.base = base
o.list = list
o.id = `${base}_id`
o.ids = `${base}_ids`
o.relations = []
o.deploys = []
o.depends = []
return o
}
function method({ prototype }: any, key: string, o: Object) {
Object.defineProperty(prototype, key, o)
}
export class Rule {
$name: NameBase
state: Cache
all: QUERY_WITH_SCOPE
model!: CLASS
list!: CLASS>
set!: CLASS>
map!: CLASS