ember-tribe 2.6.10 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -64,9 +64,9 @@ ember install ember-tribe
64
64
 
65
65
  The addon automatically configures following essential packages:
66
66
 
67
- **Ember Addons:** `ember-cli-dotenv`, `ember-cli-sass`, `ember-modifier`, `ember-composable-helpers`, `ember-truth-helpers`, `ember-file-upload` , `ember-power-select`
67
+ **Ember Addons:** `ember-modifier`, `ember-composable-helpers`, `ember-truth-helpers`, `ember-file-upload` , `ember-power-select`
68
68
 
69
- **NPM Packages:** `bootstrap`, `@popperjs/core`, `animate.css`, `video.js`, `swiper`, `howler`, `sortablejs`, `papaparse`
69
+ **NPM Packages:** `bootstrap`, `@popperjs/core`, `animate.css`, `video.js`, `swiper`, `howler`, `sortablejs`, `papaparse`
70
70
 
71
71
  **Built-in features that can be used in routes and components**:
72
72
 
@@ -146,7 +146,7 @@ Always begin by understanding your data types, then define the routes that load
146
146
  **Types**
147
147
 
148
148
  8. **Start by Understanding Your Data**
149
- Before writing any code, read the project description and `types.json` to understand the data model. Every architectural decision that follows — which routes to create, which services to build, whether components are even needed — depends on a clear understanding of the underlying types.
149
+ Before writing any code, read the project description and `types.json` to understand the data model. Every architectural decision that follows — which routes to create, which services to build, whether components are even needed — depends on a clear understanding of the underlying types.
150
150
 
151
151
  ---
152
152
 
@@ -156,7 +156,7 @@ Always begin by understanding your data types, then define the routes that load
156
156
  Match route names to user mental models. Use consistent, predictable naming conventions so that routes are self-documenting.
157
157
 
158
158
  10. **Routes Are for Fetching, Not Logic**
159
- Routes should primarily perform read/fetch operations and pass data down to components or services. Keep JavaScript in routes to a minimum — business logic belongs in components and services, not routes.
159
+ Routes should primarily perform read/fetch operations and pass data down to components or services. Keep JavaScript in routes to a minimum — business logic belongs in components and services, not routes.
160
160
 
161
161
  11. **Route Parameters**
162
162
  Keep `get_vars` minimal and meaningful. Load only the data types that each specific route actually needs — avoid over-fetching.
@@ -270,7 +270,6 @@ The storylang.json file contains seven main sections:
270
270
  }
271
271
  ```
272
272
 
273
-
274
273
  #### Section Definitions
275
274
 
276
275
  #### 1. Types
@@ -284,7 +283,8 @@ The storylang.json file contains seven main sections:
284
283
  "types": [
285
284
  {
286
285
  "slug": "type-slug", //type slug as defined in `types.json` blueprint
287
- "used_in": { //where this type is used
286
+ "used_in": {
287
+ //where this type is used
288
288
  "routes": ["route-name"],
289
289
  "components": ["component-name"],
290
290
  "services": ["service-name"],
@@ -314,7 +314,10 @@ The storylang.json file contains seven main sections:
314
314
  "tracked_vars": [{ "<variableName>": "<dataType>" }],
315
315
  "get_vars": [{ "<paramName>": "<dataType>" }],
316
316
  "getters": ["derived-property-name"],
317
- "actions": ["frontend-action", { "backend-action": ["custom/path/file.php"] }],
317
+ "actions": [
318
+ "frontend-action",
319
+ { "backend-action": ["custom/path/file.php"] }
320
+ ],
318
321
  "functions": ["helper-method", "compute-something"],
319
322
  "helpers": ["helper1"],
320
323
  "services": ["service1"],
@@ -426,7 +429,10 @@ The storylang.json file contains seven main sections:
426
429
  "name": "service-name",
427
430
  "tracked_vars": [{ "<variableName>": "<dataType>" }],
428
431
  "getters": ["derived-property-name"],
429
- "actions": ["frontend-action", { "backend-action": ["custom/path/file.php"] }],
432
+ "actions": [
433
+ "frontend-action",
434
+ { "backend-action": ["custom/path/file.php"] }
435
+ ],
430
436
  "functions": ["internal-method"],
431
437
  "helpers": ["helper1"],
432
438
  "services": ["dependency1", "dependency2"]
@@ -449,7 +455,11 @@ The storylang.json file contains seven main sections:
449
455
  "functions": ["build-visualization"],
450
456
  "actions": [
451
457
  "reset-state",
452
- { "assemble-data-for-visualization": ["custom/visualizations/assemble-data.php"] },
458
+ {
459
+ "assemble-data-for-visualization": [
460
+ "custom/visualizations/assemble-data.php"
461
+ ]
462
+ },
453
463
  "updateVisualization"
454
464
  ],
455
465
  "helpers": ["validateConfig", "generatePreview"],
@@ -476,7 +486,10 @@ The storylang.json file contains seven main sections:
476
486
  "tracked_vars": [{ "<variableName>": "<dataType>" }],
477
487
  "inherited_args": [{ "<argumentName>": "<argType>" }],
478
488
  "getters": ["derived-property-name"],
479
- "actions": ["frontend-action", { "backend-action": ["custom/path/file.php"] }],
489
+ "actions": [
490
+ "frontend-action",
491
+ { "backend-action": ["custom/path/file.php"] }
492
+ ],
480
493
  "functions": ["internal-method"],
481
494
  "helpers": ["helper1", "helper2"],
482
495
  "modifiers": ["modifier1"],
@@ -486,7 +499,6 @@ The storylang.json file contains seven main sections:
486
499
  }
487
500
  ```
488
501
 
489
-
490
502
  **Example**:
491
503
 
492
504
  ```json
@@ -502,7 +514,12 @@ The storylang.json file contains seven main sections:
502
514
  { "onDelete": "action" }
503
515
  ],
504
516
  "getters": ["trust-score-color", "display-label"],
505
- "actions": ["toggle-selection", "expand-details", { "save-file": ["custom/files/save.php"] }, { "delete-file": ["custom/files/delete.php"] }],
517
+ "actions": [
518
+ "toggle-selection",
519
+ "expand-details",
520
+ { "save-file": ["custom/files/save.php"] },
521
+ { "delete-file": ["custom/files/delete.php"] }
522
+ ],
506
523
  "helpers": ["formatDate", "truncateText"],
507
524
  "modifiers": ["tooltip"],
508
525
  "services": ["store", "router"]
@@ -681,7 +698,7 @@ When querying records, `modules` and `filter` serve distinct purposes that map d
681
698
 
682
699
  **`modules`** applies **AND** logic: every key-value pair in the object must match for a record to be included. Use this when you want to narrow results to records that simultaneously satisfy all of the given conditions — for example, posts that are both `published` and belong to a specific `author_id`.
683
700
 
684
- **`filter`** applies **OR** logic: a record is included if it matches *any* of the key-value pairs. Use this when you want to broaden results across multiple values of a field — for example, items whose `category` is either `tech` or `design`.
701
+ **`filter`** applies **OR** logic: a record is included if it matches _any_ of the key-value pairs. Use this when you want to broaden results across multiple values of a field — for example, items whose `category` is either `tech` or `design`.
685
702
 
686
703
  The two can be combined in the same query. For instance, to find all published posts that are tagged as either `news` or `feature`:
687
704
 
@@ -990,11 +1007,17 @@ import Service from '@ember/service';
990
1007
  export default class ShoppingCartService extends Service {
991
1008
  items = new TrackedArray([]);
992
1009
 
993
- add(item) { this.items.push(item) }
1010
+ add(item) {
1011
+ this.items.push(item);
1012
+ }
994
1013
 
995
- remove(item) { this.items.splice(this.items.indexOf(item), 1) }
1014
+ remove(item) {
1015
+ this.items.splice(this.items.indexOf(item), 1);
1016
+ }
996
1017
 
997
- empty() { this.items.splice(0, this.items.length) }
1018
+ empty() {
1019
+ this.items.splice(0, this.items.length);
1020
+ }
998
1021
  }
999
1022
  ```
1000
1023
 
