{"id":21970705,"url":"https://github.com/appcelerator/template-kit","last_synced_at":"2025-03-22T22:43:55.340Z","repository":{"id":98787683,"uuid":"246158824","full_name":"appcelerator/template-kit","owner":"appcelerator","description":"Project template toolkit","archived":false,"fork":false,"pushed_at":"2021-01-05T22:56:03.000Z","size":899,"stargazers_count":0,"open_issues_count":1,"forks_count":1,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-03-18T14:49:34.243Z","etag":null,"topics":["generator","nodejs","template"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appcelerator.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-03-09T22:54:45.000Z","updated_at":"2020-12-02T05:28:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"cc8838d5-5e11-48f5-b5da-6feb3abc23f0","html_url":"https://github.com/appcelerator/template-kit","commit_stats":{"total_commits":23,"total_committers":1,"mean_commits":23.0,"dds":0.0,"last_synced_commit":"2472cb70f0d48cd7e2a9f7fbb7d7f5393f6747a7"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcelerator%2Ftemplate-kit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcelerator%2Ftemplate-kit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcelerator%2Ftemplate-kit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcelerator%2Ftemplate-kit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appcelerator","download_url":"https://codeload.github.com/appcelerator/template-kit/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245031362,"owners_count":20549913,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["generator","nodejs","template"],"created_at":"2024-11-29T14:41:56.680Z","updated_at":"2025-03-22T22:43:55.306Z","avatar_url":"https://github.com/appcelerator.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# template-kit\n\n[![NPM Version][npm-image]][npm-url]\n[![NPM Downloads][downloads-image]][downloads-url]\n[![Deps][david-image]][david-url]\n[![Dev Deps][david-dev-image]][david-dev-url]\n\nLibrary for creating projects from templates.\n\n## Features\n\n * Project generation using local template as a directory, archive file, or globally installed npm package\n * Download templates from git, npm, or a URL to a archive file\n * Support for `.zip`, `.gz`, `.bz2`, `.tar`, `tar.gz`, `tar.bz2`, `.tgz`, and `.tbz2` archives\n * Run text files through [`ejs`][ejs] during file copy\n * JavaScript lifecycle hooks\n * User-defined copy file inclusion/exclusion filters\n * Data-driven destination directory and filenames\n * npm dependency installation\n * git repository initialization\n\n## Installation\n\n    npm install template-kit --save\n\n## Example\n\n```javascript\nimport TemplateEngine from 'template-kit';\n\n(async () =\u003e {\n    const engine = new TemplateEngine();\n\n    engine.on('create', async (state, next) =\u003e {\n        console.log('Creating the project from the template');\n        await next();\n        console.log('Project created!');\n    });\n\n    await engine.run({\n        src: 'git@github.com:appcelerator/template-kit-test.git',\n        dest: '/path/to/new/project'\n    });\n\n    console.log('Project created successfully!');\n})();\n```\n\n## Template Specification\n\n### Structure\n\nA template can be an empty directory or a massive collection of files and subdirectories. All of\nthe files in the template can be compressed in a single archive file (.zip, .tgz, etc) for\ndistribution.\n\nTemplates do _not_ need to be npm packages and they do _not_ need to have a `package.json`. If they\ndo, template-kit will happily call `npm install` after generation.\n\nAny file that is _not_ binary will be treated as an [ejs][ejs] template regardless of extension.\nejs templates have access to any variable or function in the `data` object including the `opts.data`\npassed into the `TemplateEngine` constructor, the `data` export from the `meta.js`, or any\ndata that has be injected via a hook.\n\nDirectories and filenames may contain a `{{variable}}` sequence which will be replaced with the\ncorresponding value in the `data` object.\n\nBy default, template-kit will treat the root of the template directory as the actual template.\nHowever, the template may contain several project templates or place all of the template files in\na single subdirectory. The relative project template path is defined by setting the `template`\nproperty in the `meta.js` file. If there are multiple project templates, then you can present them\nby using the prompts mechanism.\n\n### Metadata\n\ntemplate-kit will load the template's metadata from a `meta.js` file or the package's \"main\" file.\nThe metadata can be an object or an async function that returns an object. The object contains the\nfollowing properties:\n\n| Property | Type             | Description |\n| -------- | ---------------- | ----------- |\n| complete | `Function`       | A function to call after the project generation is complete. Useful for displaying post create steps. |\n| data     | `Object`         | Arbitrary data to mix in with the `run()` data and pass into `ejs` when copying a text file. |\n| filters  | `Array.\u003cString\u003e` | An array of file patterns to copy. The patterns follow the gitignore rules. |\n| prompts  | `Object`         | An array of prompt descriptors that is used to select the template and template data. |\n| template | `String`         | Relative path to the template files. Defaults to `'.'` |\n\n## API\n\n### `TemplateEngine`\n\nResolves a template source, installs the template, and manages the install lifecycle.\n\n * [`new TemplateEngine(opts)`](#TemplateEngine+constructor)\n   * _methods_\n     * [`.run(opts)`](#TemplateEngine+run)\n   * _inherited from [`HookEmitter`](https://www.npmjs.com/package/hook-emitter)_ ➚\n     * [`.on(event, listener)`](https://www.npmjs.com/package/hook-emitter#onevent-listener) ➚\n     * [`.once(event, listener)`](https://www.npmjs.com/package/hook-emitter#onceevent-listener) ➚\n     * [`.off(event, listener)`](https://www.npmjs.com/package/hook-emitter#offevent-listener) ➚\n   * _events_\n     * [`#init`](#TemplateEngine+event+init)\n     * [`#git-clone`](#TemplateEngine+event+git-clone)\n     * [`#download`](#TemplateEngine+event+download)\n     * [`#extract`](#TemplateEngine+event+extract)\n     * [`#extract-file`](#TemplateEngine+event+extract-file)\n     * [`#extract-progress`](#TemplateEngine+event+extract-progress)\n     * [`#npm-download`](#TemplateEngine+event+npm-download)\n     * [`#create`](#TemplateEngine+event+create)\n     * [`#load-meta`](#TemplateEngine+event+load-meta)\n     * [`#prompt`](#TemplateEngine+event+prompt)\n     * [`#copy`](#TemplateEngine+event+copy)\n     * [`#copy-file`](#TemplateEngine+event+copy-file)\n     * [`#npm-install`](#TemplateEngine+event+npm-install)\n     * [`#git-init`](#TemplateEngine+event+git-init)\n     * [`#cleanup`](#TemplateEngine+event+cleanup)\n\n### Constructor\n\n\u003ca name=\"TemplateEngine+constructor\"\u003e\u003c/a\u003e\n\n#### `new TemplateEngine(opts)`\n\nInitializes the template engine.\n\n| Param                           | Type      | Description                                                  |\n| ------------------------------- | --------- | ------------------------------------------------------------ |\n| [opts]                          | `Object`  | Various options.                                             |\n| [opts.requestOptions]           | `Object`  | `got` HTTP client options and proxy/security settings below. |\n| [opts.requestOptions.caFile]    | `String`  | A path to a PEM-formatted certificate authority bundle.      |\n| [opts.requestOptions.certFile]  | `String`  | A path to a client cert file used for authentication.        |\n| [opts.requestOptions.keyFile]   | `String`  | A path to a private key file used for authentication.        |\n| [opts.requestOptions.proxy]     | `String`  | A proxy server URL. Can be `http` or `https`.                |\n| [opts.requestOptions.strictSSL] | `Boolean` | When falsey, disables TLS/SSL certificate validation for both `https` requests and `https` proxy servers. |\n\n### Methods\n\n\u003ca name=\"TemplateEngine+run\"\u003e\u003c/a\u003e\n\n#### `.run(opts)` ⇒ `Promise`\n\nBuilds a project based on the specified template and options.\n\n| Param               | Type                      | Description     |\n| ------------------- | ------------------------- | --------------- |\n| opts                | `Object`                  | Various options |\n| [opts.data]         | `Object`                  | A data object that is passed into `ejs` when copying template files. |\n| opts.dest           | `String`                  | The destination directory to create the project in. |\n| [opts.filters]      | `Set` \\| `Array.\u003cString\u003e` | A list of file patterns to pass into `micromatch` when copying files. |\n| [opts.force]        | `Boolean`                 | When `true`, overrides the destination if it already exists. |\n| [opts.git=true]     | `Boolean`                 | When `true` and `git` executable is found, after the the project is generated, initialize a git repo in the project directory. |\n| [opts.npmArgs]      | `Array.\u003cString\u003e`          | An array of additional parameters to pass into npm. Useful if you need to add extra arguments for things such as skipping shrinkwrap or production only. |\n| opts.src            | `String`                  | The path to a directory, archive file, globally installed npm package, archive URL, npm package name, or git repo. |\n| [opts.template='.'] | `String`                  | Relative path to the directory containing the template files. This value overrides the default template from the `meta.js`, but not the `template` value returned from prompting. |\n\n##### Run State\n\nEvery time `run()` is invoked, a new `state` object is created and passed through the various\nstages. The contents of the `state` depends on the Source Type.\n\n| Property    | Type                      | Description                                                  |\n| ----------- | ------------------------- | ------------------------------------------------------------ |\n| dest        | `String`                  | The destination directory to create the project in.          |\n| destFile    | `String`                  | When copying files, this is the destination file path.       |\n| disposables | `Array.\u003cString\u003e`          | A list of temp directories to cleanup.                       |\n| extractDest | `String`                  | The temporary directory where the archive was extracted to.  |\n| filters     | `Set` \\| `Array.\u003cString\u003e` | A list of file patterns to copy.                             |\n| force       | `Boolean`                 | When `true`, overrides the destination if it already exists. |\n| git         | `Boolean`                 | When `true` and `git` executable is found, after the the project is generated, initialize a git repo in the project directory. |\n| gitInfo     | `Object`                  | The parsed git repo information.                             |\n| npmArgs     | `Array.\u003cString\u003e`          | An array of additional parameters to pass into npm. Useful if you need to add extra arguments for things such as skipping shrinkwrap. |\n| npmManifest | `Object`                  | The npm package information                                  |\n| prompts     | `Array.\u003cObject\u003e`          | A list of prompt descriptors.                                |\n| src         | `String`                  | The path to a directory, archive file, globally installed npm package, archive URL, npm package name, or git repo. |\n| srcFile     | `String`                  | When copying files, this is the source file path.            |\n| template    | `String`                  | Relative path to the directory containing the template files. Defaults to `'.'` |\n\n### Events\n\nThe `TemplateEngine` emits several events. It uses the [hook-emitter][hook-emitter] package which\nsupports async event listeners.\n\nSome events are only emitted depending on the source type (e.g. the `src` passed into `run()`).\n\n```\nEvent Flow                   ┌───────┐\n                             │ run() │\n                             └───┬───┘ ┌───────┐\n                                 ├─────┤ #init │\n                                 │     └───────┘\n      ┌──────────────┬───────────┼────────┬──────────┬──────────┐\n     git            URL        Local    Local      Global      npm\n      │        ┌─────┴─────┐   File   Directory  npm Package    │\n      │        │ #download │     │        │          │          │\n      │        └─────┬─────┘     │        │          │          │\n┌─────┴──────┐       └─────┬─────┘        │          │  ┌───────┴───────┐\n│ #git-clone │   ┌─────────┴─────────┐    │          │  │ #npm-download │\n└─────┬──────┘   │ #extract          │    │          │  └───────┬───────┘\n      │          │ #extract-file     │    │          │          │\n      │          │ #extract-progress │    │          │          │\n      │          └─────────┬─────────┘    │          │          │\n      └────────────────────┴───────┬──────┴──────────┴──────────┘\n                             ┌─────┴──────┐\n                             │ #load-meta │\n                             └─────┬──────┘ ┌─────────┐\n                                   ├────────┤ #prompt │\n                              ┌────┴────┐   └─────────┘\n                              │ #create │\n                              └────┬────┘   ┌───────┐\n                                   ├────────┤ #copy │\n                                   │        └───┬───┘    ┌────────────┐\n                                   │            └────────┤ #copy-file │\n                                   │    ┌──────────────┐ └────────────┘\n                                   ├────┤ #npm-install │\n                                   │    └──────────────┘\n                                   │    ┌───────────┐\n                                   ├────┤ #git-init │\n                                   │    └───────────┘\n                              ┌────┴─────┐\n                              │ #cleanup │\n                              └──────────┘\n```\n\n\u003ca name=\"TemplateEngine+event+init\"\u003e\u003c/a\u003e\n\n#### `#init`\n\nInitialize the run state with the options passed into `run()`.\n\n**Source Type:** Local file, local directory, global npm package, npm, git, URL\n\n| Param              | Type       | Description                      |\n| ------------------ | ---------- | -------------------------------- |\n| opts               | `Object`   | The options passed into `run()`. |\n| [async next(opts)] | `Function` | Continue to next hook.           |\n\n```javascript\nengine.on('init', async opts =\u003e {\n    // before the run state has been initialized\n});\n```\n\nor\n\n```javascript\nengine.on('init', async (opts, next) =\u003e {\n    // before the run state has been initialized\n    await next();\n    // after initialization\n});\n```\n\n\u003ca name=\"TemplateEngine+event+git-clone\"\u003e\u003c/a\u003e\n\n#### `#git-clone`\n\nEmitted when `git clone` is called.\n\n**Source Type:** git\n\n| Param              | Type             | Description                                  |\n| ------------------ | ---------------- | -------------------------------------------- |\n| state              | `Object`         | The run state.                               |\n| args               | `Array.\u003cString\u003e` | The arguments passed into the `git` command. |\n| opts               | `Object`         | `spawn()` options.                           |\n| [async next(opts)] | `Function`       | Continue to next hook.                       |\n\n```javascript\nengine.on('git-clone', async (state, args, opts, next) =\u003e {\n    // before the git clone call\n    await next();\n    // after the clone\n});\n```\n\n\u003ca name=\"TemplateEngine+event+download\"\u003e\u003c/a\u003e\n\n#### `#download`\n\nEmitted when downloading a file based on a http/https URL.\n\n**Source Type:** URL\n\n| Param              | Type       | Description            |\n| ------------------ | ---------- | ---------------------- |\n| state              | `Object`   | The run state.         |\n| [async next(opts)] | `Function` | Continue to next hook. |\n\n```javascript\nengine.on('download', async (state, next) =\u003e {\n    // before the download begins\n    await next();\n    // after the clone\n});\n```\n\n\u003ca name=\"TemplateEngine+event+extract\"\u003e\u003c/a\u003e\n\n#### `#extract`\n\nEmitted when extracting the downloaded or local archive file.\n\n**Source Type:** Local directory, URL\n\n| Param              | Type       | Description            |\n| ------------------ | ---------- | ---------------------- |\n| state              | `Object`   | The run state.         |\n| [async next(opts)] | `Function` | Continue to next hook. |\n\n```javascript\nengine.on('extract', async (state, next) =\u003e {\n    // before the archive is extracted\n    await next();\n    // after extraction\n});\n```\n\n\u003ca name=\"TemplateEngine+event+extract-file\"\u003e\u003c/a\u003e\n\n#### `#extract-file`\n\nEmits the current file being extracted from the archive.\n\n**Source Type:** Local directory, URL\n\n| Param              | Type       | Description                           |\n| ------------------ | ---------- | ------------------------------------- |\n| state              | `Object`   | The run state.                        |\n| file               | `String`   | The name of the file being extracted. |\n\n```javascript\nengine.on('extract-file', async (state, file) =\u003e {\n    console.log(`Extracting ${file}`);\n});\n```\n\n\u003ca name=\"TemplateEngine+event+extract-progress\"\u003e\u003c/a\u003e\n\n#### `#extract-progress`\n\nEmits the current progress of the file extraction from `0` to `100`.\n\n**Source Type:** Local directory, URL\n\n| Param              | Type       | Description              |\n| ------------------ | ---------- | ------------------------ |\n| state              | `Object`   | The run state.           |\n| percent            | `Number`   | The percentage complete. |\n\n```javascript\nengine.on('extract-progress', async (state, percent) =\u003e {\n    console.log(`Extracted ${percent}%`);\n});\n```\n\n\u003ca name=\"TemplateEngine+event+npm-download\"\u003e\u003c/a\u003e\n\n#### `#npm-download`\n\nEmitted when downloading and extracting an npm package.\n\n**Source Type:** npm\n\n| Param              | Type       | Description            |\n| ------------------ | ---------- | ---------------------- |\n| state              | `Object`   | The run state.         |\n| [async next(opts)] | `Function` | Continue to next hook. |\n\n```javascript\nengine.on('npm-download', async (state, next) =\u003e {\n    // before downloading and extracting the npm package\n    await next();\n    // after extraction\n});\n```\n\n\u003ca name=\"TemplateEngine+event+create\"\u003e\u003c/a\u003e\n\n#### `#create`\n\nEmitted when about to populate the destination directory.\n\n**Source Type:** All sources.\n\n| Param              | Type       | Description            |\n| ------------------ | ---------- | ---------------------- |\n| state              | `Object`   | The run state.         |\n| [async next(opts)] | `Function` | Continue to next hook. |\n\n```javascript\nengine.on('create', async (state, next) =\u003e {\n    // before the project is generated\n    await next();\n    // after project is generated\n});\n```\n\n\u003ca name=\"TemplateEngine+event+load-meta\"\u003e\u003c/a\u003e\n\n#### `#load-meta`\n\nEmitted when attempting to load the template's `meta.js` or \"main\" file.\n\n**Source Type:** Any source with a meta script.\n\n| Param              | Type             | Description              |\n| ------------------ | ---------------- | ------------------------ |\n| state              | `Object`         | The run state.           |\n| [async next(opts)] | `Function`       | Continue to next hook.   |\n\n```javascript\nengine.on('load-meta', async (state, next) =\u003e {\n    // before npm dependencies have been installed\n    await next();\n    // after installation\n});\n```\n\n\u003ca name=\"TemplateEngine+event+prompt\"\u003e\u003c/a\u003e\n\n#### `#prompt`\n\nAllows application opportunity to prompt for missing data, then populate state's `data` property.\n\n**Source Type:** Any source with a meta script.\n\n| Param              | Type       | Description                            |\n| ------------------ | ---------- | -------------------------------------- |\n| state              | `Object`   | The run state.                         |\n\n```javascript\nengine.on('prompt', async state =\u003e {\n    // prompt for `state.prompts` and store results in `state.data`\n});\n```\n\n\u003ca name=\"TemplateEngine+event+copy\"\u003e\u003c/a\u003e\n\n#### `#copy`\n\nEmitted when copying the template files to the destination.\n\n**Source Type:** All sources.\n\n| Param              | Type       | Description                          |\n| ------------------ | ---------- | ------------------------------------ |\n| state              | `Object`   | The run state.                       |\n| [async next(opts)] | `Function` | Continue to next hook.               |\n\n```javascript\nengine.on('copy', async (state, next) =\u003e {\n    // before copying has begun\n    await next();\n    // after files have been copied\n});\n```\n\n\u003ca name=\"TemplateEngine+event+copy-file\"\u003e\u003c/a\u003e\n\n#### `#copy-file`\n\nEmitted for each file copied.\n\n**Source Type:** All sources.\n\n| Param              | Type       | Description                         |\n| ------------------ | ---------- | ----------------------------------- |\n| state              | `Object`   | The run state.                      |\n| [async next(opts)] | `Function` | Continue to next hook.               |\n\n```javascript\nengine.on('copy-file', async (state, next) =\u003e {\n    // before a specific file is to be copied\n    await next();\n    // file has been copied\n});\n```\n\n\u003ca name=\"TemplateEngine+event+npm-install\"\u003e\u003c/a\u003e\n\n#### `#npm-install`\n\nEmitted when installing npm dependencies in the destination directory.\n\n**Source Type:** Any source with a `package.json`.\n\n| Param              | Type             | Description              |\n| ------------------ | ---------------- | ------------------------ |\n| state              | `Object`         | The run state.           |\n| cmd                | `String`         | The path to npm command. |\n| args               | `Array.\u003cString\u003e` | The npm arguments.       |\n| opts               | `Object`         | `spawn()` options.       |\n| [async next(opts)] | `Function`       | Continue to next hook.   |\n\n```javascript\nengine.on('npm-install', async (state, cmd, args, opts, next) =\u003e {\n    // before npm dependencies have been installed\n    await next();\n    // after installation\n});\n```\n\n\u003ca name=\"TemplateEngine+event+git-init\"\u003e\u003c/a\u003e\n\n#### `#git-init`\n\nEmitted when a git repository is being initialized in the project directory.\n\n**Source Type:** Any source.\n\n| Param              | Type             | Description            |\n| ------------------ | ---------------- | ---------------------- |\n| state              | `Object`         | The run state.         |\n| args               | `Array.\u003cString\u003e` | `git` arguments.       |\n| opts               | `Object`         | `spawn()` options.     |\n| [async next(opts)] | `Function`       | Continue to next hook. |\n\n```javascript\nengine.on('git-init`', async (state, args, opts, next) =\u003e {\n    // before the git repo has been initialized\n    await next();\n    // after initialization\n});\n```\n\n\u003ca name=\"TemplateEngine+event+cleanup\"\u003e\u003c/a\u003e\n\n#### `#cleanup`\n\nEmitted after the project has been created and the temp directories are to be deleted.\n\n**Source Type:** Any source.\n\n| Param              | Type       | Description            |\n| ------------------ | ---------- | ---------------------- |\n| state              | `Object`   | The run state.         |\n| [async next(opts)] | `Function` | Continue to next hook. |\n\n```javascript\nengine.on('cleanup`', async (state, next) =\u003e {\n    // before temp directories have been deleted\n    await next();\n    // after cleanup\n});\n```\n\n## Legal\n\nThis project is open source under the [Apache Public License v2][1] and is developed by\n[Axway, Inc](http://www.axway.com/) and the community. Please read the [`LICENSE`][1] file included\nin this distribution for more information.\n\n[1]: https://github.com/appcelerator/template-kit/blob/master/LICENSE\n[npm-image]: https://img.shields.io/npm/v/template-kit.svg\n[npm-url]: https://npmjs.org/package/template-kit\n[downloads-image]: https://img.shields.io/npm/dm/template-kit.svg\n[downloads-url]: https://npmjs.org/package/template-kit\n[david-image]: https://img.shields.io/david/appcelerator/template-kit.svg\n[david-url]: https://david-dm.org/appcelerator/template-kit\n[david-dev-image]: https://img.shields.io/david/dev/appcelerator/template-kit.svg\n[david-dev-url]: https://david-dm.org/appcelerator/template-kit#info=devDependencies\n[ejs]: https://www.npmjs.com/package/ejs\n[hook-emitter]: https://www.npmjs.com/package/hook-emitter\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappcelerator%2Ftemplate-kit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappcelerator%2Ftemplate-kit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappcelerator%2Ftemplate-kit/lists"}