diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 8a4c8e03c7e..f42781a54ec 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -254,6 +254,7 @@ jobs: - customjhlite - typescriptapp - thymeleafapp + - svelteapp include: - java-build-tool: maven - spring-config-format: yaml diff --git a/src/main/java/tech/jhipster/lite/generator/client/svelte/core/domain/SvelteModuleFactory.java b/src/main/java/tech/jhipster/lite/generator/client/svelte/core/domain/SvelteModuleFactory.java index 84256079763..9a711224a11 100644 --- a/src/main/java/tech/jhipster/lite/generator/client/svelte/core/domain/SvelteModuleFactory.java +++ b/src/main/java/tech/jhipster/lite/generator/client/svelte/core/domain/SvelteModuleFactory.java @@ -1,5 +1,6 @@ package tech.jhipster.lite.generator.client.svelte.core.domain; +import static tech.jhipster.lite.module.domain.JHipsterModule.append; import static tech.jhipster.lite.module.domain.JHipsterModule.from; import static tech.jhipster.lite.module.domain.JHipsterModule.lineBeforeText; import static tech.jhipster.lite.module.domain.JHipsterModule.moduleBuilder; @@ -13,8 +14,10 @@ import static tech.jhipster.lite.module.domain.npm.JHLiteNpmVersionSource.COMMON; import static tech.jhipster.lite.module.domain.npm.JHLiteNpmVersionSource.SVELTE; +import java.util.function.Consumer; import tech.jhipster.lite.module.domain.Indentation; import tech.jhipster.lite.module.domain.JHipsterModule; +import tech.jhipster.lite.module.domain.JHipsterModule.JHipsterModuleBuilder; import tech.jhipster.lite.module.domain.file.JHipsterDestination; import tech.jhipster.lite.module.domain.file.JHipsterSource; import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties; @@ -26,62 +29,55 @@ public class SvelteModuleFactory { private static final String ENGINES_NEEDLE = " \"engines\":"; - private static final JHipsterSource PRIMARY_MAIN_SOURCE = SOURCE.append("src/main/webapp/app/common/primary/app"); - private static final JHipsterDestination PRIMARY_MAIN_DESTINATION = to("src/main/webapp/app/common/primary/app"); + private static final JHipsterSource PRIMARY_MAIN_SOURCE = SOURCE.append("src/main/webapp/lib/common/primary/app"); + private static final JHipsterDestination PRIMARY_MAIN_DESTINATION = to("src/main/webapp/lib/common/primary/app"); private static final JHipsterSource CLIENT_COMMON = from("client/common"); - private static final JHipsterSource PRIMARY_TEST_SOURCE = SOURCE.append("src/test/unit/common/primary/app"); - private static final JHipsterDestination PRIMARY_TEST_DESTINATION = to("src/test/webapp/unit/common/primary/app"); - public JHipsterModule buildSvelteModule(JHipsterModuleProperties properties) { Assert.notNull("properties", properties); //@formatter:off return moduleBuilder(properties) - .preCommitActions(stagedFilesFilter("{src/**/,}*.ts"), preCommitCommands("eslint --fix", "prettier --write")) + .preCommitActions(stagedFilesFilter("{src/**/,}*.{js,svelte}"), preCommitCommands("eslint --fix", "prettier --write", "npm run check")) .gitIgnore() - .comment("Svelte") - .pattern(".svelte-kit/") - .and() + .comment("Vite") + .pattern("vite.config.js.timestamp-*") + .comment("Env") + .pattern(".env") + .pattern(".env.*") + .pattern("!.env.test") + .and() .packageJson() - .addDependency(packageName("svelte-navigator"), SVELTE) - .addDevDependency(packageName("@babel/preset-env"), SVELTE) .addDevDependency(packageName("@sveltejs/adapter-static"), SVELTE) .addDevDependency(packageName("@sveltejs/kit"), SVELTE) + .addDevDependency(packageName("@sveltejs/vite-plugin-svelte"), SVELTE) + .addDevDependency(packageName("@testing-library/jest-dom"), SVELTE) .addDevDependency(packageName("@testing-library/svelte"), SVELTE) - .addDevDependency(packageName("@typescript-eslint/eslint-plugin"), SVELTE) - .addDevDependency(packageName("@typescript-eslint/parser"), SVELTE) - .addDevDependency(packageName("@vitest/coverage-istanbul"), SVELTE) - .addDevDependency(packageName("babel-plugin-transform-vite-meta-env"), SVELTE) - .addDevDependency(packageName("eslint"), SVELTE) + .addDevDependency(packageName("@testing-library/user-event"), SVELTE) + .addDevDependency(packageName("@vitest/coverage-v8"), SVELTE) + .addDevDependency(packageName("@vitest/ui"), SVELTE) + .addDevDependency(packageName("@types/eslint"), SVELTE) + .addDevDependency(packageName("eslint"), COMMON) .addDevDependency(packageName("eslint-config-prettier"), COMMON) - .addDevDependency(packageName("eslint-plugin-svelte3"), SVELTE) - .addDevDependency(packageName("jsdom"), SVELTE) - .addDevDependency(packageName("prettier"), SVELTE) + .addDevDependency(packageName("eslint-plugin-svelte"), SVELTE) + .addDevDependency(packageName("globals"), COMMON) + .addDevDependency(packageName("jsdom"), COMMON) .addDevDependency(packageName("prettier-plugin-svelte"), SVELTE) .addDevDependency(packageName("svelte"), SVELTE) .addDevDependency(packageName("svelte-check"), SVELTE) - .addDevDependency(packageName("svelte-preprocess"), SVELTE) - .addDevDependency(packageName("tslib"), SVELTE) - .addDevDependency(packageName("typescript"), SVELTE) - .addDevDependency(packageName("vite"), SVELTE) - .addDevDependency(packageName("vitest"), SVELTE) - .addDevDependency(packageName("vitest-sonar-reporter"), SVELTE) - .addScript(scriptKey("dev"), scriptCommand("vite dev --port 9000")) - .addScript(scriptKey("start"), scriptCommand("vite dev --port 9000")) + .addDevDependency(packageName("typescript"), COMMON) + .addDevDependency(packageName("vite"), COMMON) + .addDevDependency(packageName("vitest"), COMMON) + .addDevDependency(packageName("vitest-sonar-reporter"), COMMON) + .addScript(scriptKey("start"), scriptCommand("vite dev --port 9000 --open")) .addScript(scriptKey("build"), scriptCommand("vite build")) - .addScript(scriptKey("package"), scriptCommand("vite package")) .addScript(scriptKey("preview"), scriptCommand("vite preview")) - .addScript(scriptKey("check"), scriptCommand("svelte-check --tsconfig ./tsconfig.json")) - .addScript(scriptKey("check:watch"), scriptCommand("svelte-check --tsconfig ./tsconfig.json --watch")) - .addScript( - scriptKey("lint"), - scriptCommand("prettier --ignore-path .gitignore --check && eslint --ignore-path .gitignore .") - ) - .addScript(scriptKey("format"), scriptCommand("prettier --ignore-path .gitignore --write")) - .addScript(scriptKey("test"), scriptCommand("npm run test:watch")) - .addScript(scriptKey("test:coverage"), scriptCommand("vitest run --coverage")) - .addScript(scriptKey("test:watch"), scriptCommand("vitest --")) + .addScript(scriptKey("check"), scriptCommand("svelte-kit sync && svelte-check --tsconfig ./jsconfig.json")) + .addScript(scriptKey("lint"), scriptCommand("prettier --check . && eslint .")) + .addScript(scriptKey("format"), scriptCommand("prettier --write '{,src/**/,cypress/**/}*.{md,json,js,cjs,svelte,css,html,yml}'")) + .addScript(scriptKey("test"), scriptCommand("vitest run --coverage")) + .addScript(scriptKey("test:ui"), scriptCommand("vitest --ui --coverage")) + .addScript(scriptKey("test:watch"), scriptCommand("vitest")) .and() .optionalReplacements() .in(path("package.json")) @@ -89,33 +85,50 @@ public JHipsterModule buildSvelteModule(JHipsterModuleProperties properties) { .and() .and() .files() - .add(SOURCE.file(".eslintrc.cjs"), to(".eslintrc.cjs")) - .add(SOURCE.file("tsconfig.json"), to("tsconfig.json")) - .add(SOURCE.file("vite.config.js"), to("vite.config.js")) .add(SOURCE.append("src/main/webapp/routes").template("+page.svelte"), to("src/main/webapp/routes/+page.svelte")) .add(PRIMARY_MAIN_SOURCE.template("App.svelte"), PRIMARY_MAIN_DESTINATION.append("App.svelte")) - .add(PRIMARY_TEST_SOURCE.template("App.spec.ts"), PRIMARY_TEST_DESTINATION.append("App.spec.ts")) + .add(PRIMARY_MAIN_SOURCE.template("App.spec.js"), PRIMARY_MAIN_DESTINATION.append("App.spec.js")) .batch(CLIENT_COMMON, to(".")) - .addFile(".eslintignore") .addFile(".npmrc") .and() .batch(SOURCE, to(".")) .addTemplate("svelte.config.js") - .addTemplate("vitest.config.ts") + .addTemplate("eslint.config.js") + .addTemplate("vite.config.js") + .addFile("vitest-setup.js") + .addTemplate("jsconfig.json") .and() .batch(SOURCE.file("src/main/webapp"), to("src/main/webapp")) .addTemplate("app.html") - .addTemplate("app.d.ts") .and() .batch(SOURCE.file("src/main/webapp/assets"), to("src/main/webapp/assets")) - .addFile("JHipster-Lite-neon-orange.png") + .addFile("favicon.png") + .and() + .batch(SOURCE.file("src/main/webapp/assets/img"), to("src/main/webapp/assets/img")) + .addFile("jhipster-lite-neon-orange.png") .addFile("svelte-logo.png") .and() .and() + .apply(patchPrettierConfig(properties)) .build(); //@formatter:on } + private Consumer patchPrettierConfig(JHipsterModuleProperties properties) { + //@formatter:off + return moduleBuilder -> moduleBuilder + .mandatoryReplacements() + .in(path(".prettierrc")) + .add(lineBeforeText("plugins:"), properties.indentation().times(1) + "- prettier-plugin-svelte") + .add(append(), "\n# Svelte rules:") + .add(append(), "semi: false") + .add(append(), "svelteSortOrder: options-scripts-styles-markup") + .add(append(), "svelteStrictMode: true") + .and() + .and(); + //@formatter:on + } + private static String type(Indentation indentation) { return indentation.spaces() + "\"type\": \"module\","; } diff --git a/src/main/resources/config/application-svelte.yml b/src/main/resources/config/application-svelte.yml new file mode 100644 index 00000000000..bb94980c5ef --- /dev/null +++ b/src/main/resources/config/application-svelte.yml @@ -0,0 +1,5 @@ +jhlite-hidden-resources.slugs: + - spring-boot-kafka-sample-producer-consumer + - angular-core + - react-core + - vue-core diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index b7d2ae93f77..4ab7ed70f93 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -67,7 +67,6 @@ application: jhlite-hidden-resources: slugs: - - svelte-core - tikui jhlite-preset-file: diff --git a/src/main/resources/generator/client/svelte/.eslintrc.cjs b/src/main/resources/generator/client/svelte/.eslintrc.cjs deleted file mode 100644 index f216abe01f3..00000000000 --- a/src/main/resources/generator/client/svelte/.eslintrc.cjs +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], - plugins: ['@typescript-eslint'], - ignorePatterns: ['*.cjs'], - settings: { - 'svelte3/typescript': () => require('typescript'), - }, - parserOptions: { - sourceType: 'module', - ecmaVersion: 2020, - }, - env: { - browser: true, - es2017: true, - node: true, - }, -}; diff --git a/src/main/resources/generator/client/svelte/eslint.config.js.mustache b/src/main/resources/generator/client/svelte/eslint.config.js.mustache new file mode 100644 index 00000000000..6aa4bbc3a96 --- /dev/null +++ b/src/main/resources/generator/client/svelte/eslint.config.js.mustache @@ -0,0 +1,26 @@ +import js from '@eslint/js' +import svelte from 'eslint-plugin-svelte' +import prettier from 'eslint-config-prettier'; +import globals from 'globals' + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + js.configs.recommended, + ...svelte.configs['flat/recommended'], + prettier, + ...svelte.configs['flat/prettier'], + { + ignores: [ + '{{projectBuildDirectory}}/', + 'dist/', + ], + }, + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + }, + }, + }, +]; diff --git a/src/main/resources/generator/client/svelte/jsconfig.json.mustache b/src/main/resources/generator/client/svelte/jsconfig.json.mustache new file mode 100644 index 00000000000..09f16997a4b --- /dev/null +++ b/src/main/resources/generator/client/svelte/jsconfig.json.mustache @@ -0,0 +1,15 @@ +{ + "extends": "./{{projectBuildDirectory}}/svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + }, + "include": ["src/main/webapp/**/*.js", "src/main/webapp/**/*.svelte"] +} diff --git a/src/main/resources/generator/client/svelte/src/main/webapp/app.d.ts.mustache b/src/main/resources/generator/client/svelte/src/main/webapp/app.d.ts.mustache deleted file mode 100644 index f5cdcd6681a..00000000000 --- a/src/main/resources/generator/client/svelte/src/main/webapp/app.d.ts.mustache +++ /dev/null @@ -1,13 +0,0 @@ -/// - -// See https://kit.svelte.dev/docs/typescript -// for information about these interfaces -declare namespace App { - interface Locals {} - - interface Platform {} - - interface Session {} - - interface Stuff {} -} diff --git a/src/main/resources/generator/client/svelte/src/main/webapp/app.html.mustache b/src/main/resources/generator/client/svelte/src/main/webapp/app.html.mustache index c2ea614f616..b85ed3f56d4 100644 --- a/src/main/resources/generator/client/svelte/src/main/webapp/app.html.mustache +++ b/src/main/resources/generator/client/svelte/src/main/webapp/app.html.mustache @@ -1,13 +1,15 @@ - svelteapp + {{ projectName }} + - + + %sveltekit.head% - -
%sveltekit.body%
+ +
%sveltekit.body%
diff --git a/src/main/resources/generator/client/svelte/src/main/webapp/assets/favicon.png b/src/main/resources/generator/client/svelte/src/main/webapp/assets/favicon.png new file mode 100644 index 00000000000..485cc01edc0 Binary files /dev/null and b/src/main/resources/generator/client/svelte/src/main/webapp/assets/favicon.png differ diff --git a/src/main/resources/generator/client/svelte/src/main/webapp/assets/JHipster-Lite-neon-orange.png b/src/main/resources/generator/client/svelte/src/main/webapp/assets/img/jhipster-lite-neon-orange.png similarity index 100% rename from src/main/resources/generator/client/svelte/src/main/webapp/assets/JHipster-Lite-neon-orange.png rename to src/main/resources/generator/client/svelte/src/main/webapp/assets/img/jhipster-lite-neon-orange.png diff --git a/src/main/resources/generator/client/svelte/src/main/webapp/assets/svelte-logo.png b/src/main/resources/generator/client/svelte/src/main/webapp/assets/img/svelte-logo.png similarity index 100% rename from src/main/resources/generator/client/svelte/src/main/webapp/assets/svelte-logo.png rename to src/main/resources/generator/client/svelte/src/main/webapp/assets/img/svelte-logo.png diff --git a/src/main/resources/generator/client/svelte/src/test/unit/common/primary/app/App.spec.ts.mustache b/src/main/resources/generator/client/svelte/src/main/webapp/lib/common/primary/app/App.spec.js.mustache similarity index 78% rename from src/main/resources/generator/client/svelte/src/test/unit/common/primary/app/App.spec.ts.mustache rename to src/main/resources/generator/client/svelte/src/main/webapp/lib/common/primary/app/App.spec.js.mustache index 792bd6bf2b7..1870b62987e 100644 --- a/src/main/resources/generator/client/svelte/src/test/unit/common/primary/app/App.spec.ts.mustache +++ b/src/main/resources/generator/client/svelte/src/main/webapp/lib/common/primary/app/App.spec.js.mustache @@ -1,5 +1,5 @@ import { test, expect } from 'vitest'; -import App from '@/common/primary/app/App.svelte'; +import App from '$lib/common/primary/app/App.svelte'; import { render } from '@testing-library/svelte'; test('Welcome the user', () => { diff --git a/src/main/resources/generator/client/svelte/src/main/webapp/app/common/primary/app/App.svelte.mustache b/src/main/resources/generator/client/svelte/src/main/webapp/lib/common/primary/app/App.svelte.mustache similarity index 51% rename from src/main/resources/generator/client/svelte/src/main/webapp/app/common/primary/app/App.svelte.mustache rename to src/main/resources/generator/client/svelte/src/main/webapp/lib/common/primary/app/App.svelte.mustache index d50508a8ee0..e5c6ed521a8 100644 --- a/src/main/resources/generator/client/svelte/src/main/webapp/app/common/primary/app/App.svelte.mustache +++ b/src/main/resources/generator/client/svelte/src/main/webapp/lib/common/primary/app/App.svelte.mustache @@ -1,20 +1,21 @@ +
+

Svelte Application: JHipster + SvelteKit

- +
- JHipster logo + JHipster logo
-

svelteapp: SvelteKit + Typescript

Recommend IDE setup: VSCode

Edit - src/main/webapp/app/common/primary/app/App.svelte to test hot module replacement. + src/main/webapp/lib/common/primary/app/App.svelte to test hot module replacement.

diff --git a/src/main/resources/generator/client/svelte/src/main/webapp/routes/+page.svelte.mustache b/src/main/resources/generator/client/svelte/src/main/webapp/routes/+page.svelte.mustache index b91efd4f3c0..b49c55bfc78 100644 --- a/src/main/resources/generator/client/svelte/src/main/webapp/routes/+page.svelte.mustache +++ b/src/main/resources/generator/client/svelte/src/main/webapp/routes/+page.svelte.mustache @@ -1,12 +1,5 @@ - -
- -
-
+ diff --git a/src/main/resources/generator/client/svelte/svelte.config.js.mustache b/src/main/resources/generator/client/svelte/svelte.config.js.mustache index 9d490388d80..d8d94af279c 100644 --- a/src/main/resources/generator/client/svelte/svelte.config.js.mustache +++ b/src/main/resources/generator/client/svelte/svelte.config.js.mustache @@ -1,9 +1,9 @@ -import adapter from '@sveltejs/adapter-static'; -import preprocess from 'svelte-preprocess'; +import adapter from '@sveltejs/adapter-static' +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' +/** @type {import('@sveltejs/kit').Config} */ const config = { - preprocess: preprocess(), - + preprocess: vitePreprocess(), kit: { adapter: adapter({ pages: '{{projectBuildDirectory}}/classes/static/', @@ -15,13 +15,15 @@ const config = { routes: 'src/main/webapp/routes', appTemplate: 'src/main/webapp/app.html', assets: 'src/main/webapp/assets', - hooks: { - server: 'src/main/webapp/hooks', - }, lib: 'src/main/webapp/lib', serviceWorker: 'src/main/webapp/service-worker', }, + alias: { + $lib: 'src/main/webapp/lib', + '$lib/*': 'src/main/webapp/lib/*', + }, + outDir: '{{projectBuildDirectory}}/svelte-kit', }, -}; +} export default config; diff --git a/src/main/resources/generator/client/svelte/tsconfig.json b/src/main/resources/generator/client/svelte/tsconfig.json deleted file mode 100644 index c1c2c3ec070..00000000000 --- a/src/main/resources/generator/client/svelte/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "moduleResolution": "node", - "module": "es2020", - "lib": ["es2020", "DOM"], - "target": "es2020", - "importsNotUsedAsValues": "error", - "preserveValueImports": true, - "isolatedModules": true, - "resolveJsonModule": true, - "sourceMap": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "allowJs": true, - "checkJs": true, - "baseUrl": "src", - "paths": { - "@/*": ["main/webapp/app/*"], - "@assets/*": ["main/webapp/assets/*"] - } - }, - "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.ts", "src/**/*.svelte", "src/tests/**/*"] -} diff --git a/src/main/resources/generator/client/svelte/vite.config.js b/src/main/resources/generator/client/svelte/vite.config.js deleted file mode 100644 index ff97e227aba..00000000000 --- a/src/main/resources/generator/client/svelte/vite.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import path from 'path'; - -const config = { - plugins: [sveltekit()], - resolve: { - alias: [ - { find: '@', replacement: path.resolve('src/main/webapp') }, - { find: '@assets', replacement: path.resolve('src/main/webapp/assets') }, - ], - }, -}; - -export default config; diff --git a/src/main/resources/generator/client/svelte/vite.config.js.mustache b/src/main/resources/generator/client/svelte/vite.config.js.mustache new file mode 100644 index 00000000000..f9b7201f880 --- /dev/null +++ b/src/main/resources/generator/client/svelte/vite.config.js.mustache @@ -0,0 +1,22 @@ +import { sveltekit } from '@sveltejs/kit/vite' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [sveltekit()], + test: { + globals: true, + include: ['src/main/webapp/**/*.{test,spec}.js'], + environment: 'jsdom', + setupFiles: './vitest-setup.js', + css: true, + reporters: ['verbose', 'vitest-sonar-reporter'], + outputFile: '{{projectBuildDirectory}}/test-results/js/sonar-report.xml', + sonarReporterOptions: { silent: true }, + coverage: { + clean: true, + reporter: ['text', 'html', 'lcov'], + reportsDirectory: '{{projectBuildDirectory}}/test-results/js/', + include: ['src/main/webapp'], + }, + }, +}) diff --git a/src/main/resources/generator/client/svelte/vitest-setup.js b/src/main/resources/generator/client/svelte/vitest-setup.js new file mode 100644 index 00000000000..bb02c60cd05 --- /dev/null +++ b/src/main/resources/generator/client/svelte/vitest-setup.js @@ -0,0 +1 @@ +import '@testing-library/jest-dom/vitest'; diff --git a/src/main/resources/generator/client/svelte/vitest.config.ts.mustache b/src/main/resources/generator/client/svelte/vitest.config.ts.mustache deleted file mode 100644 index a71d5af1a45..00000000000 --- a/src/main/resources/generator/client/svelte/vitest.config.ts.mustache +++ /dev/null @@ -1,50 +0,0 @@ -/// - -import { defineConfig } from 'vitest/config'; -import { svelte } from '@sveltejs/vite-plugin-svelte'; -import path from 'path'; - -export default defineConfig({ - plugins: [svelte()], - resolve: { - alias: [ - { find: '@', replacement: path.resolve(__dirname, 'src/main/webapp/app') }, - { find: '@assets', replacement: path.resolve(__dirname, 'src/main/webapp/assets') }, - ], - }, - test: { - reporters: ['verbose', 'vitest-sonar-reporter'], - outputFile: { - 'vitest-sonar-reporter': '{{projectBuildDirectory}}/test-results/TESTS-results-sonar.xml', - }, - globals: true, - logHeapUsage: true, - poolOptions: { - threads: { - minThreads: 1, - maxThreads: 2, - }, - }, - environment: 'jsdom', - cache: false, - include: ['src/test/webapp/unit/**/*.(spec|test).(ts|tsx)'], - exclude: ['node_modules'], - coverage: { - thresholds: { - perFile: true, - autoUpdate: true, - 100: true, - }, - clean: true, - provider: 'istanbul', - reportsDirectory: '{{projectBuildDirectory}}/test-results/', - reporter: ['html', 'json-summary', 'text', 'text-summary', 'lcov', 'clover'], - watermarks: { - statements: [100, 100], - branches: [100, 100], - functions: [100, 100], - lines: [100, 100], - }, - }, - }, -}); diff --git a/src/main/resources/generator/dependencies/svelte/package.json b/src/main/resources/generator/dependencies/svelte/package.json index aab4855ba42..bc7933de3b3 100644 --- a/src/main/resources/generator/dependencies/svelte/package.json +++ b/src/main/resources/generator/dependencies/svelte/package.json @@ -2,30 +2,19 @@ "name": "jhipster-lite-svelte-kit", "version": "0.0.1", "type": "module", - "dependencies": { - "svelte-navigator": "3.2.2" - }, "devDependencies": { - "@babel/preset-env": "7.22.9", - "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.22.3", - "@testing-library/svelte": "4.2.3", - "@typescript-eslint/eslint-plugin": "6.0.0", - "@typescript-eslint/parser": "6.0.0", - "@vitest/coverage-istanbul": "0.33.0", - "babel-plugin-transform-vite-meta-env": "1.0.3", - "eslint": "8.44.0", - "eslint-plugin-svelte3": "4.0.0", - "jsdom": "22.1.0", - "prettier": "2.8.8", - "prettier-plugin-svelte": "2.10.1", - "svelte": "3.59.2", - "svelte-check": "3.8.4", - "svelte-preprocess": "5.0.4", - "tslib": "2.6.3", - "typescript": "5.1.6", - "vite": "4.5.3", - "vitest": "0.33.0", - "vitest-sonar-reporter": "0.5.0" + "@sveltejs/adapter-static": "3.0.5", + "@sveltejs/kit": "2.5.28", + "@sveltejs/vite-plugin-svelte": "3.1.2", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/svelte": "5.2.1", + "@testing-library/user-event": "14.5.2", + "@types/eslint": "9.6.1", + "@vitest/coverage-v8": "2.1.1", + "@vitest/ui": "2.1.1", + "eslint-plugin-svelte": "2.44.0", + "prettier-plugin-svelte": "3.2.6", + "svelte": "4.2.19", + "svelte-check": "4.0.2" } } diff --git a/src/test/features/client/svelte.feature b/src/test/features/client/svelte.feature index 1a1bcda5af9..d3e62f3e5a5 100644 --- a/src/test/features/client/svelte.feature +++ b/src/test/features/client/svelte.feature @@ -6,4 +6,8 @@ Feature: Svelte | prettier | | svelte-core | Then I should have files in "" - | tsconfig.json | + | jsconfig.json | + | vitest-setup.js | + | vite.config.js | + | svelte.config.js | + | eslint.config.js | diff --git a/src/test/java/tech/jhipster/lite/generator/client/svelte/core/domain/SvelteModuleFactoryTest.java b/src/test/java/tech/jhipster/lite/generator/client/svelte/core/domain/SvelteModuleFactoryTest.java index 1be370445a9..709114d4f94 100644 --- a/src/test/java/tech/jhipster/lite/generator/client/svelte/core/domain/SvelteModuleFactoryTest.java +++ b/src/test/java/tech/jhipster/lite/generator/client/svelte/core/domain/SvelteModuleFactoryTest.java @@ -1,6 +1,12 @@ package tech.jhipster.lite.generator.client.svelte.core.domain; -import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.*; +import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.ModuleFile; +import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.assertThatModuleWithFiles; +import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.file; +import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.lintStagedConfigFile; +import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.nodeDependency; +import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.nodeScript; +import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.packageJsonFile; import org.junit.jupiter.api.Test; import tech.jhipster.lite.TestFileUtils; @@ -21,58 +27,74 @@ void shouldCreateSvelteModule() { JHipsterModule module = factory.buildSvelteModule(properties); // @formatter:off - assertThatModuleWithFiles(module, packageJsonFile(), lintStagedConfigFile()) + assertThatModuleWithFiles(module, packageJsonFile(), lintStagedConfigFile(), prettierRcFile()) .hasFile(".gitignore") .containing(""" - # Svelte - .svelte-kit/\ + # Vite + vite.config.js.timestamp-* + # Env + .env + .env.* + !.env.test\ """) .and() .hasFile("package.json") - .containing(nodeDependency("svelte-navigator")) - .containing(nodeDependency("@babel/preset-env")) .containing(nodeDependency("@sveltejs/adapter-static")) .containing(nodeDependency("@sveltejs/kit")) + .containing(nodeDependency("@sveltejs/vite-plugin-svelte")) + .containing(nodeDependency("@testing-library/jest-dom")) .containing(nodeDependency("@testing-library/svelte")) - .containing(nodeDependency("@typescript-eslint/eslint-plugin")) - .containing(nodeDependency("@typescript-eslint/parser")) - .containing(nodeDependency("@vitest/coverage-istanbul")) - .containing(nodeDependency("babel-plugin-transform-vite-meta-env")) + .containing(nodeDependency("@testing-library/user-event")) + .containing(nodeDependency("@vitest/coverage-v8")) + .containing(nodeDependency("@vitest/ui")) + .containing(nodeDependency("@types/eslint")) .containing(nodeDependency("eslint")) .containing(nodeDependency("eslint-config-prettier")) - .containing(nodeDependency("eslint-plugin-svelte3")) + .containing(nodeDependency("eslint-plugin-svelte")) + .containing(nodeDependency("globals")) .containing(nodeDependency("jsdom")) - .containing(nodeDependency("prettier")) .containing(nodeDependency("prettier-plugin-svelte")) .containing(nodeDependency("svelte")) .containing(nodeDependency("svelte-check")) - .containing(nodeDependency("svelte-preprocess")) - .containing(nodeDependency("tslib")) .containing(nodeDependency("typescript")) .containing(nodeDependency("vite")) .containing(nodeDependency("vitest")) .containing(nodeDependency("vitest-sonar-reporter")) - .containing(nodeScript("dev", "vite dev --port 9000")) - .containing(nodeScript("start", "vite dev --port 9000")) + + .containing(nodeScript("start", "vite dev --port 9000 --open")) .containing(nodeScript("build", "vite build")) - .containing(nodeScript("package", "vite package")) .containing(nodeScript("preview", "vite preview")) - .containing(nodeScript("check", "svelte-check --tsconfig ./tsconfig.json")) - .containing(nodeScript("check:watch", "svelte-check --tsconfig ./tsconfig.json --watch")) - .containing(nodeScript("lint", "prettier --ignore-path .gitignore --check && eslint --ignore-path .gitignore .")) - .containing(nodeScript("format", "prettier --ignore-path .gitignore --write")) - .containing(nodeScript("test", "npm run test:watch")) - .containing(nodeScript("test:coverage", "vitest run --coverage")) - .containing(nodeScript("test:watch", "vitest --")) + .containing(nodeScript("check", "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json")) + .containing(nodeScript("lint", "prettier --check . && eslint .")) + .containing(nodeScript("format", "prettier --write '{,src/**/,cypress/**/}*.{md,json,js,cjs,svelte,css,html,yml}'")) + .containing(nodeScript("test", "vitest run --coverage")) + .containing(nodeScript("test:ui", "vitest --ui --coverage")) + .containing(nodeScript("test:watch", "vitest")) + .containing("\"type\": \"module\"") .and() - .hasFiles(".eslintignore", ".eslintrc.cjs", ".npmrc", "tsconfig.json", "svelte.config.js", "vite.config.js", "vitest.config.ts") - .hasPrefixedFiles("src/main/webapp", "app.html", "app.d.ts") + .hasFile(".lintstagedrc.cjs") + .containing( + """ + module.exports = { + '{src/**/,}*.{js,svelte}': ['eslint --fix', 'prettier --write', 'npm run check'], + '*.{md,json,yml,html,css,scss,java,xml,feature}': ['prettier --write'], + }; + """ + ) + .and() + .hasFiles("eslint.config.js", ".npmrc", "jsconfig.json", "svelte.config.js", "vite.config.js", "vitest-setup.js") + .hasPrefixedFiles("src/main/webapp", "app.html") .hasPrefixedFiles("src/main/webapp/routes", "+page.svelte") - .hasPrefixedFiles("src/test/webapp/unit/common/primary/app", "App.spec.ts") - .hasPrefixedFiles("src/main/webapp/app/common/primary/app", "App.svelte") - .hasPrefixedFiles("src/main/webapp/assets", "JHipster-Lite-neon-orange.png") - .hasPrefixedFiles("src/main/webapp/assets", "svelte-logo.png"); + .hasPrefixedFiles("src/main/webapp/lib/common/primary/app", "App.spec.js") + .hasPrefixedFiles("src/main/webapp/lib/common/primary/app", "App.svelte") + .hasPrefixedFiles("src/main/webapp/assets", "favicon.png") + .hasPrefixedFiles("src/main/webapp/assets/img", "jhipster-lite-neon-orange.png") + .hasPrefixedFiles("src/main/webapp/assets/img", "svelte-logo.png"); // @formatter:on } + + public static ModuleFile prettierRcFile() { + return file("src/test/resources/projects/prettier/.prettierrc", ".prettierrc"); + } } diff --git a/src/test/resources/projects/prettier/.prettierrc b/src/test/resources/projects/prettier/.prettierrc new file mode 100644 index 00000000000..6f42a651db6 --- /dev/null +++ b/src/test/resources/projects/prettier/.prettierrc @@ -0,0 +1,22 @@ +# Prettier configuration + +printWidth: 140 +singleQuote: true +tabWidth: 2 +useTabs: false +endOfLine: 'lf' + +plugins: + - '@prettier/plugin-xml' + - prettier-plugin-gherkin + - prettier-plugin-java + - prettier-plugin-packagejson + +# js and ts rules: +arrowParens: avoid + +# jsx and tsx rules: +bracketSameLine: false + +# xml rules: +xmlWhitespaceSensitivity: ignore