@@ -1109,16 +1132,16 @@ async uploadFile(file) {
1109
1132
  Use Ember's built-in `<Input>` component instead of a raw `<input>` tag — it automatically updates bound state via `@value`.
1110
1133
 
1111
1134
  ```handlebars
1112
- <div class="mb-3">
1113
- <label for="input-name" class="form-label">Name:</label>
1135
+ <div class='mb-3'>
1136
+ <label for='input-name' class='form-label'>Name:</label>
1114
1137
  <Input
1115
- id="input-name"
1116
- class="form-control"
1117
- @type="text"
1138
+ id='input-name'
1139
+ class='form-control'
1140
+ @type='text'
1118
1141
  @value={{this.name}}
1119
1142
  disabled={{this.isReadOnly}}
1120
- maxlength="50"
1121
- placeholder="Enter your name"
1143
+ maxlength='50'
1144
+ placeholder='Enter your name'
1122
1145
  />
1123
1146
  </div>
1124
1147
  ```
@@ -1134,31 +1157,32 @@ export default class ExampleComponent extends Component {
1134
1157
  ```
1135
1158
 
1136
1159
  ```handlebars
1137
- <div class="form-check mb-3">
1160
+ <div class='form-check mb-3'>
1138
1161
  <Input
1139
- id="admin-checkbox"
1140
- class="form-check-input"
1141
- @type="checkbox"
1162
+ id='admin-checkbox'
1163
+ class='form-check-input'
1164
+ @type='checkbox'
1142
1165
  @checked={{this.isAdmin}}
1143
- {{on "input" this.validateRole}}
1166
+ {{on 'input' this.validateRole}}
1144
1167
  />
1145
- <label for="admin-checkbox" class="form-check-label">Is Admin?</label>
1168
+ <label for='admin-checkbox' class='form-check-label'>Is Admin?</label>
1146
1169
  </div>
1147
1170
  ```
1148
1171
 
1149
1172
  ```handlebars
1150
- <div class="mb-3">
1151
- <label for="user-comment" class="form-label">Comment:</label>
1173
+ <div class='mb-3'>
1174
+ <label for='user-comment' class='form-label'>Comment:</label>
1152
1175
  <Textarea
1153
- id="user-comment"
1154
- class="form-control"
1176
+ id='user-comment'
1177
+ class='form-control'
1155
1178
  @value={{this.userComment}}
1156
- rows="6"
1179
+ rows='6'
1157
1180
  />
1158
1181
  </div>
1159
1182
  ```
1160
1183
 
1161
1184
  **Key rules for `<Input>` and `<Textarea>`:**
1185
+
1162
1186
  - `@value`, `@type`, and `@checked` must be passed as **arguments** (with `@`).
1163
1187
  - Use the `{{on}}` modifier for event handling (e.g. `{{on "input" this.handler}}`).
1164
1188
  - Bootstrap styles `form-control` correctly when `disabled` is present
@@ -1170,14 +1194,14 @@ export default class ExampleComponent extends Component {
1170
1194
  **Single select (Bootstrap-compatible wrapper):**
1171
1195
 
1172
1196
  ```handlebars
1173
- <div class="mb-3">
1174
- <label class="form-label">Assign Category:</label>
1175
- <div class="form-control p-0 border-0">
1197
+ <div class='mb-3'>
1198
+ <label class='form-label'>Assign Category:</label>
1199
+ <div class='form-control p-0 border-0'>
1176
1200
  <PowerSelect
1177
1201
  @options={{this.categories}}
1178
1202
  @selected={{this.selectedCategory}}
1179
1203
  @onChange={{this.handleCategoryChange}}
1180
- @placeholder="Select a category"
1204
+ @placeholder='Select a category'
1181
1205
  as |category|
1182
1206
  >
1183
1207
  {{category.name}}
@@ -1210,14 +1234,14 @@ export default class ExampleComponent extends Component {
1210
1234
  **Multi-select variant:**
1211
1235
 
1212
1236
  ```handlebars
1213
- <div class="mb-3">
1214
- <label class="form-label">Assign Tags:</label>
1215
- <div class="form-control p-0 border-0">
1237
+ <div class='mb-3'>
1238
+ <label class='form-label'>Assign Tags:</label>
1239
+ <div class='form-control p-0 border-0'>
1216
1240
  <PowerSelectMultiple
1217
1241
  @options={{this.availableTags}}
1218
1242
  @selected={{this.selectedTags}}
1219
1243
  @onChange={{this.handleTagsChange}}
1220
- @placeholder="Select tags"
1244
+ @placeholder='Select tags'
1221
1245
  as |tag|
1222
1246
  >
1223
1247
  {{tag.label}}
@@ -1229,15 +1253,15 @@ export default class ExampleComponent extends Component {
1229
1253
  **Async options loaded from the store:**
1230
1254
 
1231
1255
  ```handlebars
1232
- <div class="mb-3">
1233
- <label class="form-label">Select Project:</label>
1234
- <div class="form-control p-0 border-0">
1256
+ <div class='mb-3'>
1257
+ <label class='form-label'>Select Project:</label>
1258
+ <div class='form-control p-0 border-0'>
1235
1259
  <PowerSelect
1236
1260
  @options={{this.projects}}
1237
1261
  @selected={{this.selectedProject}}
1238
1262
  @onChange={{this.handleProjectChange}}
1239
- @searchField="name"
1240
- @placeholder="Search projects..."
1263
+ @searchField='name'
1264
+ @placeholder='Search projects...'
1241
1265
  as |project|
1242
1266
  >
1243
1267
  {{project.modules.name}}
@@ -1247,6 +1271,7 @@ export default class ExampleComponent extends Component {
1247
1271
  ```
1248
1272
 
1249
1273
  **Key rules for `<PowerSelect>`:**
1274
+
1250
1275
  - `@options`, `@selected`, and `@onChange` are always required arguments.
1251
1276
  - Use `@searchField` to specify which object property drives the built-in search filter.
1252
1277
  - For multi-select, use `<PowerSelectMultiple>` — the `@onChange` callback receives the full updated array, so assign it directly to your tracked property.
@@ -1270,4 +1295,4 @@ You can then upload the `dist/` folder to [Junction (open source)](http://localh
1270
1295
 
1271
1296
  # License
1272
1297
 
1273
- This project is licensed under the [GNU GPL v3 License](LICENSE.md).
1298
+ This project is licensed under the [GNU GPL v3 License](LICENSE.md).
@@ -1,30 +1,28 @@
1
- <!doctype html>
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <meta charset="utf-8" />
4
+ <meta charset="utf-8">
5
5
  <title><%= classifiedPackageName %></title>
6
6
  <meta name="description" content="" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1" />
8
8
 
9
9
  {{content-for "head"}}
10
10
 
11
- <link rel="manifest" href="{{rootURL}}manifest.webmanifest" />
12
- <meta name="msapplication-config" content="{{rootURL}}browserconfig.xml" />
11
+ <link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
12
+ <link integrity="" rel="stylesheet" href="{{rootURL}}assets/new.css">
13
13
 
14
- <link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css" />
15
14
  <link
16
- integrity=""
17
15
  rel="stylesheet"
18
- href="{{rootURL}}assets/<%= dasherizedPackageName %>.css"
19
- />
20
- <link
21
- rel="stylesheet"
22
- href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
16
+ href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css"
17
+ integrity="sha512-Evv84Mr4kqVGRNSgIGL/F/aIDqQb7xQ2vcrdIwxfjThSH8CSR7PBEakCr51Ck+w+/U6swU2Im1vVX0SVk9ABhg=="
18
+ crossorigin="anonymous"
19
+ referrerpolicy="no-referrer"
23
20
  />
24
21
 
25
22
  {{content-for "head-footer"}}
26
23
  </head>
27
24
  <body>
25
+ <!-- Full-screen loading overlay shown while Ember boots -->
28
26
  <div
29
27
  class="d-flex align-items-center justify-content-center vh-100 w-100 position-fixed animate__animated animate__fadeIn animate__faster"
30
28
  id="loading"
@@ -40,12 +38,16 @@
40
38
  class="position-absolute vh-100 w-100 bg-light opacity-75"
41
39
  ></div>
42
40
  </div>
43
-
41
+
44
42
  {{content-for "body"}}
45
43
 
46
- <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/js/all.min.js"></script>
47
44
  <script src="{{rootURL}}assets/vendor.js"></script>
48
- <script src="{{rootURL}}assets/<%= dasherizedPackageName %>.js"></script>
45
+ <script src="{{rootURL}}assets/new.js"></script>
46
+
47
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/js/all.min.js"
48
+ integrity="sha512-1mCLtfa/wR7Bxm5mXQrN9K5OPF8oE6DSGE+L9XS4MCQl1bWEBIfmFmQjH0BjkgBbXbJxqGvBFHN9VPuVoR3UA=="
49
+ crossorigin="anonymous"
50
+ referrerpolicy="no-referrer"></script>
49
51
 
50
52
  {{content-for "body-footer"}}
51
53
  </body>
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+ require('dotenv').config()
3
+
4
+ module.exports = function (environment) {
5
+ const ENV = {
6
+ modulePrefix: 'new',
7
+ environment,
8
+ rootURL: '/',
9
+ locationType: 'history',
10
+ EmberENV: {
11
+ EXTEND_PROTOTYPES: false,
12
+ FEATURES: {
13
+ // Here you can enable experimental features on an ember canary build
14
+ // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true
15
+ },
16
+ },
17
+
18
+ APP: {
19
+ // Here you can pass flags/options to your application instance
20
+ // when it is created
21
+ },
22
+
23
+ TribeENV: {
24
+ API_URL: process.env.TRIBE_API_URL,
25
+ API_KEY: process.env.TRIBE_API_KEY,
26
+ },
27
+ };
28
+
29
+ if (environment === 'development') {
30
+ // ENV.APP.LOG_RESOLVER = true;
31
+ // ENV.APP.LOG_ACTIVE_GENERATION = true;
32
+ // ENV.APP.LOG_TRANSITIONS = true;
33
+ // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
34
+ // ENV.APP.LOG_VIEW_LOOKUPS = true;
35
+ }
36
+
37
+ if (environment === 'test') {
38
+ // Testem prefers this...
39
+ ENV.locationType = 'none';
40
+
41
+ // keep test console output quieter
42
+ ENV.APP.LOG_ACTIVE_GENERATION = false;
43
+ ENV.APP.LOG_VIEW_LOOKUPS = false;
44
+
45
+ ENV.APP.rootElement = '#ember-testing';
46
+ ENV.APP.autoboot = false;
47
+ }
48
+
49
+ if (environment === 'production') {
50
+ // here you can enable a production-specific feature
51
+ }
52
+
53
+ return ENV;
54
+ };
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+ require('dotenv').config();
3
+
4
+ const { compatBuild } = require('@embroider/compat');
5
+ const EmberApp = require('ember-cli/lib/broccoli/ember-app');
6
+
7
+ module.exports = async function (defaults) {
8
+ const { buildOnce } = await import('@embroider/vite');
9
+
10
+ const app = new EmberApp(defaults, {
11
+ emberData: {
12
+ deprecations: { DEPRECATE_STORE_EXTENDS_EMBER_OBJECT: false }
13
+ }
14
+ });
15
+
16
+ return compatBuild(app, buildOnce, {
17
+ staticInvokables: true, // this is the default so you don't need to set it
18
+ splitAtRoutes: ['route.name'], // can also be a RegExp
19
+ );
20
+ };
@@ -0,0 +1,12 @@
1
+ import {
2
+ defineConfig,
3
+ minimal2023Preset as preset
4
+ } from '@vite-pwa/assets-generator/config'
5
+
6
+ export default defineConfig({
7
+ headLinkOptions: {
8
+ preset: '2023'
9
+ },
10
+ preset,
11
+ images: ['public/favicon.png']
12
+ })
@@ -0,0 +1,43 @@
1
+ import { defineConfig } from 'vite';
2
+ import { VitePWA } from 'vite-plugin-pwa';
3
+
4
+ export default defineConfig({
5
+ plugins: [
6
+ // ...your other Ember/Vite plugins
7
+
8
+ VitePWA({
9
+ registerType: 'autoUpdate',
10
+ includeAssets: ['favicon.png', 'favicon.ico', 'apple-touch-icon.png', 'mask-icon.svg'],
11
+ manifest: {
12
+ name: 'ember-tribe',
13
+ short_name: 'ember-tribe',
14
+ description: 'Built using ember-tribe.',
15
+ start_url: '/',
16
+ scope: '/',
17
+ display: 'standalone',
18
+ background_color: '#e9ecef',
19
+ theme_color: '#0A1119',
20
+ prefer_related_applications: true,
21
+ icons: [
22
+ {
23
+ src: '/favicon.png',
24
+ sizes: '512x512',
25
+ type: 'image/png',
26
+ },
27
+ {
28
+ // PWA installers prefer a 'any maskable' entry
29
+ src: '/favicon.png',
30
+ sizes: '512x512',
31
+ type: 'image/png',
32
+ purpose: 'any maskable',
33
+ },
34
+ ],
35
+ },
36
+ // Apple / MS meta that vite-plugin-pwa injects into the HTML <head>
37
+ devOptions: {
38
+ enabled: true,
39
+ },
40
+ })
41
+ ]
42
+ })
43
+
@@ -1,66 +1,61 @@
1
1
  'use strict';
2
2
 
3
3
  module.exports = {
4
- normalizeEntityName() {}, // no-op since we're just adding dependencies
4
+ normalizeEntityName() {},
5
5
 
6
6
  afterInstall() {
7
- return this.addAddonsToProject({
8
- packages: [
9
- { name: 'ember-cli-dotenv' },
10
- { name: 'ember-cli-sass' },
11
- { name: 'ember-cli-favicon' },
12
- { name: '@ember/optional-features' },
13
- { name: 'ember-modifier' },
14
- { name: 'ember-composable-helpers' },
15
- { name: 'ember-truth-helpers' },
16
- { name: 'ember-svg-jar' },
17
- { name: 'ember-math-helpers' },
18
- { name: 'ember-cli-string-helpers' },
19
- { name: 'ember-promise-helpers' },
20
- { name: '@ember/test-waiters', target: '^3.1.0' },
21
- { name: 'ember-tag-input' },
22
- { name: 'ember-file-upload' },
23
- { name: 'ember-toggle' },
24
- { name: 'ember-basic-dropdown' },
25
- { name: 'ember-power-select' },
26
- { name: 'ember-click-outside' },
27
- { name: 'ember-web-app' },
28
- { name: 'tracked-built-ins' },
29
- { name: 'ember-keyboard' },
30
- { name: 'ember-concurrency' },
31
- { name: 'ember-table' },
32
- { name: 'ember-animated' },
33
- ],
34
- }).then(() => {
35
- return this.addPackagesToProject([
36
- { name: 'bootstrap' },
37
- { name: '@popperjs/core' },
38
- { name: 'animate.css' },
39
- { name: 'video.js' },
40
- { name: 'swiper' },
41
- { name: 'howler' },
42
- { name: 'ripplet.js' },
43
- { name: '@ember/string' },
44
- { name: '@editorjs/editorjs' },
45
- { name: '@editorjs/image' },
46
- { name: '@editorjs/header' },
47
- { name: '@editorjs/raw' },
48
- { name: '@editorjs/code' },
49
- { name: '@editorjs/marker' },
50
- { name: '@editorjs/delimiter' },
51
- { name: '@editorjs/quote' },
52
- { name: '@editorjs/list' },
53
- { name: '@editorjs/attaches' },
54
- { name: '@editorjs/footnotes' },
55
- { name: '@editorjs/table' },
56
- { name: 'editorjs-hyperlink' },
57
- { name: 'miragejs' },
58
- { name: 'papaparse' },
59
- { name: 'sortablejs' },
60
- { name: 'highlight.js' },
61
- { name: 'uuid' },
62
- { name: 'pretty-print-json' },
63
- ]);
7
+ return this.addPackagesToProject([
8
+ { name: 'bootstrap' },
9
+ { name: '@popperjs/core' },
10
+ { name: 'sass' },
11
+ { name: 'animate.css' },
12
+ { name: 'video.js' },
13
+ { name: 'swiper' },
14
+ { name: 'howler' },
15
+ { name: '@editorjs/editorjs' },
16
+ { name: '@editorjs/image' },
17
+ { name: '@editorjs/header' },
18
+ { name: '@editorjs/raw' },
19
+ { name: '@editorjs/code' },
20
+ { name: '@editorjs/marker' },
21
+ { name: '@editorjs/delimiter' },
22
+ { name: '@editorjs/quote' },
23
+ { name: '@editorjs/list' },
24
+ { name: '@editorjs/attaches' },
25
+ { name: '@editorjs/footnotes' },
26
+ { name: '@editorjs/table' },
27
+ { name: 'editorjs-hyperlink' },
28
+ { name: '@embroider/vite' },
29
+ { name: '@embroider/compat' },
30
+ { name: 'miragejs' },
31
+ { name: 'papaparse' },
32
+ { name: 'sortablejs' },
33
+ { name: 'highlight.js' },
34
+ { name: 'uuid' },
35
+ { name: 'pretty-print-json' },
36
+ { name: 'dotenv' },
37
+ { name: '@vite-pwa/assets-generator' },
38
+ { name: 'vite-plugin-pwa' },
39
+ ]).then(() => {
40
+ return this.addAddonsToProject({
41
+ packages: [
42
+ { name: 'ember-modifier' },
43
+ { name: '@nullvoxpopuli/ember-composable-helpers' },
44
+ { name: 'ember-truth-helpers' },
45
+ { name: 'ember-math-helpers' },
46
+ { name: 'ember-cli-string-helpers' },
47
+ { name: 'ember-promise-helpers' },
48
+ { name: 'ember-tag-input' },
49
+ { name: 'ember-file-upload' },
50
+ { name: 'ember-toggle' },
51
+ { name: 'ember-basic-dropdown' },
52
+ { name: 'ember-power-select' },
53
+ { name: 'ember-click-outside' },
54
+ { name: 'ember-keyboard' },
55
+ { name: 'ember-concurrency' },
56
+ { name: 'ember-animated' },
57
+ ],
58
+ });
64
59
  });
65
60
  },
66
61
  };