c = require './../schemas' metaschema = require './../metaschema' attackSelfCode = """ class AttacksSelf extends Component @className: 'AttacksSelf' chooseAction: -> @attack @ """ systems = [ 'action', 'ai', 'alliance', 'collision', 'combat', 'display', 'event', 'existence', 'hearing', 'inventory', 'movement', 'programming', 'targeting', 'ui', 'vision', 'misc', 'physics', 'effect', 'magic' ] PropertyDocumentationSchema = c.object { title: 'Property Documentation' description: 'Documentation entry for a property this Component will add to its Thang which other Components might want to also use.' 'default': name: 'foo' type: 'object' description: 'The `foo` property can satisfy all the #{spriteName}\'s foobar needs. Use it wisely.' required: ['name', 'type', 'description'] }, name: {type: 'string', title: 'Name', description: 'Name of the property.'} # not actual JS types, just whatever they describe... type: c.shortString(title: 'Type', description: 'Intended type of the property.') description: oneOf: [ {title: 'Description', type: 'string', description: 'Description of the property.', maxLength: 1000, format: 'markdown'} { type: 'object', title: 'Language Descriptions', description: 'Property descriptions by code language.', additionalProperties: {type: 'string', description: 'Description of the property.', maxLength: 1000, format: 'markdown'} } ] args: c.array {title: 'Arguments', description: 'If this property has type "function", then provide documentation for any function arguments.'}, c.FunctionArgumentSchema owner: {title: 'Owner', type: 'string', description: 'Owner of the property, like "this" or "Math".'} example: oneOf: [ {title: 'Example', type: 'string', description: 'An optional example code block.', format: 'javascript'} { type: 'object', title: 'Language Examples', description: 'Examples by code language.', additionalProperties: {type: 'string', description: 'An example code block.', format: 'javascript'} # TODO: not JS } ] snippets: c.object { title: 'Snippets', description: 'List of snippets for the respective programming languages' }, javascript: c.object {title: 'JavaScript'}, c.codeSnippet 'javascript' coffeescript: c.object {title: 'CoffeeScript'}, c.codeSnippet 'coffee' python: c.object {title: 'Python'}, c.codeSnippet 'python' clojure: c.object {title: 'Clojure'}, c.codeSnippet 'clojure' lua: c.object {title: 'Lua'}, c.codeSnippet 'lua' io: c.object {title: 'IO'}, c.codeSnippet 'io' returns: c.object { title: 'Return Value' description: 'Optional documentation of any return value.' required: ['type'] default: {type: 'null'} }, type: c.shortString(title: 'Type', description: 'Type of the return value') example: oneOf: [ c.shortString(title: 'Example', description: 'Example return value') { type: 'object', title: 'Language Examples', description: 'Example return values by code language.', additionalProperties: c.shortString(description: 'Example return value.', format: 'javascript') # TODO: not JS } ] description: oneOf: [ {title: 'Description', type: 'string', description: 'Description of the return value.', maxLength: 1000} { type: 'object', title: 'Language Descriptions', description: 'Example return values by code language.', additionalProperties: {type: 'string', description: 'Description of the return value.', maxLength: 1000} } ] DependencySchema = c.object { title: 'Component Dependency' description: 'A Component upon which this Component depends.' 'default': #original: ? majorVersion: 0 required: ['original', 'majorVersion'] format: 'latest-version-reference' links: [{rel: 'db', href: '/db/level.component/{(original)}/version/{(majorVersion)}'}] }, original: c.objectId(title: 'Original', description: 'A reference to another Component upon which this Component depends.') majorVersion: title: 'Major Version' description: 'Which major version of the Component this Component needs.' type: 'integer' minimum: 0 LevelComponentSchema = c.object { title: 'Component' description: 'A Component which can affect Thang behavior.' required: ['system', 'name', 'description', 'code', 'dependencies', 'propertyDocumentation', 'codeLanguage'] 'default': system: 'ai' name: 'AttacksSelf' description: 'This Component makes the Thang attack itself.' code: attackSelfCode codeLanguage: 'coffeescript' dependencies: [] # TODO: should depend on something by default propertyDocumentation: [] } c.extendNamedProperties LevelComponentSchema # let's have the name be the first property LevelComponentSchema.properties.name.pattern = c.classNamePattern _.extend LevelComponentSchema.properties, system: title: 'System' description: 'The short name of the System this Component belongs to, like \"ai\".' type: 'string' 'enum': systems 'default': 'ai' description: title: 'Description' description: 'A short explanation of what this Component does.' type: 'string' maxLength: 2000 'default': 'This Component makes the Thang attack itself.' codeLanguage: type: 'string' title: 'Language' description: 'Which programming language this Component is written in.' 'enum': ['coffeescript'] code: title: 'Code' description: 'The code for this Component, as a CoffeeScript class. TODO: add link to documentation for how to write these.' 'default': attackSelfCode type: 'string' format: 'coffee' js: title: 'JavaScript' description: 'The transpiled JavaScript code for this Component' type: 'string' format: 'hidden' dependencies: c.array {title: 'Dependencies', description: 'An array of Components upon which this Component depends.', 'default': [], uniqueItems: true}, DependencySchema propertyDocumentation: c.array {title: 'Property Documentation', description: 'An array of documentation entries for each notable property this Component will add to its Thang which other Components might want to also use.', 'default': []}, PropertyDocumentationSchema configSchema: _.extend metaschema, {title: 'Configuration Schema', description: 'A schema for validating the arguments that can be passed to this Component as configuration.', default: {type: 'object', additionalProperties: false}} official: type: 'boolean' title: 'Official' description: 'Whether this is an official CodeCombat Component.' 'default': false c.extendBasicProperties LevelComponentSchema, 'level.component' c.extendSearchableProperties LevelComponentSchema c.extendVersionedProperties LevelComponentSchema, 'level.component' c.extendPermissionsProperties LevelComponentSchema, 'level.component' c.extendPatchableProperties LevelComponentSchema module.exports = LevelComponentSchema