From 8ea1de0f2616334a11d4d24b1376ff535bc94a0b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 9 Feb 2024 22:18:36 +0100 Subject: [PATCH] add script to generate tsconfig from package.json --- .../devops/tsconfig/index.js | 67 ++++ src/Umbraco.Web.UI.Client/package.json | 3 +- src/Umbraco.Web.UI.Client/tsconfig.json | 306 +++++++++--------- 3 files changed, 223 insertions(+), 153 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/devops/tsconfig/index.js diff --git a/src/Umbraco.Web.UI.Client/devops/tsconfig/index.js b/src/Umbraco.Web.UI.Client/devops/tsconfig/index.js new file mode 100644 index 0000000000..867fae8b00 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/devops/tsconfig/index.js @@ -0,0 +1,67 @@ +import { readFileSync, writeFileSync } from 'fs'; +import { format } from 'prettier'; + +const packageJsonPath = 'package.json'; +const packageJsonData = JSON.parse(readFileSync(packageJsonPath).toString()); +const packageJsonName = packageJsonData.name; +const packageJsonExports = packageJsonData.exports; + +const tsconfigPath = 'tsconfig.json'; +const tsconfigComment = `// Don't edit this file directly. It is generated by /scripts/generate-ts-config.js\n\n`; + +const tsConfigBase = { + compilerOptions: { + module: 'esnext', + target: 'ES2020', + lib: ['es2020', 'dom', 'dom.iterable'], + outDir: './types', + allowSyntheticDefaultImports: true, + experimentalDecorators: true, + forceConsistentCasingInFileNames: true, + useDefineForClassFields: false, + baseUrl: '.', + incremental: true, + skipLibCheck: true, + /* Bundler mode */ + moduleResolution: 'bundler', + allowImportingTsExtensions: true, + resolveJsonModule: true, + isolatedModules: true, + noEmit: true, + /* Linting */ + strict: true, + noFallthroughCasesInSwitch: true, + noImplicitReturns: true, + }, + include: ['src/**/*.ts', 'apps/**/*.ts', 'e2e/**/*.ts', 'index.ts', 'storybook/stories/**/*.ts', 'examples/**/*.ts'], + references: [ + { + path: './tsconfig.node.json', + }, + ], +}; + +const paths = {}; + +// Iterate over the exports in package.json +for (const [key, value] of Object.entries(packageJsonExports || {})) { + // remove leading ./ + if (value) { + const moduleName = key.replace(/^\.\//, ''); + + // replace ./dist-cms with src and remove /index.js + const modulePath = value.replace(/^\.\/dist-cms/, 'src').replace(/\/index.js$/, ''); + const importAlias = `${packageJsonName}/${moduleName}`; + + paths[importAlias] = [modulePath]; + } +} + +tsConfigBase.compilerOptions.paths = paths; + +const content = tsconfigComment + JSON.stringify(tsConfigBase, null, ' '); +const formattedContent = await format(content, { + parser: 'json', +}); + +writeFileSync(tsconfigPath, formattedContent); diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 5182de7bcb..cf639ddffb 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -131,7 +131,8 @@ "test:watch": "web-test-runner --watch", "test": "web-test-runner --coverage", "wc-analyze:vscode": "wca **/*.element.ts --format vscode --outFile dist-cms/vscode-html-custom-data.json", - "wc-analyze": "wca **/*.element.ts --outFile dist-cms/custom-elements.json" + "wc-analyze": "wca **/*.element.ts --outFile dist-cms/custom-elements.json", + "generate:tsconfig": "node ./devops/tsconfig/index.js" }, "engines": { "node": ">=20.9 <21", diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 94b0792104..5fb6f960b1 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -1,154 +1,156 @@ { - "compilerOptions": { - "module": "esnext", - "target": "ES2020", - "lib": ["es2020", "dom", "dom.iterable"], - "outDir": "./types", - "allowSyntheticDefaultImports": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "useDefineForClassFields": false, - "baseUrl": ".", - "incremental": true, - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - - /* Linting */ - "strict": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - - "paths": { - // TODO: can we combine these of multiple tsconfigs so each package can hold their own? - // APPS - "@umbraco-cms/backoffice/app": ["src/apps/app"], - - "@umbraco-cms/backoffice/external/lit": ["src/external/lit"], - "@umbraco-cms/backoffice/external/lodash": ["src/external/lodash"], - "@umbraco-cms/backoffice/external/monaco-editor": ["src/external/monaco-editor"], - "@umbraco-cms/backoffice/external/openid": ["src/external/openid"], - "@umbraco-cms/backoffice/external/router-slot": ["src/external/router-slot"], - "@umbraco-cms/backoffice/external/rxjs": ["src/external/rxjs"], - "@umbraco-cms/backoffice/external/tinymce": ["src/external/tinymce"], - "@umbraco-cms/backoffice/external/uui": ["src/external/uui"], - "@umbraco-cms/backoffice/external/uuid": ["src/external/uuid"], - "@umbraco-cms/backoffice/external/dompurify": ["src/external/dompurify"], - "@umbraco-cms/backoffice/external/marked": ["src/external/marked"], - - "@umbraco-cms/backoffice/backend-api": ["src/external/backend-api"], - "@umbraco-cms/backoffice/class-api": ["src/libs/class-api"], - "@umbraco-cms/backoffice/context-api": ["src/libs/context-api"], - "@umbraco-cms/backoffice/controller-api": ["src/libs/controller-api"], - "@umbraco-cms/backoffice/element-api": ["src/libs/element-api"], - "@umbraco-cms/backoffice/extension-api": ["src/libs/extension-api"], - "@umbraco-cms/backoffice/localization-api": ["src/libs/localization-api"], - "@umbraco-cms/backoffice/observable-api": ["src/libs/observable-api"], - - // SHARED - "@umbraco-cms/backoffice/auth": ["src/shared/auth"], - "@umbraco-cms/backoffice/event": ["src/packages/core/event"], - "@umbraco-cms/backoffice/icon": ["src/shared/icon-registry"], - "@umbraco-cms/backoffice/models": ["src/shared/models"], - "@umbraco-cms/backoffice/resources": ["src/shared/resources"], - "@umbraco-cms/backoffice/router": ["src/shared/router"], - "@umbraco-cms/backoffice/style": ["src/shared/style"], - "@umbraco-cms/backoffice/utils": ["src/shared/utils"], - - // CORE - "@umbraco-cms/backoffice/action": ["src/packages/core/action"], - "@umbraco-cms/backoffice/collection": ["src/packages/core/collection"], - "@umbraco-cms/backoffice/components": ["src/packages/core/components"], - "@umbraco-cms/backoffice/content-type": ["src/packages/core/content-type"], - "@umbraco-cms/backoffice/debug": ["src/packages/core/debug"], - "@umbraco-cms/backoffice/entity-action": ["src/packages/core/entity-action"], - "@umbraco-cms/backoffice/entity-bulk-action": ["src/packages/core/entity-bulk-action"], - "@umbraco-cms/backoffice/extension-registry": ["src/packages/core/extension-registry"], - "@umbraco-cms/backoffice/server-file-system": ["src/packages/core/server-file-system"], - "@umbraco-cms/backoffice/id": ["src/packages/core/id"], - "@umbraco-cms/backoffice/localization": ["src/packages/core/localization"], - "@umbraco-cms/backoffice/menu": ["src/packages/core/menu"], - "@umbraco-cms/backoffice/modal": ["src/packages/core/modal"], - "@umbraco-cms/backoffice/notification": ["src/packages/core/notification"], - "@umbraco-cms/backoffice/picker-input": ["src/packages/core/picker-input"], - "@umbraco-cms/backoffice/property": ["src/packages/core/property"], - "@umbraco-cms/backoffice/property-action": ["src/packages/core/property-action"], - "@umbraco-cms/backoffice/property-editor": ["src/packages/core/property-editor"], - "@umbraco-cms/backoffice/section": ["src/packages/core/section"], - "@umbraco-cms/backoffice/sorter": ["src/packages/core/sorter"], - "@umbraco-cms/backoffice/store": ["src/packages/core/store"], - "@umbraco-cms/backoffice/themes": ["src/packages/core/themes/index.ts"], - "@umbraco-cms/backoffice/tree": ["src/packages/core/tree"], - "@umbraco-cms/backoffice/variant": ["src/packages/core/variant"], - "@umbraco-cms/backoffice/workspace": ["src/packages/core/workspace"], - "@umbraco-cms/backoffice/culture": ["src/packages/core/culture"], - "@umbraco-cms/backoffice/repository": ["src/packages/core/repository"], - "@umbraco-cms/backoffice/temporary-file": ["src/packages/core/temporary-file"], - - "@umbraco-cms/backoffice/data-type": ["./src/packages/core/data-type/index.ts"], - "@umbraco-cms/backoffice/language": ["src/packages/language/index.ts"], - "@umbraco-cms/backoffice/dynamic-root": ["./src/packages/dynamic-root/index.ts"], - "@umbraco-cms/backoffice/logviewer": ["src/packages/log-viewer/index.ts"], - "@umbraco-cms/backoffice/relation-types": ["src/packages/relations/relation-types/index.ts"], - "@umbraco-cms/backoffice/relations": ["src/packages/relations/relations/index.ts"], - "@umbraco-cms/backoffice/tags": ["./src/packages/tags/index.ts"], - "@umbraco-cms/backoffice/static-file": ["./src/packages/static-file/index.ts"], - - "@umbraco-cms/backoffice/block": ["./src/packages/block/index.ts"], - "@umbraco-cms/backoffice/audit-log": ["src/packages/audit-log/index.ts"], - "@umbraco-cms/backoffice/dictionary": ["src/packages/dictionary/index.ts"], - - // DOCUMENT MANAGEMENT - "@umbraco-cms/backoffice/document": ["./src/packages/documents/documents/index.ts"], - "@umbraco-cms/backoffice/document-blueprint": ["./src/packages/documents/document-blueprints/index.ts"], - "@umbraco-cms/backoffice/document-type": ["./src/packages/documents/document-types/index.ts"], - - // MEDIA MANAGEMENT - "@umbraco-cms/backoffice/media": ["./src/packages/media/media/index.ts"], - "@umbraco-cms/backoffice/media-type": ["./src/packages/media/media-types/index.ts"], - - // MEMBER MANAGEMENT - "@umbraco-cms/backoffice/member": ["./src/packages/members/members/index.ts"], - "@umbraco-cms/backoffice/member-group": ["./src/packages/members/member-groups/index.ts"], - "@umbraco-cms/backoffice/member-type": ["./src/packages/members/member-types/index.ts"], - - // PACKAGE MANAGEMENT - "@umbraco-cms/backoffice/package": ["./src/packages/packages/package/index.ts"], - - // USER MANAGEMENT - "@umbraco-cms/backoffice/user-group": ["src/packages/user/user-group"], - "@umbraco-cms/backoffice/current-user": ["src/packages/user/current-user"], - "@umbraco-cms/backoffice/user": ["src/packages/user/user"], - "@umbraco-cms/backoffice/user-permission": ["src/packages/user/user-permission"], - - // TEMPLATING - "@umbraco-cms/backoffice/code-editor": ["src/packages/templating/code-editor"], - "@umbraco-cms/backoffice/partial-view": ["./src/packages/templating/partial-views/index.ts"], - "@umbraco-cms/backoffice/stylesheet": ["./src/packages/templating/stylesheets/index.ts"], - "@umbraco-cms/backoffice/template": ["./src/packages/templating/templates/index.ts"], - - "@umbraco-cms/backoffice/css": ["src/shared/css/custom-properties.css"], - - "@umbraco-cms/internal/lit-element": ["src/shared/lit-element"], - "@umbraco-cms/internal/test-utils": ["utils/test-utils.ts"] - } - }, - "include": [ - "src/**/*.ts", - "apps/**/*.ts", - "e2e/**/*.ts", - "index.ts", - "storybook/stories/**/*.ts", - "examples/**/*.ts" - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] + "compilerOptions": { + "rootDir": "./", + "module": "esnext", + "target": "ES2020", + "lib": ["es2020", "dom", "dom.iterable"], + "outDir": "./types", + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "useDefineForClassFields": false, + "baseUrl": ".", + "incremental": true, + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "strict": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "paths": { + "@umbraco-cms/backoffice/app": ["src/apps/app"], + "@umbraco-cms/backoffice/class-api": ["src/libs/class-api"], + "@umbraco-cms/backoffice/context-api": ["src/libs/context-api"], + "@umbraco-cms/backoffice/controller-api": ["src/libs/controller-api"], + "@umbraco-cms/backoffice/element-api": ["src/libs/element-api"], + "@umbraco-cms/backoffice/extension-api": ["src/libs/extension-api"], + "@umbraco-cms/backoffice/localization-api": ["src/libs/localization-api"], + "@umbraco-cms/backoffice/observable-api": ["src/libs/observable-api"], + "@umbraco-cms/backoffice/auth": ["src/shared/auth"], + "@umbraco-cms/backoffice/event": ["src/packages/core/event"], + "@umbraco-cms/backoffice/icon": ["src/shared/icon"], + "@umbraco-cms/backoffice/models": ["src/shared/models"], + "@umbraco-cms/backoffice/resources": ["src/shared/resources"], + "@umbraco-cms/backoffice/router": ["src/shared/router"], + "@umbraco-cms/backoffice/style": ["src/shared/style"], + "@umbraco-cms/backoffice/utils": ["src/shared/utils"], + "@umbraco-cms/backoffice/action": ["src/packages/core/action"], + "@umbraco-cms/backoffice/collection": ["src/packages/core/collection"], + "@umbraco-cms/backoffice/components": ["src/packages/core/components"], + "@umbraco-cms/backoffice/content-type": [ + "src/packages/core/content-type" + ], + "@umbraco-cms/backoffice/culture": ["src/packages/core/culture"], + "@umbraco-cms/backoffice/data-type": ["src/packages/core/data-type"], + "@umbraco-cms/backoffice/debug": ["src/packages/core/debug"], + "@umbraco-cms/backoffice/entity-action": [ + "src/packages/core/entity-action" + ], + "@umbraco-cms/backoffice/entity-bulk-action": [ + "src/packages/core/entity-bulk-action" + ], + "@umbraco-cms/backoffice/extension-registry": [ + "src/packages/core/extension-registry" + ], + "@umbraco-cms/backoffice/server-file-system": [ + "src/packages/core/server-file-system" + ], + "@umbraco-cms/backoffice/id": ["src/packages/core/id"], + "@umbraco-cms/backoffice/localization": [ + "src/packages/core/localization" + ], + "@umbraco-cms/backoffice/menu": ["src/packages/core/menu"], + "@umbraco-cms/backoffice/modal": ["src/packages/core/modal"], + "@umbraco-cms/backoffice/notification": [ + "src/packages/core/notification" + ], + "@umbraco-cms/backoffice/picker-input": [ + "src/packages/core/picker-input" + ], + "@umbraco-cms/backoffice/property": ["src/packages/core/property"], + "@umbraco-cms/backoffice/property-action": [ + "src/packages/core/property-action" + ], + "@umbraco-cms/backoffice/property-editor": [ + "src/packages/core/property-editor" + ], + "@umbraco-cms/backoffice/section": ["src/packages/core/section"], + "@umbraco-cms/backoffice/sorter": ["src/packages/core/sorter"], + "@umbraco-cms/backoffice/store": ["src/packages/core/store"], + "@umbraco-cms/backoffice/themes": ["src/packages/core/themes"], + "@umbraco-cms/backoffice/tree": ["src/packages/core/tree"], + "@umbraco-cms/backoffice/variant": ["src/packages/core/variant"], + "@umbraco-cms/backoffice/workspace": ["src/packages/core/workspace"], + "@umbraco-cms/backoffice/repository": ["src/packages/core/repository"], + "@umbraco-cms/backoffice/temporary-file": [ + "src/packages/core/temporary-file" + ], + "@umbraco-cms/backoffice/block": ["src/packages/block"], + "@umbraco-cms/backoffice/audit-log": ["src/packages/audit-log"], + "@umbraco-cms/backoffice/dictionary": ["src/packages/dictionary"], + "@umbraco-cms/backoffice/document": ["src/packages/documents/documents"], + "@umbraco-cms/backoffice/document-blueprint": [ + "src/packages/documents/document-blueprints" + ], + "@umbraco-cms/backoffice/document-type": [ + "src/packages/documents/document-types" + ], + "@umbraco-cms/backoffice/media": ["src/packages/media/media"], + "@umbraco-cms/backoffice/media-type": ["src/packages/media/media-types"], + "@umbraco-cms/backoffice/member": ["src/packages/members/members"], + "@umbraco-cms/backoffice/member-group": [ + "src/packages/members/member-groups" + ], + "@umbraco-cms/backoffice/member-type": [ + "src/packages/members/member-types" + ], + "@umbraco-cms/backoffice/package": ["src/packages/packages/package"], + "@umbraco-cms/backoffice/language": ["src/packages/language"], + "@umbraco-cms/backoffice/dynamic-root": ["src/packages/dynamic-root"], + "@umbraco-cms/backoffice/logviewer": ["src/packages/settings/logviewer"], + "@umbraco-cms/backoffice/relation-type": [ + "src/packages/relations/relation-types" + ], + "@umbraco-cms/backoffice/relations": ["src/packages/relations/relations"], + "@umbraco-cms/backoffice/tags": ["src/packages/tags"], + "@umbraco-cms/backoffice/static-file": ["src/packages/static-file"], + "@umbraco-cms/backoffice/partial-view": [ + "src/packages/templating/partial-views" + ], + "@umbraco-cms/backoffice/stylesheet": [ + "src/packages/templating/stylesheets" + ], + "@umbraco-cms/backoffice/template": ["src/packages/templating/templates"], + "@umbraco-cms/backoffice/user-group": ["src/packages/user/user-group"], + "@umbraco-cms/backoffice/current-user": [ + "src/packages/user/current-user" + ], + "@umbraco-cms/backoffice/user": ["src/packages/user/user"], + "@umbraco-cms/backoffice/user-permission": [ + "src/packages/user/user-permission" + ], + "@umbraco-cms/backoffice/code-editor": [ + "src/packages/templating/code-editor" + ], + "@umbraco-cms/backoffice/external/*": ["src/external/*"], + "@umbraco-cms/backoffice/examples/*": ["./examples/*"], + "@umbraco-cms/backoffice/examples": ["./examples"] + } + }, + "include": [ + "src/**/*.ts", + "apps/**/*.ts", + "e2e/**/*.ts", + "index.ts", + "storybook/stories/**/*.ts", + "examples/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] }