diff --git a/docs/docs/svelte/generators.md b/docs/docs/svelte/generators.md index 90519c6d6..3853e3e3a 100644 --- a/docs/docs/svelte/generators.md +++ b/docs/docs/svelte/generators.md @@ -76,6 +76,22 @@ Type: `number` Port to listen on. +#### projectNameAndRootFormat + +Type: `string` + +Possible values: `as-provided`, `derived` + +Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`). + +#### rootProject (**hidden**) + +Default: `false` + +Type: `boolean` + +Create a application at the root of the workspace + #### skipFormat Default: `false` @@ -178,12 +194,28 @@ Possible values: `eslint` The tool to use for running lint checks. +#### projectNameAndRootFormat + +Type: `string` + +Possible values: `as-provided`, `derived` + +Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`). + #### publishable Type: `boolean` Create a publishable library. +#### simpleName + +Default: `false` + +Type: `boolean` + +Don't include the directory in the name of the module of the library. + #### skipFormat Default: `false` diff --git a/package.json b/package.json index 314b9a392..a075c83c6 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "nx-cloud": "16.4.0", "prettier": "2.7.1", "pretty-quick": "^3.1.3", - "svelte": "^3.59.1", + "svelte": "^4.2.1", "svelte-preprocess": "^5.0.4", "tcp-port-used": "^1.0.2", "ts-jest": "29.1.1", diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 971ac168e..360aa60e6 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@nxext/svelte", - "version": "16.7.1", + "version": "16.80", "license": "MIT", "author": "Dominik Pieper", "description": "Nx plugin for Svelte", diff --git a/packages/svelte/src/generators/application/application.spec.ts b/packages/svelte/src/generators/application/application.spec.ts index 526f67573..90d13c001 100644 --- a/packages/svelte/src/generators/application/application.spec.ts +++ b/packages/svelte/src/generators/application/application.spec.ts @@ -1,4 +1,4 @@ -import { SvelteApplicationSchema } from './schema'; +import { Schema } from './schema'; import { Linter } from '@nx/linter'; import applicationGenerator from './application'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; @@ -6,7 +6,7 @@ import { readJson } from '@nx/devkit'; describe('svelte app generator', () => { let tree; - const options: SvelteApplicationSchema = { + const options: Schema = { name: 'my-app', linter: Linter.EsLint, unitTestRunner: 'jest', diff --git a/packages/svelte/src/generators/application/application.ts b/packages/svelte/src/generators/application/application.ts index a0e076a0d..a68db0a4c 100644 --- a/packages/svelte/src/generators/application/application.ts +++ b/packages/svelte/src/generators/application/application.ts @@ -1,15 +1,14 @@ import { convertNxGenerator, formatFiles, - generateFiles, getWorkspaceLayout, joinPathFragments, names, - offsetFromRoot, Tree, runTasksInSerial, + GeneratorCallback, } from '@nx/devkit'; -import { NormalizedSchema, SvelteApplicationSchema } from './schema'; +import { NormalizedSchema, Schema } from './schema'; import { addProject } from './lib/add-project'; import { initGenerator } from '../init/init'; import { addLinting } from './lib/add-linting'; @@ -19,39 +18,20 @@ import { updateJestConfig } from './lib/update-jest-config'; import { addVite } from './lib/add-vite'; import { updateViteConfig } from './lib/update-vite-config'; import { createApplicationFiles } from './lib/create-project-files'; - -function normalizeOptions( - tree: Tree, - options: SvelteApplicationSchema -): NormalizedSchema { - const { appsDir } = getWorkspaceLayout(tree); - const name = names(options.name).fileName; - const projectDirectory = options.directory - ? joinPathFragments(`${names(options.directory).fileName}/${name}`) - : name; - const projectName = projectDirectory.replace(new RegExp('/', 'g'), '-'); - const fileName = projectName; - const projectRoot = joinPathFragments(`${appsDir}/${projectDirectory}`); - const parsedTags = options.tags - ? options.tags.split(',').map((s) => s.trim()) - : []; - - return { - ...options, - name: projectName, - projectRoot, - parsedTags, - fileName, - projectDirectory, - skipFormat: false, - }; -} +import { normalizeOptions } from './lib/normalize-options'; export async function applicationGenerator( host: Tree, - schema: SvelteApplicationSchema -) { - const options = normalizeOptions(host, schema); + schema: Schema +): Promise { + return await applicationGeneratorInternal(host, { + projectNameAndRootFormat: 'derived', + ...schema, + }); +} + +export async function applicationGeneratorInternal(host: Tree, schema: Schema) { + const options = await normalizeOptions(host, schema); const initTask = await initGenerator(host, { ...options, skipFormat: true }); diff --git a/packages/svelte/src/generators/application/lib/normalize-options.ts b/packages/svelte/src/generators/application/lib/normalize-options.ts new file mode 100644 index 000000000..6bb4b0763 --- /dev/null +++ b/packages/svelte/src/generators/application/lib/normalize-options.ts @@ -0,0 +1,45 @@ +import { getWorkspaceLayout, joinPathFragments, names, Tree } from '@nx/devkit'; +import { NormalizedSchema, Schema } from '../schema'; +import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; + +export async function normalizeOptions( + host: Tree, + options: Schema, + callingGenerator = '@nxext/solid:application' +): Promise { + const { + projectName: appProjectName, + projectRoot, + projectNameAndRootFormat, + } = await determineProjectNameAndRootOptions(host, { + name: options.name, + projectType: 'application', + directory: options.directory, + projectNameAndRootFormat: options.projectNameAndRootFormat, + rootProject: options.rootProject, + callingGenerator, + }); + options.rootProject = projectRoot === '.'; + options.projectNameAndRootFormat = projectNameAndRootFormat; + + const e2eProjectName = options.rootProject ? 'e2e' : `${appProjectName}-e2e`; + const e2eProjectRoot = options.rootProject ? 'e2e' : `${projectRoot}-e2e`; + + const parsedTags = options.tags + ? options.tags.split(',').map((s) => s.trim()) + : []; + + const fileName = 'App'; + + return { + ...options, + name: names(options.name).fileName, + projectName: appProjectName, + projectRoot, + e2eProjectName, + e2eProjectRoot, + parsedTags, + fileName, + skipFormat: false, + }; +} diff --git a/packages/svelte/src/generators/application/schema.d.ts b/packages/svelte/src/generators/application/schema.d.ts index cd18b0e87..a7900cdc0 100644 --- a/packages/svelte/src/generators/application/schema.d.ts +++ b/packages/svelte/src/generators/application/schema.d.ts @@ -1,20 +1,24 @@ import { Linter } from '@nx/linter'; +import { ProjectNameAndRootFormat } from '@nx/devkit/src/generators/project-name-and-root-utils'; -export interface SvelteApplicationSchema { +export interface Schema { name: string; tags?: string; - + projectNameAndRootFormat?: ProjectNameAndRootFormat; linter: Linter; unitTestRunner: 'jest' | 'vitest' | 'none'; e2eTestRunner: 'cypress' | 'none'; directory?: string; host?: string; port?: number; + rootProject?: boolean; } -export interface NormalizedSchema extends SvelteApplicationSchema { +export interface NormalizedSchema extends Schema { + projectName: string; projectRoot: string; - projectDirectory: string; + e2eProjectName: string; + e2eProjectRoot: string; fileName: string; parsedTags: string[]; skipFormat: boolean; diff --git a/packages/svelte/src/generators/application/schema.json b/packages/svelte/src/generators/application/schema.json index acf7ac37f..e03097edf 100644 --- a/packages/svelte/src/generators/application/schema.json +++ b/packages/svelte/src/generators/application/schema.json @@ -36,6 +36,11 @@ "description": "Test runner to use for end to end (e2e) tests.", "default": "cypress" }, + "projectNameAndRootFormat": { + "description": "Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`).", + "type": "string", + "enum": ["as-provided", "derived"] + }, "directory": { "type": "string", "description": "A directory where the lib is placed.", @@ -51,6 +56,12 @@ "description": "Host to listen on.", "default": "localhost" }, + "rootProject": { + "description": "Create a application at the root of the workspace", + "type": "boolean", + "default": false, + "hidden": true + }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", diff --git a/packages/svelte/src/generators/library/lib/normalize-options.ts b/packages/svelte/src/generators/library/lib/normalize-options.ts new file mode 100644 index 000000000..7245eba86 --- /dev/null +++ b/packages/svelte/src/generators/library/lib/normalize-options.ts @@ -0,0 +1,43 @@ +import { names, Tree } from '@nx/devkit'; +import { NormalizedSchema, SvelteLibrarySchema } from '../schema'; +import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; + +export async function normalizeOptions( + host: Tree, + options: SvelteLibrarySchema +): Promise { + const { + projectName, + names: projectNames, + projectRoot, + importPath, + } = await determineProjectNameAndRootOptions(host, { + name: options.name, + projectType: 'library', + directory: options.directory, + importPath: options.importPath, + projectNameAndRootFormat: options.projectNameAndRootFormat, + callingGenerator: '@nx/react:library', + }); + const name = names(options.name).fileName; + const projectDirectory = options.directory + ? `${names(options.directory).fileName}/${name}` + : name; + const fileName = options.simpleName + ? projectNames.projectSimpleName + : projectNames.projectFileName; + + const parsedTags = options.tags + ? options.tags.split(',').map((s) => s.trim()) + : []; + + return { + ...options, + name: projectName, + projectRoot, + parsedTags, + fileName, + projectDirectory, + importPath, + }; +} diff --git a/packages/svelte/src/generators/library/library.ts b/packages/svelte/src/generators/library/library.ts index fe202e5de..e55406117 100644 --- a/packages/svelte/src/generators/library/library.ts +++ b/packages/svelte/src/generators/library/library.ts @@ -5,9 +5,6 @@ import { updateTsConfig } from './lib/update-tsconfig'; import { convertNxGenerator, formatFiles, - getWorkspaceLayout, - joinPathFragments, - names, Tree, updateJson, runTasksInSerial, @@ -19,34 +16,7 @@ import { addVite } from './lib/add-vite'; import { updateViteConfig } from './lib/update-vite-config'; import { createProjectFiles } from './lib/create-project-files'; import { addVitest } from './lib/add-vitest'; - -function normalizeOptions( - tree: Tree, - options: SvelteLibrarySchema -): NormalizedSchema { - const { libsDir, npmScope } = getWorkspaceLayout(tree); - const name = names(options.name).fileName; - const projectDirectory = options.directory - ? `${names(options.directory).fileName}/${name}` - : name; - const projectName = projectDirectory.replace(new RegExp('/', 'g'), '-'); - const fileName = projectName; - const projectRoot = joinPathFragments(`${libsDir}/${projectDirectory}`); - const parsedTags = options.tags - ? options.tags.split(',').map((s) => s.trim()) - : []; - const importPath = options.importPath || `@${npmScope}/${projectDirectory}`; - - return { - ...options, - name: projectName, - projectRoot, - parsedTags, - fileName, - projectDirectory, - importPath, - }; -} +import { normalizeOptions } from './lib/normalize-options'; function updateLibPackageNpmScope(host: Tree, options: NormalizedSchema) { return updateJson(host, `${options.projectRoot}/package.json`, (json) => { @@ -59,7 +29,7 @@ export async function libraryGenerator( host: Tree, schema: SvelteLibrarySchema ) { - const options = normalizeOptions(host, schema); + const options = await normalizeOptions(host, schema); if (options.publishable === true && !schema.importPath) { throw new Error( `For publishable libs you have to provide a proper "--importPath" which needs to be a valid npm package name (e.g. my-awesome-lib or @myorg/my-lib)` diff --git a/packages/svelte/src/generators/library/schema.d.ts b/packages/svelte/src/generators/library/schema.d.ts index 3ae420779..20976c757 100644 --- a/packages/svelte/src/generators/library/schema.d.ts +++ b/packages/svelte/src/generators/library/schema.d.ts @@ -1,9 +1,10 @@ import { Linter } from '@nx/linter'; +import { ProjectNameAndRootFormat } from '@nx/devkit/src/generators/project-name-and-root-utils'; export interface SvelteLibrarySchema { name: string; tags?: string; - + projectNameAndRootFormat?: ProjectNameAndRootFormat; linter: Linter; unitTestRunner: 'jest' | 'vitest' | 'none'; e2eTestRunner: 'cypress' | 'none'; @@ -12,6 +13,7 @@ export interface SvelteLibrarySchema { publishable?: boolean; importPath?: string; skipFormat: boolean; + simpleName?: boolean; } export interface NormalizedSchema extends SvelteLibrarySchema { diff --git a/packages/svelte/src/generators/library/schema.json b/packages/svelte/src/generators/library/schema.json index 740d17153..b59dcd747 100644 --- a/packages/svelte/src/generators/library/schema.json +++ b/packages/svelte/src/generators/library/schema.json @@ -41,6 +41,11 @@ "description": "A directory where the lib is placed.", "alias": "d" }, + "projectNameAndRootFormat": { + "description": "Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`).", + "type": "string", + "enum": ["as-provided", "derived"] + }, "publishable": { "type": "boolean", "description": "Create a publishable library." @@ -54,6 +59,11 @@ "type": "string", "description": "The library name used to import it, like @myorg/my-awesome-lib" }, + "simpleName": { + "description": "Don't include the directory in the name of the module of the library.", + "type": "boolean", + "default": false + }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", diff --git a/packages/svelte/src/generators/utils/versions.ts b/packages/svelte/src/generators/utils/versions.ts index bf5ca61ae..cbaa07983 100644 --- a/packages/svelte/src/generators/utils/versions.ts +++ b/packages/svelte/src/generators/utils/versions.ts @@ -1,9 +1,9 @@ export const eslintPluginSvelteVersion = '^4.0.0'; -export const svelteVersion = '^3.59.1'; +export const svelteVersion = '^4.2.1'; export const svelteJesterVersion = '^2.3.2'; export const svelteCheckVersion = '^2.10.2'; -export const svelteLoaderVersion = '^3.1.7'; -export const sveltePreprocessVersion = '^5.0.3'; +export const svelteLoaderVersion = '^3.1.9'; +export const sveltePreprocessVersion = '^5.0.4'; export const tsconfigSvelteVersion = '^4.0.1'; export const testingLibrarySvelteVersion = '^3.2.2'; export const vitePluginSvelteVersion = '^1.0.1'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac58358f5..88e9b7c02 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,7 +144,7 @@ devDependencies: version: 2.14.0(eslint@8.46.0) eslint-plugin-svelte3: specifier: ^4.0.0 - version: 4.0.0(eslint@8.46.0)(svelte@3.59.1) + version: 4.0.0(eslint@8.46.0)(svelte@4.2.1) file-type: specifier: ^18.5.0 version: 18.5.0 @@ -203,11 +203,11 @@ devDependencies: specifier: ^3.1.3 version: 3.1.3(prettier@2.7.1) svelte: - specifier: ^3.59.1 - version: 3.59.1 + specifier: ^4.2.1 + version: 4.2.1 svelte-preprocess: specifier: ^5.0.4 - version: 5.0.4(@babel/core@7.22.10)(less@4.1.3)(postcss@8.4.28)(stylus@0.59.0)(svelte@3.59.1)(typescript@5.1.6) + version: 5.0.4(@babel/core@7.22.10)(less@4.1.3)(postcss@8.4.28)(stylus@0.59.0)(svelte@4.2.1)(typescript@5.1.6) tcp-port-used: specifier: ^1.0.2 version: 1.0.2 @@ -7627,6 +7627,13 @@ packages: } dev: true + /@types/estree@1.0.1: + resolution: + { + integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==, + } + dev: true + /@types/express-serve-static-core@4.17.28: resolution: { @@ -9247,6 +9254,15 @@ packages: } dev: true + /aria-query@5.3.0: + resolution: + { + integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==, + } + dependencies: + dequal: 2.0.3 + dev: true + /array-differ@3.0.0: resolution: { @@ -9461,6 +9477,15 @@ packages: - debug dev: true + /axobject-query@3.2.1: + resolution: + { + integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==, + } + dependencies: + dequal: 2.0.3 + dev: true + /babel-jest@29.5.0(@babel/core@7.22.10): resolution: { @@ -10486,6 +10511,19 @@ packages: engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } dev: true + /code-red@1.0.4: + resolution: + { + integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==, + } + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.1 + acorn: 8.10.0 + estree-walker: 3.0.3 + periscopic: 3.1.0 + dev: true + /collect-v8-coverage@1.0.1: resolution: { @@ -11524,6 +11562,14 @@ packages: engines: { node: '>= 0.8' } dev: true + /dequal@2.0.3: + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: '>=6' } + dev: true + /destr@2.0.1: resolution: { @@ -12212,7 +12258,7 @@ packages: globals: 13.21.0 dev: true - /eslint-plugin-svelte3@4.0.0(eslint@8.46.0)(svelte@3.59.1): + /eslint-plugin-svelte3@4.0.0(eslint@8.46.0)(svelte@4.2.1): resolution: { integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==, @@ -12222,7 +12268,7 @@ packages: svelte: ^3.2.0 dependencies: eslint: 8.46.0 - svelte: 3.59.1 + svelte: 4.2.1 dev: true /eslint-scope@5.1.1: @@ -14562,6 +14608,15 @@ packages: '@types/estree': 1.0.0 dev: true + /is-reference@3.0.2: + resolution: + { + integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==, + } + dependencies: + '@types/estree': 1.0.0 + dev: true + /is-ssh@1.4.0: resolution: { @@ -15932,6 +15987,13 @@ packages: engines: { node: '>=14' } dev: true + /locate-character@3.0.0: + resolution: + { + integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==, + } + dev: true + /locate-path@5.0.0: resolution: { @@ -17971,6 +18033,17 @@ packages: } dev: true + /periscopic@3.1.0: + resolution: + { + integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==, + } + dependencies: + '@types/estree': 1.0.0 + estree-walker: 3.0.3 + is-reference: 3.0.2 + dev: true + /picocolors@1.0.0: resolution: { @@ -20538,7 +20611,7 @@ packages: engines: { node: '>= 0.4' } dev: true - /svelte-preprocess@5.0.4(@babel/core@7.22.10)(less@4.1.3)(postcss@8.4.28)(stylus@0.59.0)(svelte@3.59.1)(typescript@5.1.6): + /svelte-preprocess@5.0.4(@babel/core@7.22.10)(less@4.1.3)(postcss@8.4.28)(stylus@0.59.0)(svelte@4.2.1)(typescript@5.1.6): resolution: { integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==, @@ -20588,16 +20661,30 @@ packages: sorcery: 0.11.0 strip-indent: 3.0.0 stylus: 0.59.0 - svelte: 3.59.1 + svelte: 4.2.1 typescript: 5.1.6 dev: true - /svelte@3.59.1: + /svelte@4.2.1: resolution: { - integrity: sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==, + integrity: sha512-LpLqY2Jr7cRxkrTc796/AaaoMLF/1ax7cto8Ot76wrvKQhrPmZ0JgajiWPmg9mTSDqO16SSLiD17r9MsvAPTmw==, } - engines: { node: '>= 8' } + engines: { node: '>=16' } + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + acorn: 8.10.0 + aria-query: 5.3.0 + axobject-query: 3.2.1 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.3 + periscopic: 3.1.0 dev: true /svg-parser@2.0.4: