Initial Commit from Ember CLI v6.9.1

_...,
                                                     ,:^;,...;
              -+===;.         ,,--++====++-,,,     .:  /.....,
            :::::~+++++#:,+#++++++++++++++++++#*..:   /,......
           (,,,,,,::=+++##++++++++++++++++++++++#.   :....../
            ...,,,,,::++++++++++++++++++++++++++++++*..,...:
            *..+...,#@@@@@@@@@++++++++++++++++++++++#*....*
              @#,;##############@@@+*+#@@@@@@@@@@#*++#..<
              *@##@@+,-*^^^*-+@####@@@######@@@#####@@,,,+
                @#@*            @#@@@@#@@+--*^^*--#@@@@@@#
                @#@.    @#      @##+++@#,           .@@#@@
                 #@#    @@     +@@++++#@@     @@     :@@
                 :@#*         @#@++++++@#*    #@     @@+
                :*+@@#;,.__.+@#@+,-^^.++@#          @@++
               ;*  :*@@@##@@@@;++r._j^.+@##@+,.__,,@@++.
              /*    ........+++++++++++++#@@@@@###@@#++++,
            ,:       ...,@@@#++===----==@@@####,,....+++++
           .:       ......@@##@\   ;   :@####@,,...... +++.
           ;       .........@###,   ;  ;xx#@;,,.....   *;+,
           |       ........,*;xxxx--^--=xxx,........   :+#;
           ;         ......,,;xxxxxxxxxxxxx;,.....     *+#
            ;          ......,::xxxx;.     ......       +.   .
             *;            .........  +###  ....       / ,. /:| ,.
               .+:             ...  ;##++##, .      ,#. (..v..;*./
                  **                ##  ###*    .:*&&&+. \.,....<,
                   #&+**==-..,,__  ;##  ###  :,*+&&&&&&&v+#&,,.._/
                  #&&&&*...,::,,.  ##; ,##* .*****;:&&&&&&&&&
                 ,+*+;~*..*** *.* ### ###* *******    *+#&;*
                                  ##,;##    ****    :,  **
         #####    ##   ###  ###,  ########       .#####   ;##  ##
        #######  ;##  #### ,###.  ##########    ########  ### ####
       ###  ###  ### ##########   ####  ####   ,##   ###  #######*
      ### ,###  ##############:   ##     ###  #### ,##   :#### ###  ##;
  ##########    ########### ##   .##    ,###  #######    ##### :######
    ######    .###### ####  ##   ###    ### ######*    :#####   ####
       #############  ####  ################    ######## ###
        #####*  *#*    #:   :###   *###*         *####    #*
This commit is contained in:
Tomster 2026-01-13 19:10:05 +07:00 committed by Râu Cao
commit 2b5d392eb0
Signed by: raucao
GPG Key ID: 37036C356E56CC51
33 changed files with 9604 additions and 0 deletions

19
.editorconfig Normal file
View File

@ -0,0 +1,19 @@
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# https://editorconfig.org/
root = true
[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
[*.hbs]
insert_final_newline = false
[*.{diff,md}]
trim_trailing_whitespace = false

8
.env.development Normal file
View File

@ -0,0 +1,8 @@
# This file is committed to git and should not contain any secrets.
#
# Vite recommends using .env.local or .env.[mode].local if you need to manage secrets
# SEE: https://vite.dev/guide/env-and-mode.html#env-files for more information.
# Default NODE_ENV with vite build --mode=test is production
NODE_ENV=development

53
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,53 @@
name: CI
on:
push:
branches:
- main
- master
pull_request: {}
concurrency:
group: ci-${{ github.head_ref || github.ref }}
cancel-in-progress: true
jobs:
lint:
name: "Lint"
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
with:
version: 10
- name: Install Node
uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
- name: Install Dependencies
run: pnpm install --frozen-lockfile
- name: Lint
run: pnpm lint
test:
name: "Test"
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
with:
version: 10
- name: Install Node
uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
- name: Install Dependencies
run: pnpm install --frozen-lockfile
- name: Run Tests
run: pnpm test

25
.gitignore vendored Normal file
View File

@ -0,0 +1,25 @@
# compiled output
/dist/
/tmp/
# dependencies
/node_modules/
# misc
*.local
/.pnp*
/.eslintcache
/coverage/
/npm-debug.log*
/testem.log
/yarn-error.log
# ember-try
/.node_modules.ember-try/
/npm-shrinkwrap.json.ember-try
/package.json.ember-try
/package-lock.json.ember-try
/yarn.lock.ember-try
# broccoli-debug
/DEBUG/

13
.prettierignore Normal file
View File

@ -0,0 +1,13 @@
# unconventional js
/blueprints/*/files/
# compiled output
/dist/
# misc
/coverage/
!.*
.*/
/pnpm-lock.yaml
ember-cli-update.json
*.html

37
.prettierrc.mjs Normal file
View File

@ -0,0 +1,37 @@
export default {
plugins: ['prettier-plugin-ember-template-tag'],
singleQuote: true,
overrides: [
{
files: ['*.js', '*.ts', '*.cjs', '.mjs', '.cts', '.mts', '.cts'],
options: {
trailingComma: 'es5',
},
},
{
files: ['*.html'],
options: {
singleQuote: false,
},
},
{
files: ['*.json'],
options: {
singleQuote: false,
},
},
{
files: ['*.hbs'],
options: {
singleQuote: false,
},
},
{
files: ['*.gjs', '*.gts'],
options: {
templateSingleQuote: false,
trailingComma: 'es5',
},
},
],
};

5
.stylelintignore Normal file
View File

@ -0,0 +1,5 @@
# unconventional files
/blueprints/*/files/
# compiled output
/dist/

3
.stylelintrc.mjs Normal file
View File

@ -0,0 +1,3 @@
export default {
extends: ['stylelint-config-standard'],
};

3
.template-lintrc.mjs Normal file
View File

@ -0,0 +1,3 @@
export default {
extends: 'recommended',
};

3
.watchmanconfig Normal file
View File

@ -0,0 +1,3 @@
{
"ignore_dirs": ["dist"]
}

55
README.md Normal file
View File

@ -0,0 +1,55 @@
# marco
This README outlines the details of collaborating on this Ember application.
A short introduction of this app could easily go here.
## Prerequisites
You will need the following things properly installed on your computer.
- [Git](https://git-scm.com/)
- [Node.js](https://nodejs.org/)
- [pnpm](https://pnpm.io/)
- [Google Chrome](https://google.com/chrome/)
## Installation
- `git clone <repository-url>` this repository
- `cd marco`
- `pnpm install`
## Running / Development
- `pnpm start`
- Visit your app at [http://localhost:4200](http://localhost:4200).
- Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests).
### Code Generators
Make use of the many generators for code, try `pnpm ember help generate` for more details
### Running Tests
- `pnpm test`
### Linting
- `pnpm lint`
- `pnpm lint:fix`
### Building
- `pnpm vite build --mode development` (development)
- `pnpm build` (production)
### Deploying
Specify what it takes to deploy your app.
## Further Reading / Useful Links
- [ember.js](https://emberjs.com/)
- [Vite](https://vite.dev)
- Development Browser Extensions
- [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi)
- [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/)

18
app/app.js Normal file
View File

@ -0,0 +1,18 @@
import '@warp-drive/ember/install';
import Application from '@ember/application';
import compatModules from '@embroider/virtual/compat-modules';
import Resolver from 'ember-resolver';
import config from 'marco/config/environment';
import { importSync, isDevelopingApp, macroCondition } from '@embroider/macros';
import setupInspector from '@embroider/legacy-inspector-support/ember-source-4.12';
if (macroCondition(isDevelopingApp())) {
importSync('./deprecation-workflow');
}
export default class App extends Application {
modulePrefix = config.modulePrefix;
podModulePrefix = config.podModulePrefix;
Resolver = Resolver.withModules(compatModules);
inspector = setupInspector(this);
}

0
app/components/.gitkeep Normal file
View File

22
app/config/environment.js Normal file
View File

@ -0,0 +1,22 @@
import { getGlobalConfig } from '@embroider/macros/src/addon/runtime';
const ENV = {
modulePrefix: 'marco',
environment: import.meta.env.DEV ? 'development' : 'production',
rootURL: '/',
locationType: 'history',
EmberENV: {},
APP: {},
};
export default ENV;
export function enterTestMode() {
ENV.locationType = 'none';
ENV.APP.rootElement = '#ember-testing';
ENV.APP.autoboot = false;
const config = getGlobalConfig()['@embroider/macros'];
if (config) config.isTesting = true;
}

View File

@ -0,0 +1,24 @@
import setupDeprecationWorkflow from 'ember-cli-deprecation-workflow';
/**
* Docs: https://github.com/ember-cli/ember-cli-deprecation-workflow
*/
setupDeprecationWorkflow({
/**
false by default, but if a developer / team wants to be more aggressive about being proactive with
handling their deprecations, this should be set to "true"
*/
throwOnUnhandled: false,
workflow: [
/* ... handlers ... */
/* to generate this list, run your app for a while (or run the test suite),
* and then run in the browser console:
*
* deprecationWorkflow.flushDeprecations()
*
* And copy the handlers here
*/
/* example: */
/* { handler: 'silence', matchId: 'template-action' }, */
],
});

9
app/router.js Normal file
View File

@ -0,0 +1,9 @@
import EmberRouter from '@embroider/router';
import config from 'marco/config/environment';
export default class Router extends EmberRouter {
location = config.locationType;
rootURL = config.rootURL;
}
Router.map(function () {});

0
app/routes/.gitkeep Normal file
View File

15
app/services/store.js Normal file
View File

@ -0,0 +1,15 @@
import { useLegacyStore } from '@warp-drive/legacy';
import { JSONAPICache } from '@warp-drive/json-api';
const Store = useLegacyStore({
linksMode: true,
cache: JSONAPICache,
handlers: [
// -- your handlers here
],
schemas: [
// -- your schemas here
],
});
export default Store;

1
app/styles/app.css Normal file
View File

@ -0,0 +1 @@
/* Ember supports plain CSS out of the box. More info: https://cli.emberjs.com/release/advanced-use/stylesheets/ */

View File

@ -0,0 +1,12 @@
import { pageTitle } from 'ember-page-title';
import { WelcomePage } from 'ember-welcome-page';
<template>
{{pageTitle "Marco"}}
{{outlet}}
{{! The following component displays Ember's default welcome message. }}
<WelcomePage @extension="gjs" />
{{! Feel free to remove this! }}
</template>

46
babel.config.mjs Normal file
View File

@ -0,0 +1,46 @@
import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import { setConfig } from '@warp-drive/core/build-config';
import { buildMacros } from '@embroider/macros/babel';
const macros = buildMacros({
configure: (config) => {
setConfig(config, {
// for universal apps this MUST be at least 5.6
compatWith: '5.6',
});
},
});
export default {
plugins: [
[
'babel-plugin-ember-template-compilation',
{
compilerPath: 'ember-source/dist/ember-template-compiler.js',
transforms: [...macros.templateMacros],
},
],
[
'module:decorator-transforms',
{
runtime: {
import: import.meta.resolve('decorator-transforms/runtime-esm'),
},
},
],
[
'@babel/plugin-transform-runtime',
{
absoluteRuntime: dirname(fileURLToPath(import.meta.url)),
useESModules: true,
regenerator: false,
},
],
...macros.babelMacros,
],
generatorOpts: {
compact: false,
},
};

103
eslint.config.mjs Normal file
View File

@ -0,0 +1,103 @@
/**
* Debugging:
* https://eslint.org/docs/latest/use/configure/debug
* ----------------------------------------------------
*
* Print a file's calculated configuration
*
* npx eslint --print-config path/to/file.js
*
* Inspecting the config
*
* npx eslint --inspect-config
*
*/
import globals from 'globals';
import js from '@eslint/js';
import { defineConfig, globalIgnores } from 'eslint/config';
import ember from 'eslint-plugin-ember/recommended';
import WarpDrive from 'eslint-plugin-warp-drive/recommended';
import eslintConfigPrettier from 'eslint-config-prettier';
import qunit from 'eslint-plugin-qunit';
import n from 'eslint-plugin-n';
import babelParser from '@babel/eslint-parser/experimental-worker';
const esmParserOptions = {
ecmaFeatures: { modules: true },
ecmaVersion: 'latest',
};
export default defineConfig([
globalIgnores(['dist/', 'coverage/', '!**/.*']),
js.configs.recommended,
eslintConfigPrettier,
ember.configs.base,
ember.configs.gjs,
...WarpDrive,
/**
* https://eslint.org/docs/latest/use/configure/configuration-files#configuring-linter-options
*/
{
linterOptions: {
reportUnusedDisableDirectives: 'error',
},
},
{
files: ['**/*.js'],
languageOptions: {
parser: babelParser,
},
},
{
files: ['**/*.{js,gjs}'],
languageOptions: {
parserOptions: esmParserOptions,
globals: {
...globals.browser,
},
},
},
{
files: ['tests/**/*-test.{js,gjs}'],
plugins: {
qunit,
},
},
/**
* CJS node files
*/
{
files: ['**/*.cjs', 'config/**/*.js', 'ember-cli-build.js'],
plugins: {
n,
},
languageOptions: {
sourceType: 'script',
ecmaVersion: 'latest',
globals: {
...globals.node,
},
},
},
/**
* ESM node files
*/
{
files: ['**/*.mjs'],
plugins: {
n,
},
languageOptions: {
sourceType: 'module',
ecmaVersion: 'latest',
parserOptions: esmParserOptions,
globals: {
...globals.node,
},
},
},
]);

19
index.html Normal file
View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Marco</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/app/styles/app.css">
</head>
<body>
<script type="module">
import Application from './app/app';
import environment from './app/config/environment';
Application.create(environment.APP);
</script>
</body>
</html>

87
package.json Normal file
View File

@ -0,0 +1,87 @@
{
"name": "marco",
"version": "0.0.0",
"private": true,
"description": "Small description for marco goes here",
"repository": "",
"license": "MIT",
"author": "",
"type": "module",
"imports": {
"#app/*": "./app/*",
"#config": "./app/config/environment",
"#components/*": "./app/components/*"
},
"exports": {
"./tests/*": "./tests/*",
"./*": "./app/*"
},
"scripts": {
"build": "vite build",
"format": "prettier . --cache --write",
"lint": "concurrently \"pnpm:lint:*(!fix)\" --names \"lint:\" --prefixColors auto",
"lint:css": "stylelint \"**/*.css\"",
"lint:css:fix": "concurrently \"pnpm:lint:css -- --fix\"",
"lint:fix": "concurrently \"pnpm:lint:*:fix\" --names \"fix:\" --prefixColors auto && pnpm format",
"lint:format": "prettier . --cache --check",
"lint:hbs": "ember-template-lint .",
"lint:hbs:fix": "ember-template-lint . --fix",
"lint:js": "eslint . --cache",
"lint:js:fix": "eslint . --fix",
"start": "vite",
"test": "vite build --mode development && testem ci --port 0"
},
"devDependencies": {
"@babel/core": "^7.28.5",
"@babel/eslint-parser": "^7.28.5",
"@babel/plugin-transform-runtime": "^7.28.5",
"@babel/runtime": "^7.28.4",
"@ember/test-helpers": "^5.4.1",
"@ember/test-waiters": "^4.1.1",
"@embroider/core": "^4.4.2",
"@embroider/legacy-inspector-support": "^0.1.3",
"@embroider/macros": "^1.19.6",
"@embroider/router": "^3.0.6",
"@embroider/vite": "^1.5.0",
"@eslint/js": "^9.39.2",
"@glimmer/component": "^2.0.0",
"@rollup/plugin-babel": "^6.1.0",
"@warp-drive/core": "~5.8.0",
"@warp-drive/ember": "~5.8.0",
"@warp-drive/json-api": "~5.8.0",
"@warp-drive/legacy": "~5.8.0",
"@warp-drive/utilities": "~5.8.0",
"babel-plugin-ember-template-compilation": "^3.0.1",
"concurrently": "^9.2.1",
"decorator-transforms": "^2.3.1",
"ember-cli-deprecation-workflow": "^4.0.0",
"ember-modifier": "^4.2.2",
"ember-page-title": "^9.0.3",
"ember-qunit": "^9.0.4",
"ember-resolver": "^13.1.1",
"ember-source": "~6.11.0-alpha.6",
"ember-template-lint": "^7.9.3",
"ember-welcome-page": "^8.0.4",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-ember": "^12.7.5",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-qunit": "^8.2.5",
"eslint-plugin-warp-drive": "^5.8.0",
"globals": "^16.5.0",
"prettier": "^3.7.4",
"prettier-plugin-ember-template-tag": "^2.1.2",
"qunit": "^2.25.0",
"qunit-dom": "^3.5.0",
"stylelint": "^16.26.1",
"stylelint-config-standard": "^38.0.0",
"testem": "^3.17.0",
"vite": "^7.3.0"
},
"engines": {
"node": ">= 24"
},
"ember": {
"edition": "octane"
}
}

8891
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

3
public/robots.txt Normal file
View File

@ -0,0 +1,3 @@
# https://www.robotstxt.org/
User-agent: *
Disallow:

26
testem.cjs Normal file
View File

@ -0,0 +1,26 @@
'use strict';
if (typeof module !== 'undefined') {
module.exports = {
test_page: 'tests/index.html?hidepassed',
cwd: 'dist',
disable_watching: true,
launch_in_ci: ['Chrome'],
launch_in_dev: ['Chrome'],
browser_start_timeout: 120,
browser_args: {
Chrome: {
ci: [
// --no-sandbox is needed when running Chrome inside a container
process.env.CI ? '--no-sandbox' : null,
'--headless',
'--disable-dev-shm-usage',
'--disable-software-rasterizer',
'--mute-audio',
'--remote-debugging-port=0',
'--window-size=1440,900',
].filter(Boolean),
},
},
};
}

42
tests/helpers/index.js Normal file
View File

@ -0,0 +1,42 @@
import {
setupApplicationTest as upstreamSetupApplicationTest,
setupRenderingTest as upstreamSetupRenderingTest,
setupTest as upstreamSetupTest,
} from 'ember-qunit';
// This file exists to provide wrappers around ember-qunit's
// test setup functions. This way, you can easily extend the setup that is
// needed per test type.
function setupApplicationTest(hooks, options) {
upstreamSetupApplicationTest(hooks, options);
// Additional setup for application tests can be done here.
//
// For example, if you need an authenticated session for each
// application test, you could do:
//
// hooks.beforeEach(async function () {
// await authenticateSession(); // ember-simple-auth
// });
//
// This is also a good place to call test setup functions coming
// from other addons:
//
// setupIntl(hooks, 'en-us'); // ember-intl
// setupMirage(hooks); // ember-cli-mirage
}
function setupRenderingTest(hooks, options) {
upstreamSetupRenderingTest(hooks, options);
// Additional setup for rendering tests can be done here.
}
function setupTest(hooks, options) {
upstreamSetupTest(hooks, options);
// Additional setup for unit tests can be done here.
}
export { setupApplicationTest, setupRenderingTest, setupTest };

31
tests/index.html Normal file
View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Marco Tests</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/app/styles/app.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture">
<div id="ember-testing-container">
<div id="ember-testing"></div>
</div>
</div>
<script src="/testem.js" integrity="" data-embroider-ignore></script>
<script type="module">import "ember-testing";</script>
<script type="module">
import { start } from './test-helper';
import.meta.glob("./**/*.{js,ts,gjs,gts}", { eager: true });
start();
</script>
</body>
</html>

View File

17
tests/test-helper.js Normal file
View File

@ -0,0 +1,17 @@
import '@warp-drive/ember/install';
import Application from 'marco/app';
import config, { enterTestMode } from 'marco/config/environment';
import * as QUnit from 'qunit';
import { setApplication } from '@ember/test-helpers';
import { setup } from 'qunit-dom';
import { start as qunitStart, setupEmberOnerrorValidation } from 'ember-qunit';
export function start() {
enterTestMode();
setApplication(Application.create(config.APP));
setup(QUnit.assert);
setupEmberOnerrorValidation();
qunitStart();
}

0
tests/unit/.gitkeep Normal file
View File

14
vite.config.mjs Normal file
View File

@ -0,0 +1,14 @@
import { defineConfig } from 'vite';
import { extensions, ember } from '@embroider/vite';
import { babel } from '@rollup/plugin-babel';
export default defineConfig({
plugins: [
ember(),
// extra plugins here
babel({
babelHelpers: 'runtime',
extensions,
}),
],
});