@bleedingdev/modern-js-create 3.2.0-ultramodern.11 → 3.2.0-ultramodern.110

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.
Files changed (95) hide show
  1. package/README.md +158 -35
  2. package/bin/run.js +0 -0
  3. package/dist/cjs/index.cjs +1040 -0
  4. package/dist/cjs/locale/en.cjs +97 -0
  5. package/dist/cjs/locale/index.cjs +50 -0
  6. package/dist/cjs/locale/zh.cjs +97 -0
  7. package/dist/cjs/ultramodern-checks/cli/i18n-check.cjs +73 -0
  8. package/dist/cjs/ultramodern-checks/cli/oxlint.cjs +174 -0
  9. package/dist/cjs/ultramodern-checks/cli/workspace-source-check.cjs +179 -0
  10. package/dist/cjs/ultramodern-checks/index.cjs +58 -0
  11. package/dist/cjs/ultramodern-checks/oxlint-plugin.cjs +354 -0
  12. package/dist/cjs/ultramodern-package-source.cjs +133 -0
  13. package/dist/cjs/ultramodern-workspace.cjs +5616 -0
  14. package/dist/esm/index.js +1002 -0
  15. package/dist/esm/locale/en.js +59 -0
  16. package/dist/esm/locale/index.js +9 -0
  17. package/dist/esm/locale/zh.js +59 -0
  18. package/dist/esm/ultramodern-checks/cli/i18n-check.js +26 -0
  19. package/dist/esm/ultramodern-checks/cli/oxlint.js +118 -0
  20. package/dist/esm/ultramodern-checks/cli/workspace-source-check.js +124 -0
  21. package/dist/esm/ultramodern-checks/index.js +3 -0
  22. package/dist/esm/ultramodern-checks/oxlint-plugin.js +316 -0
  23. package/dist/esm/ultramodern-package-source.js +61 -0
  24. package/dist/esm/ultramodern-workspace.js +5554 -0
  25. package/dist/esm-node/index.js +1003 -0
  26. package/dist/esm-node/locale/en.js +60 -0
  27. package/dist/esm-node/locale/index.js +10 -0
  28. package/dist/esm-node/locale/zh.js +60 -0
  29. package/dist/esm-node/ultramodern-checks/cli/i18n-check.js +27 -0
  30. package/dist/esm-node/ultramodern-checks/cli/oxlint.js +119 -0
  31. package/dist/esm-node/ultramodern-checks/cli/workspace-source-check.js +125 -0
  32. package/dist/esm-node/ultramodern-checks/index.js +4 -0
  33. package/dist/esm-node/ultramodern-checks/oxlint-plugin.js +317 -0
  34. package/dist/esm-node/ultramodern-package-source.js +62 -0
  35. package/dist/esm-node/ultramodern-workspace.js +5555 -0
  36. package/dist/types/locale/en.d.ts +3 -0
  37. package/dist/types/locale/index.d.ts +117 -2
  38. package/dist/types/locale/zh.d.ts +3 -0
  39. package/dist/types/ultramodern-checks/cli/i18n-check.d.ts +9 -0
  40. package/dist/types/ultramodern-checks/cli/oxlint.d.ts +22 -0
  41. package/dist/types/ultramodern-checks/cli/workspace-source-check.d.ts +8 -0
  42. package/dist/types/ultramodern-checks/index.d.ts +3 -0
  43. package/dist/types/ultramodern-checks/oxlint-plugin.d.ts +63 -0
  44. package/dist/types/ultramodern-package-source.d.ts +28 -0
  45. package/dist/types/ultramodern-workspace.d.ts +12 -2
  46. package/package.json +52 -11
  47. package/template/.codex/hooks.json +16 -0
  48. package/template/.github/renovate.json +53 -0
  49. package/template/.github/workflows/ultramodern-gates.yml.handlebars +34 -10
  50. package/template/.mise.toml.handlebars +2 -0
  51. package/template/AGENTS.md +9 -6
  52. package/template/README.md +66 -34
  53. package/template/api/effect/index.ts.handlebars +20 -9
  54. package/template/api/lambda/hello.ts.handlebars +5 -5
  55. package/template/config/favicon.svg +5 -0
  56. package/template/config/public/assets/ultramodern-logo.svg +6 -0
  57. package/template/config/public/locales/cs/translation.json +44 -0
  58. package/template/config/public/locales/en/translation.json +44 -0
  59. package/template/lefthook.yml +10 -0
  60. package/template/modern.config.ts.handlebars +35 -3
  61. package/template/oxfmt.config.ts +8 -1
  62. package/template/oxlint.config.ts +8 -1
  63. package/template/package.json.handlebars +36 -30
  64. package/template/pnpm-workspace.yaml +34 -0
  65. package/template/rstest.config.mts +5 -0
  66. package/template/scripts/bootstrap-agent-skills.mjs +148 -15
  67. package/template/scripts/check-i18n-strings.mjs +3 -0
  68. package/template/scripts/validate-ultramodern.mjs.handlebars +494 -3
  69. package/template/src/modern-app-env.d.ts +2 -0
  70. package/template/src/modern.runtime.ts.handlebars +17 -1
  71. package/template/src/routes/[lang]/page.tsx.handlebars +209 -0
  72. package/template/src/routes/index.css.handlebars +192 -55
  73. package/template/src/routes/layout.tsx.handlebars +2 -1
  74. package/template/tailwind.config.ts.handlebars +1 -1
  75. package/template/tests/tsconfig.json +7 -0
  76. package/template/tests/ultramodern.contract.test.ts.handlebars +160 -0
  77. package/template/tsconfig.json +2 -1
  78. package/template-workspace/.agents/agent-reference-repos.json +24 -0
  79. package/template-workspace/.agents/skills-lock.json +19 -0
  80. package/template-workspace/.codex/hooks.json +16 -0
  81. package/template-workspace/.github/renovate.json +29 -0
  82. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +54 -0
  83. package/template-workspace/.gitignore.handlebars +5 -0
  84. package/template-workspace/.mise.toml.handlebars +2 -0
  85. package/template-workspace/AGENTS.md +36 -5
  86. package/template-workspace/README.md.handlebars +70 -11
  87. package/template-workspace/lefthook.yml +10 -0
  88. package/template-workspace/oxfmt.config.ts +1 -0
  89. package/template-workspace/oxlint.config.ts +1 -0
  90. package/template-workspace/pnpm-workspace.yaml +31 -8
  91. package/template-workspace/scripts/bootstrap-agent-skills.mjs +190 -21
  92. package/template-workspace/scripts/setup-agent-reference-repos.mjs +370 -0
  93. package/dist/index.js +0 -2474
  94. package/template/src/routes/page.tsx.handlebars +0 -136
  95. package/template-workspace/scripts/validate-ultramodern-workspace.mjs.handlebars +0 -405
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ const EN_LOCALE = {
31
+ prompt: {
32
+ projectName: 'Please enter project name: '
33
+ },
34
+ error: {
35
+ projectNameEmpty: 'Error: Project name cannot be empty',
36
+ directoryExists: 'Error: Directory "{projectName}" already exists and is not empty',
37
+ invalidRouter: 'Error: Unsupported router "{router}". Use "react-router" or "tanstack".',
38
+ invalidBffRuntime: 'Error: Unsupported BFF runtime "{runtime}". Use "hono" or "effect".',
39
+ createFailed: 'Error creating project:'
40
+ },
41
+ message: {
42
+ welcome: '🚀 Welcome to UltraModern.js',
43
+ success: '✨ Created successfully!',
44
+ nextSteps: '📋 Next steps:',
45
+ step1: 'cd {projectName}',
46
+ step2: 'pnpm install',
47
+ step3: 'pnpm dev'
48
+ },
49
+ help: {
50
+ title: '🚀 UltraModern.js Project Creator',
51
+ description: 'Create a new UltraModern.js app with TanStack Router and Effect BFF by default',
52
+ usage: '📖 Usage:',
53
+ usageExample: ' pnpm dlx @bleedingdev/modern-js-create [project-name] [options]',
54
+ options: '⚙️ Options:',
55
+ optionHelp: ' -h, --help Display this help message',
56
+ optionVersion: ' -v, --version Display version information',
57
+ optionLang: ' -l, --lang Set the language (zh or en)',
58
+ optionRouter: ' -r, --router Select router framework (tanstack default; react-router is compatibility mode)',
59
+ optionBff: ' --bff Keep Effect BFF enabled (default for UltraModern apps)',
60
+ optionBffRuntime: ' --bff-runtime Select BFF runtime (hono or effect)',
61
+ optionTailwind: ' --no-tailwind Disable default Tailwind CSS v4 scaffold',
62
+ optionWorkspace: ' --workspace Use workspace protocol for @modern-js dependencies (for local monorepo testing)',
63
+ optionUltramodernWorkspace: ' --ultramodern-workspace Generate an UltraModern SuperApp workspace (default is a full UltraModern single app)',
64
+ optionUltramodernPackageSource: ' --ultramodern-package-source Select UltraModern package source (workspace or install; BleedingDev defaults to install aliases)',
65
+ optionUltramodernPackageScope: ' --ultramodern-package-scope Publish scope for npm alias installs (for example bleedingdev)',
66
+ optionUltramodernPackageNamePrefix: ' --ultramodern-package-name-prefix Prefix for npm alias package names (default: modern-js-)',
67
+ optionVertical: ' --vertical Mutate the current existing UltraModern workspace and wire a MicroVertical named <project-name>',
68
+ optionSub: ' -s, --sub Mark as a subproject (package in monorepo)',
69
+ examples: '💡 Examples:',
70
+ example1: ' pnpm dlx @bleedingdev/modern-js-create my-app',
71
+ example2: ' pnpm dlx @bleedingdev/modern-js-create my-app --lang zh',
72
+ example3: ' pnpm dlx @bleedingdev/modern-js-create my-app --sub',
73
+ example4: ' pnpm dlx @bleedingdev/modern-js-create --help',
74
+ example5: ' pnpm dlx @bleedingdev/modern-js-create .',
75
+ example6: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router --no-tailwind',
76
+ example7: ' pnpm dlx @bleedingdev/modern-js-create my-app --bff-runtime hono',
77
+ example8: ' pnpm dlx @bleedingdev/modern-js-create my-app --workspace',
78
+ example9: ' pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace',
79
+ example10: ' pnpm dlx @bleedingdev/modern-js-create my-app --no-tailwind',
80
+ example11: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router # compatibility mode',
81
+ example12: ' pnpm dlx @bleedingdev/modern-js-create catalog --vertical',
82
+ moreInfo: '📚 Learn more: https://modernjs.dev'
83
+ },
84
+ version: {
85
+ message: '@bleedingdev/modern-js-create version: {version}'
86
+ }
87
+ };
88
+ __webpack_require__.d(__webpack_exports__, {}, {
89
+ EN_LOCALE: EN_LOCALE
90
+ });
91
+ exports.EN_LOCALE = __webpack_exports__.EN_LOCALE;
92
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
93
+ "EN_LOCALE"
94
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
95
+ Object.defineProperty(exports, '__esModule', {
96
+ value: true
97
+ });
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ i18n: ()=>i18n,
32
+ localeKeys: ()=>localeKeys
33
+ });
34
+ const i18n_utils_namespaceObject = require("@modern-js/i18n-utils");
35
+ const external_en_cjs_namespaceObject = require("./en.cjs");
36
+ const external_zh_cjs_namespaceObject = require("./zh.cjs");
37
+ const i18n = new i18n_utils_namespaceObject.I18n();
38
+ const localeKeys = i18n.init('en', {
39
+ zh: external_zh_cjs_namespaceObject.ZH_LOCALE,
40
+ en: external_en_cjs_namespaceObject.EN_LOCALE
41
+ });
42
+ exports.i18n = __webpack_exports__.i18n;
43
+ exports.localeKeys = __webpack_exports__.localeKeys;
44
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
45
+ "i18n",
46
+ "localeKeys"
47
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
48
+ Object.defineProperty(exports, '__esModule', {
49
+ value: true
50
+ });
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ const ZH_LOCALE = {
31
+ prompt: {
32
+ projectName: '请输入项目名称: '
33
+ },
34
+ error: {
35
+ projectNameEmpty: '错误: 项目名称不能为空',
36
+ directoryExists: '错误: 目录 "{projectName}" 已存在且不为空',
37
+ invalidRouter: '错误: 不支持的路由器 "{router}",请使用 "react-router" 或 "tanstack"',
38
+ invalidBffRuntime: '错误: 不支持的 BFF 运行时 "{runtime}",请使用 "hono" 或 "effect"',
39
+ createFailed: '创建项目时出错:'
40
+ },
41
+ message: {
42
+ welcome: '🚀 欢迎使用 UltraModern.js',
43
+ success: '✨ 创建成功!',
44
+ nextSteps: '📋 下一步:',
45
+ step1: 'cd {projectName}',
46
+ step2: 'pnpm install',
47
+ step3: 'pnpm dev'
48
+ },
49
+ help: {
50
+ title: '🚀 UltraModern.js 项目创建工具',
51
+ description: '创建默认包含 TanStack Router 和 Effect BFF 的 UltraModern.js 应用',
52
+ usage: '📖 用法:',
53
+ usageExample: ' pnpm dlx @bleedingdev/modern-js-create [项目名称] [选项]',
54
+ options: '⚙️ 选项:',
55
+ optionHelp: ' -h, --help 显示帮助信息',
56
+ optionVersion: ' -v, --version 显示版本信息',
57
+ optionLang: ' -l, --lang 设置语言 (zh 或 en)',
58
+ optionRouter: ' -r, --router 选择路由框架(默认 tanstack;react-router 为兼容模式)',
59
+ optionBff: ' --bff 保持启用 Effect BFF(UltraModern 应用默认值)',
60
+ optionBffRuntime: ' --bff-runtime 选择 BFF 运行时(hono 或 effect)',
61
+ optionTailwind: ' --no-tailwind 禁用默认 Tailwind CSS v4 模板',
62
+ optionWorkspace: ' --workspace 对 @modern-js 依赖使用 workspace 协议(用于本地 monorepo 联调)',
63
+ optionUltramodernWorkspace: ' --ultramodern-workspace 生成 UltraModern SuperApp 工作区(默认创建完整 UltraModern 单应用)',
64
+ optionUltramodernPackageSource: ' --ultramodern-package-source 选择 UltraModern 依赖来源(workspace 或 install;BleedingDev 默认使用 install alias)',
65
+ optionUltramodernPackageScope: ' --ultramodern-package-scope npm alias 安装使用的发布 scope(例如 bleedingdev)',
66
+ optionUltramodernPackageNamePrefix: ' --ultramodern-package-name-prefix npm alias 包名前缀(默认:modern-js-)',
67
+ optionVertical: ' --vertical 修改当前已有的 UltraModern 工作区,并接入名为 <项目名称> 的 MicroVertical',
68
+ optionSub: ' -s, --sub 标记为子项目(monorepo 中的子包)',
69
+ examples: '💡 示例:',
70
+ example1: ' pnpm dlx @bleedingdev/modern-js-create my-app',
71
+ example2: ' pnpm dlx @bleedingdev/modern-js-create my-app --lang zh',
72
+ example3: ' pnpm dlx @bleedingdev/modern-js-create my-app --sub',
73
+ example4: ' pnpm dlx @bleedingdev/modern-js-create --help',
74
+ example5: ' pnpm dlx @bleedingdev/modern-js-create .',
75
+ example6: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router --no-tailwind',
76
+ example7: ' pnpm dlx @bleedingdev/modern-js-create my-app --bff-runtime hono',
77
+ example8: ' pnpm dlx @bleedingdev/modern-js-create my-app --workspace',
78
+ example9: ' pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace',
79
+ example10: ' pnpm dlx @bleedingdev/modern-js-create my-app --no-tailwind',
80
+ example11: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router # 兼容模式',
81
+ example12: ' pnpm dlx @bleedingdev/modern-js-create catalog --vertical',
82
+ moreInfo: '📚 更多信息: https://modernjs.dev'
83
+ },
84
+ version: {
85
+ message: '@bleedingdev/modern-js-create 版本: {version}'
86
+ }
87
+ };
88
+ __webpack_require__.d(__webpack_exports__, {}, {
89
+ ZH_LOCALE: ZH_LOCALE
90
+ });
91
+ exports.ZH_LOCALE = __webpack_exports__.ZH_LOCALE;
92
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
93
+ "ZH_LOCALE"
94
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
95
+ Object.defineProperty(exports, '__esModule', {
96
+ value: true
97
+ });
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ SINGLE_APP_I18N_FAILURE: ()=>SINGLE_APP_I18N_FAILURE,
32
+ SINGLE_APP_I18N_SUCCESS: ()=>SINGLE_APP_I18N_SUCCESS,
33
+ main: ()=>main,
34
+ runSingleAppI18nCheck: ()=>runSingleAppI18nCheck
35
+ });
36
+ const external_oxlint_cjs_namespaceObject = require("./oxlint.cjs");
37
+ const SINGLE_APP_I18N_SUCCESS = 'No hardcoded user-visible JSX strings found.';
38
+ const SINGLE_APP_I18N_FAILURE = 'Hardcoded user-visible JSX strings found. Move copy to locale JSON files.';
39
+ const runSingleAppI18nCheck = ({ cwd = process.cwd(), targets = [
40
+ 'src'
41
+ ] } = {})=>{
42
+ const result = (0, external_oxlint_cjs_namespaceObject.runOxlintRules)({
43
+ cwd,
44
+ targets,
45
+ rules: {
46
+ 'ultramodern/no-hardcoded-jsx-text': 'error',
47
+ 'ultramodern/no-literal-visible-jsx-attributes': 'error'
48
+ }
49
+ });
50
+ if (0 === result.exitCode) {
51
+ console.log(SINGLE_APP_I18N_SUCCESS);
52
+ return 0;
53
+ }
54
+ console.error(SINGLE_APP_I18N_FAILURE);
55
+ (0, external_oxlint_cjs_namespaceObject.printOxlintOutput)(result);
56
+ return result.exitCode;
57
+ };
58
+ const main = ()=>{
59
+ process.exitCode = runSingleAppI18nCheck();
60
+ };
61
+ exports.SINGLE_APP_I18N_FAILURE = __webpack_exports__.SINGLE_APP_I18N_FAILURE;
62
+ exports.SINGLE_APP_I18N_SUCCESS = __webpack_exports__.SINGLE_APP_I18N_SUCCESS;
63
+ exports.main = __webpack_exports__.main;
64
+ exports.runSingleAppI18nCheck = __webpack_exports__.runSingleAppI18nCheck;
65
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
66
+ "SINGLE_APP_I18N_FAILURE",
67
+ "SINGLE_APP_I18N_SUCCESS",
68
+ "main",
69
+ "runSingleAppI18nCheck"
70
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
71
+ Object.defineProperty(exports, '__esModule', {
72
+ value: true
73
+ });
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ const __rslib_import_meta_url__ = /*#__PURE__*/ function() {
3
+ return "u" < typeof document ? new (require('url'.replace('', ''))).URL('file:' + __filename).href : document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href;
4
+ }();
5
+ var __webpack_require__ = {};
6
+ (()=>{
7
+ __webpack_require__.n = (module)=>{
8
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
9
+ __webpack_require__.d(getter, {
10
+ a: getter
11
+ });
12
+ return getter;
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.d = (exports1, getters, values)=>{
17
+ var define = (defs, kind)=>{
18
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
19
+ enumerable: true,
20
+ [kind]: defs[key]
21
+ });
22
+ };
23
+ define(getters, "get");
24
+ define(values, "value");
25
+ };
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
29
+ })();
30
+ (()=>{
31
+ __webpack_require__.r = (exports1)=>{
32
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
33
+ value: 'Module'
34
+ });
35
+ Object.defineProperty(exports1, '__esModule', {
36
+ value: true
37
+ });
38
+ };
39
+ })();
40
+ var __webpack_exports__ = {};
41
+ __webpack_require__.r(__webpack_exports__);
42
+ __webpack_require__.d(__webpack_exports__, {
43
+ printOxlintOutput: ()=>printOxlintOutput,
44
+ runOxlintRules: ()=>runOxlintRules
45
+ });
46
+ const external_node_child_process_namespaceObject = require("node:child_process");
47
+ const external_node_fs_namespaceObject = require("node:fs");
48
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
49
+ const external_node_module_namespaceObject = require("node:module");
50
+ const external_node_os_namespaceObject = require("node:os");
51
+ var external_node_os_default = /*#__PURE__*/ __webpack_require__.n(external_node_os_namespaceObject);
52
+ const external_node_path_namespaceObject = require("node:path");
53
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
54
+ const external_node_url_namespaceObject = require("node:url");
55
+ const oxlint_require = (0, external_node_module_namespaceObject.createRequire)(__rslib_import_meta_url__);
56
+ const ignoredDirectories = new Set([
57
+ '.modern',
58
+ '.modernjs',
59
+ '.output',
60
+ 'dist',
61
+ 'node_modules'
62
+ ]);
63
+ const packageNames = new Set([
64
+ '@modern-js/create',
65
+ '@bleedingdev/modern-js-create'
66
+ ]);
67
+ const resolveExistingPath = (candidates)=>candidates.find((candidate)=>external_node_fs_default().existsSync(candidate));
68
+ const findPackageRoot = ()=>{
69
+ let directory = external_node_path_default().dirname((0, external_node_url_namespaceObject.fileURLToPath)(__rslib_import_meta_url__));
70
+ while(directory !== external_node_path_default().dirname(directory)){
71
+ const packageJsonPath = external_node_path_default().join(directory, 'package.json');
72
+ if (external_node_fs_default().existsSync(packageJsonPath)) try {
73
+ const packageJson = JSON.parse(external_node_fs_default().readFileSync(packageJsonPath, 'utf-8'));
74
+ if (packageNames.has(packageJson.name)) return directory;
75
+ } catch {
76
+ return directory;
77
+ }
78
+ directory = external_node_path_default().dirname(directory);
79
+ }
80
+ throw new Error('Unable to resolve @modern-js/create package root.');
81
+ };
82
+ const resolvePluginPath = ()=>{
83
+ const root = findPackageRoot();
84
+ const sourcePluginPath = external_node_path_default().join(root, 'src/ultramodern-checks/oxlint-plugin.ts');
85
+ const pluginPath = resolveExistingPath([
86
+ external_node_path_default().join(root, 'dist/esm-node/ultramodern-checks/oxlint-plugin.mjs'),
87
+ external_node_path_default().join(root, 'dist/esm-node/ultramodern-checks/oxlint-plugin.js'),
88
+ external_node_path_default().join(root, 'dist/esm/ultramodern-checks/oxlint-plugin.mjs'),
89
+ external_node_path_default().join(root, 'dist/esm/ultramodern-checks/oxlint-plugin.js'),
90
+ external_node_path_default().join(root, 'dist/cjs/ultramodern-checks/oxlint-plugin.js'),
91
+ external_node_path_default().join(root, 'dist/cjs/ultramodern-checks/oxlint-plugin.cjs'),
92
+ sourcePluginPath
93
+ ]);
94
+ if (!pluginPath) throw new Error('Unable to resolve @modern-js/create UltraModern Oxlint plugin.');
95
+ return pluginPath;
96
+ };
97
+ const resolveOxlintBin = ()=>{
98
+ const packageJsonPath = oxlint_require.resolve('oxlint/package.json');
99
+ const packageJson = JSON.parse(external_node_fs_default().readFileSync(packageJsonPath, 'utf-8'));
100
+ const binRelativePath = 'string' == typeof packageJson.bin ? packageJson.bin : packageJson.bin?.oxlint;
101
+ if (!binRelativePath) throw new Error('Unable to resolve oxlint binary.');
102
+ return external_node_path_default().join(external_node_path_default().dirname(packageJsonPath), binRelativePath);
103
+ };
104
+ const existingTargets = (cwd, targets)=>targets.map((target)=>external_node_path_default().resolve(cwd, target)).filter((target)=>external_node_fs_default().existsSync(target));
105
+ const containsLintableSource = (filePath)=>{
106
+ if (!external_node_fs_default().existsSync(filePath)) return false;
107
+ const stats = external_node_fs_default().statSync(filePath);
108
+ if (stats.isFile()) return /\.(?:js|jsx|ts|tsx)$/u.test(filePath) && !filePath.endsWith('.d.ts');
109
+ if (!stats.isDirectory()) return false;
110
+ for (const entry of external_node_fs_default().readdirSync(filePath, {
111
+ withFileTypes: true
112
+ }))if (!(entry.isDirectory() && ignoredDirectories.has(entry.name))) {
113
+ if (containsLintableSource(external_node_path_default().join(filePath, entry.name))) return true;
114
+ }
115
+ return false;
116
+ };
117
+ const runOxlintRules = ({ cwd, targets, rules })=>{
118
+ const resolvedTargets = existingTargets(cwd, targets);
119
+ if (0 === resolvedTargets.length || !resolvedTargets.some((target)=>containsLintableSource(target))) return {
120
+ exitCode: 0,
121
+ stdout: '',
122
+ stderr: ''
123
+ };
124
+ const tempDir = external_node_fs_default().mkdtempSync(external_node_path_default().join(external_node_os_default().tmpdir(), 'ultramodern-oxlint-'));
125
+ const configPath = external_node_path_default().join(tempDir, 'oxlint.config.mjs');
126
+ const pluginPath = resolvePluginPath();
127
+ external_node_fs_default().writeFileSync(configPath, `export default {
128
+ jsPlugins: [${JSON.stringify(pluginPath)}],
129
+ rules: ${JSON.stringify(rules, null, 2)}
130
+ };
131
+ `, 'utf-8');
132
+ try {
133
+ const result = (0, external_node_child_process_namespaceObject.spawnSync)(process.execPath, [
134
+ resolveOxlintBin(),
135
+ ...resolvedTargets,
136
+ '--config',
137
+ configPath,
138
+ '--format',
139
+ 'unix',
140
+ '--quiet'
141
+ ], {
142
+ cwd,
143
+ encoding: 'utf-8',
144
+ stdio: [
145
+ 'ignore',
146
+ 'pipe',
147
+ 'pipe'
148
+ ]
149
+ });
150
+ return {
151
+ exitCode: result.status ?? 1,
152
+ stdout: result.stdout ?? '',
153
+ stderr: result.stderr ?? ''
154
+ };
155
+ } finally{
156
+ external_node_fs_default().rmSync(tempDir, {
157
+ recursive: true,
158
+ force: true
159
+ });
160
+ }
161
+ };
162
+ const printOxlintOutput = ({ stdout, stderr })=>{
163
+ if (stdout) process.stdout.write(stdout);
164
+ if (stderr) process.stderr.write(stderr);
165
+ };
166
+ exports.printOxlintOutput = __webpack_exports__.printOxlintOutput;
167
+ exports.runOxlintRules = __webpack_exports__.runOxlintRules;
168
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
169
+ "printOxlintOutput",
170
+ "runOxlintRules"
171
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
172
+ Object.defineProperty(exports, '__esModule', {
173
+ value: true
174
+ });
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ WORKSPACE_SOURCE_SUCCESS: ()=>WORKSPACE_SOURCE_SUCCESS,
41
+ main: ()=>main,
42
+ runWorkspaceSourceCheck: ()=>runWorkspaceSourceCheck
43
+ });
44
+ const external_node_fs_namespaceObject = require("node:fs");
45
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
46
+ const external_node_path_namespaceObject = require("node:path");
47
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
48
+ const external_oxlint_cjs_namespaceObject = require("./oxlint.cjs");
49
+ const WORKSPACE_SOURCE_SUCCESS = 'UltraModern i18n and boundary guardrails validated';
50
+ const ignoredDirectories = new Set([
51
+ '.modern',
52
+ '.modernjs',
53
+ '.output',
54
+ 'dist',
55
+ 'node_modules'
56
+ ]);
57
+ const normalizePath = (filePath)=>filePath.replaceAll('\\', '/');
58
+ const relativePath = (root, filePath)=>normalizePath(external_node_path_default().relative(root, filePath));
59
+ const walk = (directory, files = [])=>{
60
+ if (!external_node_fs_default().existsSync(directory)) return files;
61
+ for (const entry of external_node_fs_default().readdirSync(directory, {
62
+ withFileTypes: true
63
+ })){
64
+ if (entry.isDirectory() && ignoredDirectories.has(entry.name)) continue;
65
+ const entryPath = external_node_path_default().join(directory, entry.name);
66
+ if (entry.isDirectory()) {
67
+ walk(entryPath, files);
68
+ continue;
69
+ }
70
+ if (entry.isFile()) files.push(entryPath);
71
+ }
72
+ return files;
73
+ };
74
+ const isSourceFile = (filePath)=>/\.(?:ts|tsx|js|jsx)$/u.test(filePath);
75
+ const isLocaleJson = (root, filePath)=>/\/locales\/(?:en|cs)\/[^/]+\.json$/u.test(`/${relativePath(root, filePath)}`);
76
+ const readText = (filePath)=>external_node_fs_default().readFileSync(filePath, 'utf-8');
77
+ const checkRuntimeResources = (root, filePath, text)=>{
78
+ const relative = relativePath(root, filePath);
79
+ if (!relative.endsWith('/src/modern.runtime.ts')) return;
80
+ const importsLocaleResources = /import\s+csResource\s+from\s+['"]\.\.\/locales\/cs\/[^'"]+\.json['"]/u.test(text) && /import\s+enResource\s+from\s+['"]\.\.\/locales\/en\/[^'"]+\.json['"]/u.test(text);
81
+ if (!importsLocaleResources || !/initOptions\s*:\s*\{[\s\S]*?\bresources\s*,/u.test(text)) throw new Error(`${relative} must register locale JSON resources in modern.runtime.ts so Worker SSR and hydration use the same first-render translations.`);
82
+ };
83
+ const visitLocaleKeys = (value, visitor, pathParts = [])=>{
84
+ if (!value || 'object' != typeof value || Array.isArray(value)) return;
85
+ for (const [key, child] of Object.entries(value)){
86
+ const nextPath = [
87
+ ...pathParts,
88
+ key
89
+ ];
90
+ visitor(key, child, nextPath);
91
+ visitLocaleKeys(child, visitor, nextPath);
92
+ }
93
+ };
94
+ const checkPluralResources = (root, filePath, json)=>{
95
+ const relative = relativePath(root, filePath);
96
+ const language = relative.split('/locales/')[1]?.split('/')[0];
97
+ const requiredSuffixes = 'cs' === language ? [
98
+ 'one',
99
+ 'few',
100
+ 'many',
101
+ 'other'
102
+ ] : [
103
+ 'one',
104
+ 'other'
105
+ ];
106
+ const groups = new Map();
107
+ visitLocaleKeys(json, (key, value, pathParts)=>{
108
+ if ('string' != typeof value || !value.includes('{{count}}')) return;
109
+ const suffixMatch = key.match(/^(.*)_(one|few|many|other)$/u);
110
+ if (!suffixMatch) throw new Error(`${relative} key ${pathParts.join('.')} contains {{count}} but is not plural-suffixed.`);
111
+ const [, base = '', suffix = ''] = suffixMatch;
112
+ const parentPath = pathParts.slice(0, -1).join('.');
113
+ const groupKey = `${parentPath}.${base}`;
114
+ const existing = groups.get(groupKey) ?? new Set();
115
+ existing.add(suffix);
116
+ groups.set(groupKey, existing);
117
+ });
118
+ for (const [group, suffixes] of groups)for (const suffix of requiredSuffixes)if (!suffixes.has(suffix)) throw new Error(`${relative} plural group ${group} is missing _${suffix}.`);
119
+ };
120
+ const runRuntimeAndLocaleResourceChecks = (root, sourceRoots)=>{
121
+ const files = sourceRoots.flatMap((sourceRoot)=>walk(external_node_path_default().join(root, sourceRoot)));
122
+ for (const filePath of files.filter(isSourceFile))checkRuntimeResources(root, filePath, readText(filePath));
123
+ for (const filePath of files.filter((filePath)=>isLocaleJson(root, filePath)))checkPluralResources(root, filePath, JSON.parse(readText(filePath)));
124
+ };
125
+ const runWorkspaceSourceCheck = ({ cwd = process.cwd(), sourceRoots = [
126
+ 'apps',
127
+ 'verticals'
128
+ ] } = {})=>{
129
+ const oxlintResult = (0, external_oxlint_cjs_namespaceObject.runOxlintRules)({
130
+ cwd,
131
+ targets: sourceRoots,
132
+ rules: {
133
+ 'ultramodern/no-legacy-mf-boundary-attributes': 'error',
134
+ 'ultramodern/no-literal-visible-jsx-attributes': [
135
+ 'error',
136
+ {
137
+ visibleAttributes: [
138
+ 'aria-label',
139
+ "aria-description",
140
+ "aria-roledescription",
141
+ 'aria-valuetext',
142
+ 'alt',
143
+ 'label',
144
+ 'placeholder',
145
+ 'title'
146
+ ]
147
+ }
148
+ ],
149
+ 'ultramodern/no-manual-locale-copy-branching': 'error',
150
+ 'ultramodern/no-split-translation-keys': 'error'
151
+ }
152
+ });
153
+ if (0 !== oxlintResult.exitCode) {
154
+ (0, external_oxlint_cjs_namespaceObject.printOxlintOutput)(oxlintResult);
155
+ return oxlintResult.exitCode;
156
+ }
157
+ try {
158
+ runRuntimeAndLocaleResourceChecks(cwd, sourceRoots);
159
+ } catch (error) {
160
+ console.error(error instanceof Error ? error.message : 'UltraModern workspace source checks failed.');
161
+ return 1;
162
+ }
163
+ console.log(WORKSPACE_SOURCE_SUCCESS);
164
+ return 0;
165
+ };
166
+ const main = ()=>{
167
+ process.exitCode = runWorkspaceSourceCheck();
168
+ };
169
+ exports.WORKSPACE_SOURCE_SUCCESS = __webpack_exports__.WORKSPACE_SOURCE_SUCCESS;
170
+ exports.main = __webpack_exports__.main;
171
+ exports.runWorkspaceSourceCheck = __webpack_exports__.runWorkspaceSourceCheck;
172
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
173
+ "WORKSPACE_SOURCE_SUCCESS",
174
+ "main",
175
+ "runWorkspaceSourceCheck"
176
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
177
+ Object.defineProperty(exports, '__esModule', {
178
+ value: true
179
+ });