@bleedingdev/modern-js-app-tools-extensions 3.8.3-ultramodern.2

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 (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/cloudflare/artifacts.js +127 -0
  4. package/dist/cjs/cloudflare/constants.js +141 -0
  5. package/dist/cjs/cloudflare/delivery-unit.js +161 -0
  6. package/dist/cjs/cloudflare/i18n-worker.js +135 -0
  7. package/dist/cjs/cloudflare/index.js +156 -0
  8. package/dist/cjs/cloudflare/security-policies.js +205 -0
  9. package/dist/cjs/cloudflare/types.js +18 -0
  10. package/dist/cjs/cloudflare/utils.js +66 -0
  11. package/dist/cjs/cloudflare/worker-manifest.js +239 -0
  12. package/dist/cjs/cloudflare/wrangler-config.js +205 -0
  13. package/dist/cjs/cloudflare-builder.js +394 -0
  14. package/dist/cjs/cloudflare-output-contract.js +108 -0
  15. package/dist/cjs/cloudflare-output-plan.js +93 -0
  16. package/dist/cjs/cloudflare-output-verifier/identity.js +92 -0
  17. package/dist/cjs/cloudflare-output-verifier/index.js +188 -0
  18. package/dist/cjs/cloudflare-output-verifier/issues.js +54 -0
  19. package/dist/cjs/cloudflare-output-verifier/manifest.js +89 -0
  20. package/dist/cjs/cloudflare-output-verifier/mutation-policy.js +151 -0
  21. package/dist/cjs/cloudflare-output-verifier/worker-bundles.js +378 -0
  22. package/dist/cjs/config.js +18 -0
  23. package/dist/cjs/css-extract-runtime-plugin.js +74 -0
  24. package/dist/cjs/index.js +125 -0
  25. package/dist/cjs/read-template.js +56 -0
  26. package/dist/cjs/release-envelope/canonical.js +68 -0
  27. package/dist/cjs/release-envelope/framework-output.js +649 -0
  28. package/dist/cjs/release-envelope/index.js +399 -0
  29. package/dist/cjs/release-envelope/plugin.js +102 -0
  30. package/dist/cjs/release-envelope/types.js +51 -0
  31. package/dist/cjs/release-identity.js +110 -0
  32. package/dist/cjs/templates/cloudflare-entry.001-bootstrap-security.mjs +251 -0
  33. package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +191 -0
  34. package/dist/cjs/templates/cloudflare-entry.003-i18n-locales.mjs +514 -0
  35. package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +1194 -0
  36. package/dist/cjs/templates/cloudflare-entry.005-worker-dispatch.mjs +421 -0
  37. package/dist/cjs/templates/cloudflare-entry.006-fetch-handler.mjs +93 -0
  38. package/dist/cjs/templates/cloudflare-worker-fs-promises.mjs +11 -0
  39. package/dist/cjs/templates/cloudflare-worker-loadable-server.mjs +281 -0
  40. package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  41. package/dist/cjs/templates/cloudflare-worker-path.mjs +98 -0
  42. package/dist/esm/cloudflare/artifacts.mjs +64 -0
  43. package/dist/esm/cloudflare/constants.mjs +34 -0
  44. package/dist/esm/cloudflare/delivery-unit.mjs +110 -0
  45. package/dist/esm/cloudflare/i18n-worker.mjs +97 -0
  46. package/dist/esm/cloudflare/index.mjs +108 -0
  47. package/dist/esm/cloudflare/security-policies.mjs +167 -0
  48. package/dist/esm/cloudflare/types.mjs +0 -0
  49. package/dist/esm/cloudflare/utils.mjs +12 -0
  50. package/dist/esm/cloudflare/worker-manifest.mjs +179 -0
  51. package/dist/esm/cloudflare/wrangler-config.mjs +151 -0
  52. package/dist/esm/cloudflare-builder.mjs +327 -0
  53. package/dist/esm/cloudflare-output-contract.mjs +31 -0
  54. package/dist/esm/cloudflare-output-plan.mjs +45 -0
  55. package/dist/esm/cloudflare-output-verifier/identity.mjs +54 -0
  56. package/dist/esm/cloudflare-output-verifier/index.mjs +133 -0
  57. package/dist/esm/cloudflare-output-verifier/issues.mjs +10 -0
  58. package/dist/esm/cloudflare-output-verifier/manifest.mjs +51 -0
  59. package/dist/esm/cloudflare-output-verifier/mutation-policy.mjs +99 -0
  60. package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +313 -0
  61. package/dist/esm/config.mjs +0 -0
  62. package/dist/esm/css-extract-runtime-plugin.mjs +32 -0
  63. package/dist/esm/index.mjs +10 -0
  64. package/dist/esm/read-template.mjs +5 -0
  65. package/dist/esm/release-envelope/canonical.mjs +21 -0
  66. package/dist/esm/release-envelope/framework-output.mjs +573 -0
  67. package/dist/esm/release-envelope/index.mjs +335 -0
  68. package/dist/esm/release-envelope/plugin.mjs +54 -0
  69. package/dist/esm/release-envelope/types.mjs +7 -0
  70. package/dist/esm/release-identity.mjs +66 -0
  71. package/dist/esm/templates/cloudflare-entry.001-bootstrap-security.mjs +251 -0
  72. package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +191 -0
  73. package/dist/esm/templates/cloudflare-entry.003-i18n-locales.mjs +514 -0
  74. package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +1194 -0
  75. package/dist/esm/templates/cloudflare-entry.005-worker-dispatch.mjs +421 -0
  76. package/dist/esm/templates/cloudflare-entry.006-fetch-handler.mjs +93 -0
  77. package/dist/esm/templates/cloudflare-worker-fs-promises.mjs +11 -0
  78. package/dist/esm/templates/cloudflare-worker-loadable-server.mjs +281 -0
  79. package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  80. package/dist/esm/templates/cloudflare-worker-path.mjs +98 -0
  81. package/dist/esm-node/cloudflare/artifacts.mjs +65 -0
  82. package/dist/esm-node/cloudflare/constants.mjs +35 -0
  83. package/dist/esm-node/cloudflare/delivery-unit.mjs +111 -0
  84. package/dist/esm-node/cloudflare/i18n-worker.mjs +98 -0
  85. package/dist/esm-node/cloudflare/index.mjs +109 -0
  86. package/dist/esm-node/cloudflare/security-policies.mjs +168 -0
  87. package/dist/esm-node/cloudflare/types.mjs +1 -0
  88. package/dist/esm-node/cloudflare/utils.mjs +13 -0
  89. package/dist/esm-node/cloudflare/worker-manifest.mjs +180 -0
  90. package/dist/esm-node/cloudflare/wrangler-config.mjs +152 -0
  91. package/dist/esm-node/cloudflare-builder.mjs +328 -0
  92. package/dist/esm-node/cloudflare-output-contract.mjs +32 -0
  93. package/dist/esm-node/cloudflare-output-plan.mjs +46 -0
  94. package/dist/esm-node/cloudflare-output-verifier/identity.mjs +55 -0
  95. package/dist/esm-node/cloudflare-output-verifier/index.mjs +134 -0
  96. package/dist/esm-node/cloudflare-output-verifier/issues.mjs +11 -0
  97. package/dist/esm-node/cloudflare-output-verifier/manifest.mjs +52 -0
  98. package/dist/esm-node/cloudflare-output-verifier/mutation-policy.mjs +100 -0
  99. package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +314 -0
  100. package/dist/esm-node/config.mjs +1 -0
  101. package/dist/esm-node/css-extract-runtime-plugin.mjs +33 -0
  102. package/dist/esm-node/index.mjs +11 -0
  103. package/dist/esm-node/read-template.mjs +9 -0
  104. package/dist/esm-node/release-envelope/canonical.mjs +22 -0
  105. package/dist/esm-node/release-envelope/framework-output.mjs +574 -0
  106. package/dist/esm-node/release-envelope/index.mjs +336 -0
  107. package/dist/esm-node/release-envelope/plugin.mjs +55 -0
  108. package/dist/esm-node/release-envelope/types.mjs +8 -0
  109. package/dist/esm-node/release-identity.mjs +67 -0
  110. package/dist/esm-node/templates/cloudflare-entry.001-bootstrap-security.mjs +251 -0
  111. package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +191 -0
  112. package/dist/esm-node/templates/cloudflare-entry.003-i18n-locales.mjs +514 -0
  113. package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +1194 -0
  114. package/dist/esm-node/templates/cloudflare-entry.005-worker-dispatch.mjs +421 -0
  115. package/dist/esm-node/templates/cloudflare-entry.006-fetch-handler.mjs +93 -0
  116. package/dist/esm-node/templates/cloudflare-worker-fs-promises.mjs +11 -0
  117. package/dist/esm-node/templates/cloudflare-worker-loadable-server.mjs +281 -0
  118. package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  119. package/dist/esm-node/templates/cloudflare-worker-path.mjs +98 -0
  120. package/dist/types/cloudflare/artifacts.d.ts +15 -0
  121. package/dist/types/cloudflare/constants.d.ts +24 -0
  122. package/dist/types/cloudflare/delivery-unit.d.ts +23 -0
  123. package/dist/types/cloudflare/i18n-worker.d.ts +22 -0
  124. package/dist/types/cloudflare/index.d.ts +2 -0
  125. package/dist/types/cloudflare/security-policies.d.ts +52 -0
  126. package/dist/types/cloudflare/types.d.ts +28 -0
  127. package/dist/types/cloudflare/utils.d.ts +6 -0
  128. package/dist/types/cloudflare/worker-manifest.d.ts +149 -0
  129. package/dist/types/cloudflare/wrangler-config.d.ts +51 -0
  130. package/dist/types/cloudflare-builder.d.ts +59 -0
  131. package/dist/types/cloudflare-output-contract.d.ts +14 -0
  132. package/dist/types/cloudflare-output-plan.d.ts +34 -0
  133. package/dist/types/cloudflare-output-verifier/identity.d.ts +8 -0
  134. package/dist/types/cloudflare-output-verifier/index.d.ts +18 -0
  135. package/dist/types/cloudflare-output-verifier/issues.d.ts +14 -0
  136. package/dist/types/cloudflare-output-verifier/manifest.d.ts +2 -0
  137. package/dist/types/cloudflare-output-verifier/mutation-policy.d.ts +14 -0
  138. package/dist/types/cloudflare-output-verifier/worker-bundles.d.ts +20 -0
  139. package/dist/types/config.d.ts +175 -0
  140. package/dist/types/css-extract-runtime-plugin.d.ts +6 -0
  141. package/dist/types/index.d.ts +10 -0
  142. package/dist/types/read-template.d.ts +2 -0
  143. package/dist/types/release-envelope/canonical.d.ts +5 -0
  144. package/dist/types/release-envelope/framework-output.d.ts +32 -0
  145. package/dist/types/release-envelope/index.d.ts +6 -0
  146. package/dist/types/release-envelope/plugin.d.ts +30 -0
  147. package/dist/types/release-envelope/types.d.ts +62 -0
  148. package/dist/types/release-identity.d.ts +16 -0
  149. package/dist/types/templates/cloudflare-entry.001-bootstrap-security.d.mts +1 -0
  150. package/dist/types/templates/cloudflare-entry.002-assets-routes.d.mts +1 -0
  151. package/dist/types/templates/cloudflare-entry.003-i18n-locales.d.mts +1 -0
  152. package/dist/types/templates/cloudflare-entry.004-rendering-css.d.mts +1 -0
  153. package/dist/types/templates/cloudflare-entry.005-worker-dispatch.d.mts +1 -0
  154. package/dist/types/templates/cloudflare-entry.006-fetch-handler.d.mts +4 -0
  155. package/dist/types/templates/cloudflare-worker-fs-promises.d.mts +5 -0
  156. package/dist/types/templates/cloudflare-worker-loadable-server.d.mts +48 -0
  157. package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +13 -0
  158. package/dist/types/templates/cloudflare-worker-path.d.mts +21 -0
  159. package/package.json +131 -0
  160. package/src/cloudflare/artifacts.ts +165 -0
  161. package/src/cloudflare/constants.ts +50 -0
  162. package/src/cloudflare/delivery-unit.ts +195 -0
  163. package/src/cloudflare/i18n-worker.ts +197 -0
  164. package/src/cloudflare/index.ts +259 -0
  165. package/src/cloudflare/security-policies.ts +194 -0
  166. package/src/cloudflare/types.ts +33 -0
  167. package/src/cloudflare/utils.ts +40 -0
  168. package/src/cloudflare/worker-manifest.ts +313 -0
  169. package/src/cloudflare/wrangler-config.ts +338 -0
  170. package/src/cloudflare-builder.ts +653 -0
  171. package/src/cloudflare-output-contract.ts +30 -0
  172. package/src/cloudflare-output-plan.ts +108 -0
  173. package/src/cloudflare-output-verifier/identity.ts +87 -0
  174. package/src/cloudflare-output-verifier/index.ts +277 -0
  175. package/src/cloudflare-output-verifier/issues.ts +54 -0
  176. package/src/cloudflare-output-verifier/manifest.ts +76 -0
  177. package/src/cloudflare-output-verifier/mutation-policy.ts +159 -0
  178. package/src/cloudflare-output-verifier/worker-bundles.ts +664 -0
  179. package/src/config.ts +196 -0
  180. package/src/css-extract-runtime-plugin.ts +70 -0
  181. package/src/index.ts +10 -0
  182. package/src/read-template.ts +8 -0
  183. package/src/release-envelope/canonical.ts +58 -0
  184. package/src/release-envelope/framework-output.ts +1121 -0
  185. package/src/release-envelope/index.ts +656 -0
  186. package/src/release-envelope/plugin.ts +125 -0
  187. package/src/release-envelope/types.ts +83 -0
  188. package/src/release-identity.ts +134 -0
  189. package/src/templates/cloudflare-entry.001-bootstrap-security.mjs +251 -0
  190. package/src/templates/cloudflare-entry.002-assets-routes.mjs +191 -0
  191. package/src/templates/cloudflare-entry.003-i18n-locales.mjs +514 -0
  192. package/src/templates/cloudflare-entry.004-rendering-css.mjs +1194 -0
  193. package/src/templates/cloudflare-entry.005-worker-dispatch.mjs +421 -0
  194. package/src/templates/cloudflare-entry.006-fetch-handler.mjs +93 -0
  195. package/src/templates/cloudflare-worker-fs-promises.mjs +11 -0
  196. package/src/templates/cloudflare-worker-loadable-server.mjs +281 -0
  197. package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  198. package/src/templates/cloudflare-worker-path.mjs +98 -0
package/src/config.ts ADDED
@@ -0,0 +1,196 @@
1
+ export type DeployTarget =
2
+ | 'node'
3
+ | 'vercel'
4
+ | 'netlify'
5
+ | 'ghPages'
6
+ | 'cloudflare';
7
+
8
+ export type CloudflareWorkerSecurityCspMode = 'enforce' | 'report-only' | 'off';
9
+
10
+ export type JsonValue =
11
+ | string
12
+ | number
13
+ | boolean
14
+ | null
15
+ | JsonValue[]
16
+ | { [key: string]: JsonValue };
17
+
18
+ export interface CloudflareWorkerArtifactConfig {
19
+ /**
20
+ * Source file or directory, relative to the app root, to copy into
21
+ * `.output` after framework output has been staged.
22
+ */
23
+ from: string;
24
+ /**
25
+ * Destination path relative to `.output`.
26
+ */
27
+ to: string;
28
+ }
29
+
30
+ export interface CloudflareWorkerPublicAssetConfig {
31
+ /**
32
+ * Source file or directory, relative to the app root, to copy into
33
+ * Cloudflare Worker Static Assets.
34
+ */
35
+ from: string;
36
+ /**
37
+ * Destination path relative to `.output/public`.
38
+ */
39
+ to: string;
40
+ }
41
+
42
+ export interface CloudflareWorkerD1DatabaseConfig {
43
+ /**
44
+ * Worker binding name, for example `DB`.
45
+ */
46
+ binding: string;
47
+ /**
48
+ * Cloudflare D1 database name.
49
+ */
50
+ databaseName: string;
51
+ /**
52
+ * Cloudflare D1 database id.
53
+ */
54
+ databaseId: string;
55
+ /**
56
+ * Optional local migrations directory, relative to the app root. When set,
57
+ * Modern.js stages it into `.output` and points Wrangler at the staged copy.
58
+ */
59
+ migrationsDir?: string;
60
+ /**
61
+ * Optional preview database id used by Wrangler preview/local flows.
62
+ */
63
+ previewDatabaseId?: string;
64
+ /**
65
+ * Wrangler remote flag for D1 commands.
66
+ */
67
+ remote?: boolean;
68
+ }
69
+
70
+ export interface CloudflareWorkerServiceBindingConfig {
71
+ /** Worker binding name exposed on the module worker `env` object. */
72
+ binding: string;
73
+ /** Target Cloudflare Worker service name. */
74
+ service: string;
75
+ /**
76
+ * Optional application path prefix that Modern.js should dispatch to this
77
+ * service binding with `env[binding].fetch(request)`.
78
+ */
79
+ prefix?: string;
80
+ /**
81
+ * Server-rendered Module Federation fragments exposed by this Worker.
82
+ * These fields are written to the Modern.js worker manifest, but stripped
83
+ * from Wrangler's `services` entries.
84
+ */
85
+ fragments?: CloudflareWorkerServiceBindingFragmentConfig[];
86
+ }
87
+
88
+ export interface CloudflareWorkerServiceBindingFragmentConfig {
89
+ /** Stable remote id used by the shell's composition contract. */
90
+ remote: string;
91
+ /** Module Federation expose rendered by the fragment route. */
92
+ expose: string;
93
+ /** Expected boundary marker in the rendered fragment HTML. */
94
+ boundaryId: string;
95
+ /**
96
+ * Route path on the bound Worker. `{locale}` is replaced with the first
97
+ * locale segment from the incoming shell request.
98
+ */
99
+ path: string;
100
+ }
101
+
102
+ export interface CloudflareWorkerSecurityCspConfig {
103
+ mode?: CloudflareWorkerSecurityCspMode;
104
+ directives?: Record<string, string[] | string | false>;
105
+ additionalScriptSrc?: string[];
106
+ additionalStyleSrc?: string[];
107
+ additionalConnectSrc?: string[];
108
+ additionalImgSrc?: string[];
109
+ frameAncestors?: string[] | false;
110
+ reportUri?: string;
111
+ reason?: string;
112
+ }
113
+
114
+ export interface CloudflareWorkerSecurityNoindexConfig {
115
+ workersDev?: boolean;
116
+ localhost?: boolean;
117
+ previewHostnames?: string[];
118
+ reason?: string;
119
+ }
120
+
121
+ export interface CloudflareWorkerSecurityCorsConfig {
122
+ /**
123
+ * Origins allowed to read application responses (BFF APIs, SSR HTML,
124
+ * route fallbacks) cross-origin. Accepts exact origins
125
+ * (e.g. `https://shell.example.com`) or `'*'`.
126
+ * When empty, application responses carry no CORS headers (same-origin).
127
+ * @default []
128
+ */
129
+ allowedOrigins?: string[];
130
+ /**
131
+ * Methods advertised on CORS preflight responses for application routes.
132
+ * @default ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']
133
+ */
134
+ allowedMethods?: string[];
135
+ /**
136
+ * Headers advertised on CORS preflight responses for application routes.
137
+ * @default ['*']
138
+ */
139
+ allowedHeaders?: string[];
140
+ /**
141
+ * Apply wildcard CORS to static asset responses so federated remotes
142
+ * (remote entries, manifests, CSS) can be loaded cross-origin.
143
+ * @default true
144
+ */
145
+ assets?: boolean;
146
+ reason?: string;
147
+ }
148
+
149
+ export interface CloudflareWorkerSecurityConfig {
150
+ /**
151
+ * Disable all Cloudflare worker security defaults for this app.
152
+ * Prefer narrower escape hatches when possible.
153
+ */
154
+ enabled?: boolean;
155
+ headers?: {
156
+ referrerPolicy?: string | false;
157
+ contentTypeOptions?: 'nosniff' | false;
158
+ permissionsPolicy?: string | false;
159
+ };
160
+ contentSecurityPolicy?: CloudflareWorkerSecurityCspConfig;
161
+ noindex?: boolean | CloudflareWorkerSecurityNoindexConfig;
162
+ /**
163
+ * Cross-origin resource sharing policy applied by the generated worker.
164
+ * Asset responses default to wildcard CORS for federated loading;
165
+ * application responses (BFF, SSR) default to no CORS headers.
166
+ */
167
+ cors?: CloudflareWorkerSecurityCorsConfig;
168
+ /**
169
+ * @deprecated Write-only: this option never had any runtime effect — the
170
+ * generated worker never mutates application `Set-Cookie` headers.
171
+ * Kept temporarily so configs emitted by existing `modern create`
172
+ * templates keep typechecking; will be removed once the generator stops
173
+ * emitting it. Use {@link CloudflareWorkerSecurityConfig.cors} for the
174
+ * worker's cross-origin policy.
175
+ */
176
+ cookies?: {
177
+ mutateSetCookie?: false;
178
+ reason?: string;
179
+ };
180
+ reason?: string;
181
+ }
182
+
183
+ export interface CloudflareDeployConfig {
184
+ worker?: {
185
+ name?: string;
186
+ compatibilityDate?: string;
187
+ ssr?: boolean;
188
+ security?: CloudflareWorkerSecurityConfig;
189
+ wrangler?: Record<string, JsonValue>;
190
+ artifacts?: CloudflareWorkerArtifactConfig[];
191
+ publicAssets?: CloudflareWorkerPublicAssetConfig[];
192
+ d1Databases?: CloudflareWorkerD1DatabaseConfig[];
193
+ services?: CloudflareWorkerServiceBindingConfig[];
194
+ publicAssetExcludes?: string[];
195
+ };
196
+ }
@@ -0,0 +1,70 @@
1
+ import type { Rspack } from '@rsbuild/core';
2
+
3
+ const PLUGIN_NAME = 'ModernjsCssExtractRuntimePlugin';
4
+ const CSS_LOADING_RUNTIME_MODULE = 'webpack/runtime/css loading';
5
+ const CSS_EXTRACT_STYLESHEET_MATCH =
6
+ '\t\tif (tag.rel === "stylesheet" && (dataHref === href || dataHref === fullhref)) return tag;';
7
+ const CSS_EXTRACT_STYLESHEET_MATCH_WITH_NORMALIZED_URL = `\t\tvar absoluteHref = tag.href;
8
+ \t\tvar absoluteFullHref = new URL(fullhref, document.baseURI).href;
9
+ \t\tif (tag.rel === "stylesheet" && (dataHref === href || dataHref === fullhref || absoluteHref === absoluteFullHref)) return tag;`;
10
+
11
+ const isAutomaticPublicPath = (publicPath: unknown) =>
12
+ publicPath === 'auto' || publicPath === 'auto/';
13
+
14
+ export const normalizeCssExtractRuntimeStylesheetLookup = (
15
+ source: string,
16
+ ): string => {
17
+ // CssExtractRspackPlugin concatenates automatic public paths and CSS asset
18
+ // names as strings. A path such as `/static/js/../../static/css/lazy.css`
19
+ // is browser-equivalent to the SSR link `/static/css/lazy.css`, but its
20
+ // runtime lookup compares the two raw strings and inserts a duplicate link.
21
+ // Compare the complete resolved URLs as well, while preserving the upstream
22
+ // raw `data-href` and `href` matching behaviour. Query strings remain part
23
+ // of canonical identity so a newly versioned stylesheet is never suppressed.
24
+ if (!source.includes('__webpack_require__.miniCssF')) {
25
+ return source;
26
+ }
27
+
28
+ const occurrences = source.split(CSS_EXTRACT_STYLESHEET_MATCH).length - 1;
29
+ if (occurrences !== 1) {
30
+ throw new Error(
31
+ `Unsupported CssExtractRspackPlugin runtime shape: expected one stylesheet lookup, found ${occurrences}.`,
32
+ );
33
+ }
34
+
35
+ return source.replace(
36
+ CSS_EXTRACT_STYLESHEET_MATCH,
37
+ CSS_EXTRACT_STYLESHEET_MATCH_WITH_NORMALIZED_URL,
38
+ );
39
+ };
40
+
41
+ export class CssExtractRuntimePlugin {
42
+ readonly name = PLUGIN_NAME;
43
+
44
+ apply(compiler: Rspack.Compiler) {
45
+ if (!isAutomaticPublicPath(compiler.options.output.publicPath)) {
46
+ return;
47
+ }
48
+
49
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
50
+ compilation.hooks.runtimeModule.tap(PLUGIN_NAME, runtimeModule => {
51
+ if (runtimeModule.identifier() !== CSS_LOADING_RUNTIME_MODULE) {
52
+ return;
53
+ }
54
+
55
+ const source = runtimeModule.source;
56
+ if (!source) {
57
+ return;
58
+ }
59
+
60
+ const runtimeSource = source.source;
61
+ if (typeof runtimeSource !== 'string') {
62
+ return;
63
+ }
64
+
65
+ source.source =
66
+ normalizeCssExtractRuntimeStylesheetLookup(runtimeSource);
67
+ });
68
+ });
69
+ }
70
+ }
package/src/index.ts ADDED
@@ -0,0 +1,10 @@
1
+ export * from './cloudflare';
2
+ export * from './cloudflare-builder';
3
+ export * from './cloudflare-output-contract';
4
+ export * from './cloudflare-output-plan';
5
+ export * from './cloudflare-output-verifier';
6
+ export * from './config';
7
+ export * from './css-extract-runtime-plugin';
8
+ export * from './release-envelope';
9
+ export * from './release-envelope/plugin';
10
+ export * from './release-identity';
@@ -0,0 +1,8 @@
1
+ import path from 'node:path';
2
+ import { fs as fse } from '@modern-js/utils';
3
+
4
+ export const getTemplatePath = (file: string) =>
5
+ path.join(__dirname, 'templates', file);
6
+
7
+ export const readTemplate = async (file: string) =>
8
+ (await fse.readFile(getTemplatePath(file))).toString();
@@ -0,0 +1,58 @@
1
+ import { createHash } from 'node:crypto';
2
+ import type {
3
+ MicroVerticalReleaseEnvelope,
4
+ MicroVerticalReleaseEnvelopePayload,
5
+ } from './types';
6
+
7
+ type CanonicalValue =
8
+ | null
9
+ | boolean
10
+ | number
11
+ | string
12
+ | CanonicalValue[]
13
+ | { [key: string]: CanonicalValue };
14
+
15
+ const serializeCanonicalValue = (value: CanonicalValue): string => {
16
+ if (value === null || typeof value !== 'object') {
17
+ if (typeof value === 'number' && !Number.isFinite(value)) {
18
+ throw new Error('Canonical release-envelope values must be finite.');
19
+ }
20
+ return JSON.stringify(value);
21
+ }
22
+ if (Array.isArray(value)) {
23
+ return `[${value.map(serializeCanonicalValue).join(',')}]`;
24
+ }
25
+ return `{${Object.keys(value)
26
+ .sort()
27
+ .map(
28
+ key =>
29
+ `${JSON.stringify(key)}:${serializeCanonicalValue(value[key] as CanonicalValue)}`,
30
+ )
31
+ .join(',')}}`;
32
+ };
33
+
34
+ export const releaseEnvelopePayload = (
35
+ envelope: MicroVerticalReleaseEnvelope,
36
+ ): MicroVerticalReleaseEnvelopePayload => ({
37
+ schemaVersion: envelope.schemaVersion,
38
+ kind: envelope.kind,
39
+ target: envelope.target,
40
+ identity: envelope.identity,
41
+ artifacts: envelope.artifacts,
42
+ surfaces: envelope.surfaces,
43
+ });
44
+
45
+ export const canonicalSerializeMicroVerticalReleaseEnvelopePayload = (
46
+ payload: MicroVerticalReleaseEnvelopePayload,
47
+ ) => serializeCanonicalValue(payload as unknown as CanonicalValue);
48
+
49
+ export const canonicalSerializeMicroVerticalReleaseEnvelope = (
50
+ envelope: MicroVerticalReleaseEnvelope,
51
+ ) => serializeCanonicalValue(envelope as unknown as CanonicalValue);
52
+
53
+ export const digestMicroVerticalReleaseEnvelopePayload = (
54
+ payload: MicroVerticalReleaseEnvelopePayload,
55
+ ) =>
56
+ createHash('sha256')
57
+ .update(canonicalSerializeMicroVerticalReleaseEnvelopePayload(payload))
58
+ .digest('hex');