@atlaspack/transformer-html 2.14.5-canary.36 → 2.14.5-canary.360

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.
@@ -1,9 +1,8 @@
1
- // @flow
2
-
3
1
  import {Transformer} from '@atlaspack/plugin';
4
2
  import type {AST, Transformer as TransformerOpts} from '@atlaspack/types';
5
3
  import {parser as parse} from 'posthtml-parser';
6
4
  import nullthrows from 'nullthrows';
5
+ // @ts-expect-error TS2305
7
6
  import type {PostHTMLExpression, PostHTMLNode} from 'posthtml';
8
7
  import PostHTML from 'posthtml';
9
8
  import {render} from 'posthtml-render';
@@ -25,7 +24,7 @@ export function parseHTML(code: string, xmlMode: boolean): AST {
25
24
  };
26
25
  }
27
26
 
28
- export const transformerOpts: TransformerOpts<void> = {
27
+ export const transformerOpts: TransformerOpts<undefined> = {
29
28
  canReuseAST({ast}) {
30
29
  return ast.type === 'posthtml' && semver.satisfies(ast.version, '^0.4.0');
31
30
  },
@@ -46,7 +45,7 @@ export const transformerOpts: TransformerOpts<void> = {
46
45
  let hasModuleScripts;
47
46
  try {
48
47
  hasModuleScripts = collectDependencies(asset, ast);
49
- } catch (errors) {
48
+ } catch (errors: any) {
50
49
  if (Array.isArray(errors)) {
51
50
  throw new ThrowableDiagnostic({
52
51
  diagnostic: errors.map((error) => ({
@@ -81,7 +80,7 @@ export const transformerOpts: TransformerOpts<void> = {
81
80
  }),
82
81
  },
83
82
  content: [],
84
- };
83
+ } as const;
85
84
 
86
85
  const found = findFirstMatch(ast, [{tag: 'body'}, {tag: 'html'}]);
87
86
 
@@ -108,20 +107,23 @@ export const transformerOpts: TransformerOpts<void> = {
108
107
  generate({ast, asset}) {
109
108
  return {
110
109
  content: render(ast.program, {
110
+ // @ts-expect-error TS2322
111
111
  closingSingleTag: asset.type === 'xhtml' ? 'slash' : undefined,
112
112
  }),
113
113
  };
114
114
  },
115
115
  };
116
- export default (new Transformer(transformerOpts): Transformer);
116
+
117
+ export default new Transformer(transformerOpts) as Transformer<undefined>;
117
118
 
118
119
  function findFirstMatch(
119
120
  ast: AST,
120
121
  expressions: PostHTMLExpression[],
121
- ): ?PostHTMLNode {
122
+ ): PostHTMLNode | null | undefined {
122
123
  let found;
123
124
 
124
125
  for (const expression of expressions) {
126
+ // @ts-expect-error TS2339
125
127
  PostHTML().match.call(ast.program, expression, (node) => {
126
128
  found = node;
127
129
  return node;
@@ -1,6 +1,5 @@
1
- // @flow
2
-
3
1
  import type {AST, MutableAsset, FilePath} from '@atlaspack/types';
2
+ // @ts-expect-error TS2724
4
3
  import type {PostHTMLNode} from 'posthtml';
5
4
  import PostHTML from 'posthtml';
6
5
  import {parse, stringify} from 'srcset';
@@ -26,7 +25,7 @@ const ATTRS = {
26
25
  'xlink:href': ['use', 'image', 'script'],
27
26
  content: ['meta'],
28
27
  data: ['object'],
29
- };
28
+ } as const;
30
29
 
31
30
  // A list of metadata that should produce a dependency
32
31
  // Based on:
@@ -63,7 +62,7 @@ const META = {
63
62
  'contentUrl',
64
63
  'downloadUrl',
65
64
  ],
66
- };
65
+ } as const;
67
66
 
68
67
  const FEED_TYPES = new Set(['application/rss+xml', 'application/atom+xml']);
69
68
 
@@ -75,7 +74,7 @@ const OPTIONS = {
75
74
  iframe: {
76
75
  src: {needsStableName: true},
77
76
  },
78
- link(attrs) {
77
+ link(attrs: any) {
79
78
  if (attrs.rel === 'stylesheet') {
80
79
  return {
81
80
  // Keep in the same bundle group as the HTML.
@@ -83,9 +82,13 @@ const OPTIONS = {
83
82
  };
84
83
  }
85
84
  },
86
- };
85
+ } as const;
87
86
 
88
- function collectSrcSetDependencies(asset, srcset, opts) {
87
+ function collectSrcSetDependencies(
88
+ asset: MutableAsset,
89
+ srcset: string,
90
+ opts: any,
91
+ ) {
89
92
  let parsed = parse(srcset).map(({url, ...v}) => ({
90
93
  url: asset.addURLDependency(url, opts),
91
94
  ...v,
@@ -93,12 +96,13 @@ function collectSrcSetDependencies(asset, srcset, opts) {
93
96
  return stringify(parsed);
94
97
  }
95
98
 
96
- function getAttrDepHandler(attr) {
99
+ function getAttrDepHandler(attr: string) {
97
100
  if (attr === 'srcset' || attr === 'imagesrcset') {
98
101
  return collectSrcSetDependencies;
99
102
  }
100
103
 
101
- return (asset, src, opts) => asset.addURLDependency(src, opts);
104
+ return (asset: MutableAsset, src: string, opts: any) =>
105
+ asset.addURLDependency(src, opts);
102
106
  }
103
107
 
104
108
  export default function collectDependencies(
@@ -108,11 +112,12 @@ export default function collectDependencies(
108
112
  let isDirty = false;
109
113
  let hasModuleScripts = false;
110
114
  let seen = new Set();
111
- let errors: Array<{|
112
- message: string,
113
- filePath: FilePath,
114
- loc: PostHTMLNode['location'],
115
- |}> = [];
115
+ let errors: Array<{
116
+ message: string;
117
+ filePath: FilePath;
118
+ loc: PostHTMLNode['location'];
119
+ }> = [];
120
+ // @ts-expect-error TS2339
116
121
  PostHTML().walk.call(ast.program, (node) => {
117
122
  let {tag, attrs} = node;
118
123
  if (!attrs || seen.has(node)) {
@@ -123,6 +128,7 @@ export default function collectDependencies(
123
128
 
124
129
  if (tag === 'meta') {
125
130
  const isMetaDependency = Object.keys(attrs).some((attr) => {
131
+ // @ts-expect-error TS7053
126
132
  let values = META[attr];
127
133
  return (
128
134
  values &&
@@ -197,7 +203,7 @@ export default function collectDependencies(
197
203
 
198
204
  // If this is a <script type="module">, and not all of the browser targets support ESM natively,
199
205
  // add a copy of the script tag with a nomodule attribute.
200
- let copy: ?PostHTMLNode;
206
+ let copy: PostHTMLNode | null | undefined;
201
207
  if (
202
208
  outputFormat === 'esmodule' &&
203
209
  !asset.env.supports('esmodules', true)
@@ -215,6 +221,7 @@ export default function collectDependencies(
215
221
  ? 'isolated'
216
222
  : undefined,
217
223
  env: {
224
+ // @ts-expect-error TS2322
218
225
  sourceType,
219
226
  outputFormat: 'global',
220
227
  loc,
@@ -236,7 +243,9 @@ export default function collectDependencies(
236
243
  ? 'isolated'
237
244
  : undefined,
238
245
  env: {
246
+ // @ts-expect-error TS2322
239
247
  sourceType,
248
+ // @ts-expect-error TS2322
240
249
  outputFormat,
241
250
  loc,
242
251
  },
@@ -258,6 +267,7 @@ export default function collectDependencies(
258
267
  continue;
259
268
  }
260
269
 
270
+ // @ts-expect-error TS7053
261
271
  let elements = ATTRS[attr];
262
272
  if (elements && elements.includes(node.tag)) {
263
273
  // Check for empty string
@@ -270,6 +280,7 @@ export default function collectDependencies(
270
280
  }
271
281
 
272
282
  let depHandler = getAttrDepHandler(attr);
283
+ // @ts-expect-error TS7053
273
284
  let depOptionsHandler = OPTIONS[node.tag];
274
285
  let depOptions =
275
286
  typeof depOptionsHandler === 'function'
@@ -1,10 +1,15 @@
1
- // @flow strict-local
2
-
3
- import type {AST, MutableAsset, TransformerResult} from '@atlaspack/types';
1
+ import type {
2
+ AST,
3
+ BundleBehavior,
4
+ MutableAsset,
5
+ TransformerResult,
6
+ } from '@atlaspack/types';
4
7
  import {hashString} from '@atlaspack/rust';
8
+ // @ts-expect-error TS2724
5
9
  import type {PostHTMLNode} from 'posthtml';
6
10
 
7
11
  import PostHTML from 'posthtml';
12
+ import {getFeatureFlag} from '@atlaspack/feature-flags';
8
13
 
9
14
  const SCRIPT_TYPES = {
10
15
  'application/javascript': 'js',
@@ -13,7 +18,7 @@ const SCRIPT_TYPES = {
13
18
  'application/ld+json': 'jsonld',
14
19
  'text/html': false,
15
20
  module: 'js',
16
- };
21
+ } as const;
17
22
 
18
23
  interface ExtractInlineAssetsResult {
19
24
  hasModuleScripts: boolean;
@@ -30,6 +35,7 @@ export default function extractInlineAssets(
30
35
  // Extract inline <script> and <style> tags for processing.
31
36
  let parts: Array<TransformerResult> = [];
32
37
  let hasModuleScripts = false;
38
+ // @ts-expect-error TS2339
33
39
  PostHTML().walk.call(program, (node: PostHTMLNode) => {
34
40
  let parcelKey = hashString(`${asset.id}:${key++}`);
35
41
  if (node.tag === 'script' || node.tag === 'style') {
@@ -45,11 +51,14 @@ export default function extractInlineAssets(
45
51
  }
46
52
  } else if (node.attrs && node.attrs.type != null) {
47
53
  // Skip JSON
54
+ // @ts-expect-error TS7053
48
55
  if (SCRIPT_TYPES[node.attrs.type] === false) {
49
56
  return node;
50
57
  }
51
58
 
59
+ // @ts-expect-error TS7053
52
60
  if (SCRIPT_TYPES[node.attrs.type]) {
61
+ // @ts-expect-error TS7053
53
62
  type = SCRIPT_TYPES[node.attrs.type];
54
63
  } else {
55
64
  type = node.attrs.type.split('/')[1];
@@ -117,6 +126,12 @@ export default function extractInlineAssets(
117
126
  delete node.attrs.type;
118
127
  }
119
128
 
129
+ let bundleBehavior: BundleBehavior = 'inline';
130
+ if (typeof node.attrs['data-atlaspack-isolated'] !== 'undefined') {
131
+ bundleBehavior = 'inlineIsolated';
132
+ delete node.attrs['data-atlaspack-isolated'];
133
+ }
134
+
120
135
  // insert parcelId to allow us to retrieve node during packaging
121
136
  node.attrs['data-parcel-key'] = parcelKey;
122
137
  asset.setAST(ast); // mark dirty
@@ -130,11 +145,11 @@ export default function extractInlineAssets(
130
145
  type,
131
146
  content: value,
132
147
  uniqueKey: parcelKey,
133
- bundleBehavior: 'inline',
148
+ bundleBehavior,
149
+ // @ts-expect-error TS2322
134
150
  env,
135
151
  meta: {
136
152
  type: 'tag',
137
- // $FlowFixMe
138
153
  node,
139
154
  startLine: node.location?.start.line,
140
155
  },
@@ -163,7 +178,6 @@ export default function extractInlineAssets(
163
178
  bundleBehavior: 'inline',
164
179
  meta: {
165
180
  type: 'attr',
166
- // $FlowFixMe
167
181
  node,
168
182
  },
169
183
  });
@@ -1,22 +1,19 @@
1
- // @flow strict-local
2
-
3
- import {type PostHTMLNode, render} from 'posthtml-render';
1
+ import {PostHTMLNode, render} from 'posthtml-render';
4
2
  import {parseHTML, transformerOpts} from '../src/HTMLTransformer';
5
3
  import assert from 'assert';
6
4
  import type {PluginOptions} from '../../../core/types-internal/src';
7
5
 
8
6
  function normalizeHTML(code: string): string {
9
7
  const ast = parseHTML(code, true);
10
- // $FlowFixMe
11
8
  const result = renderHTML(ast);
12
9
  const lines = result
13
10
  .split('\n')
14
- .map((line) => line.trim())
15
- .filter((line) => line);
11
+ .map((line: any) => line.trim())
12
+ .filter((line: any) => line);
16
13
  return lines.join('');
17
14
  }
18
15
 
19
- function renderHTML(newAST: {|program: PostHTMLNode|}): string {
16
+ function renderHTML(newAST: {program: PostHTMLNode}): string {
20
17
  return render(newAST.program, {
21
18
  closingSingleTag: 'slash',
22
19
  });
@@ -24,24 +21,24 @@ function renderHTML(newAST: {|program: PostHTMLNode|}): string {
24
21
 
25
22
  async function runTestTransform(
26
23
  code: string,
27
- options: {|
28
- shouldScopeHoist: boolean,
29
- supportsEsmodules: boolean,
30
- hmrOptions: PluginOptions['hmrOptions'],
31
- |} = {
24
+ options: {
25
+ shouldScopeHoist: boolean;
26
+ supportsEsmodules: boolean;
27
+ hmrOptions: PluginOptions['hmrOptions'];
28
+ } = {
32
29
  shouldScopeHoist: true,
33
30
  supportsEsmodules: true,
34
31
  hmrOptions: null,
35
32
  },
36
33
  ) {
37
- const dependencies = [];
34
+ const dependencies: Array<any> = [];
38
35
  let newAST = null;
39
36
  const asset = {
40
37
  getAST: () => parseHTML(code, true),
41
- setAST: (n) => {
38
+ setAST: (n: any) => {
42
39
  newAST = n;
43
40
  },
44
- addURLDependency(url, opts) {
41
+ addURLDependency(url: string, opts: Partial<DependencyOptions>) {
45
42
  dependencies.push({url, opts});
46
43
  return `dependency-id::${url}`;
47
44
  },
@@ -53,34 +50,31 @@ async function runTestTransform(
53
50
  return options.supportsEsmodules;
54
51
  },
55
52
  },
56
- addDependency(specifier, specifierType) {
53
+ addDependency(specifier: DependencyOptions, specifierType: undefined) {
57
54
  dependencies.push({specifier, specifierType});
58
55
  return 'dependency-id';
59
56
  },
60
- };
57
+ } as const;
61
58
 
62
59
  const transformInput = {
63
60
  asset,
64
61
  options: {
65
62
  hmrOptions: options.hmrOptions,
66
63
  },
67
- };
68
- // $FlowFixMe
64
+ } as const;
69
65
  const transformResult = await transformerOpts.transform(transformInput);
70
66
 
71
- // $FlowFixMe
72
67
  const outputCode = renderHTML(newAST);
73
68
 
74
69
  return {dependencies, newAST, outputCode, transformResult, inputAsset: asset};
75
70
  }
76
71
 
77
- function normalizeDependencies(dependencies) {
78
- return dependencies.map((dependency) => ({
72
+ function normalizeDependencies(dependencies: any) {
73
+ return dependencies.map((dependency: any) => ({
79
74
  ...dependency,
80
75
  opts: {
81
76
  ...dependency.opts,
82
77
  env: {
83
- // $FlowFixMe
84
78
  ...dependency.opts.env,
85
79
  loc: null,
86
80
  },
@@ -88,9 +82,8 @@ function normalizeDependencies(dependencies) {
88
82
  }));
89
83
  }
90
84
 
91
- function normalizeAssets(assets) {
92
- return assets.map((asset) => {
93
- // $FlowFixMe
85
+ function normalizeAssets(assets: any) {
86
+ return assets.map((asset: any) => {
94
87
  return {
95
88
  ...asset,
96
89
  env: null,
@@ -189,7 +182,7 @@ describe('HTMLTransformer', () => {
189
182
  sourceType: 'script',
190
183
  },
191
184
  priority: 'parallel',
192
- };
185
+ } as const;
193
186
  assert.deepEqual(normalizeDependencies(dependencies), [
194
187
  {
195
188
  url: 'input1.js',
@@ -358,4 +351,25 @@ describe('HTMLTransformer', () => {
358
351
  },
359
352
  ]);
360
353
  });
354
+
355
+ it('transforms simple inline script with data-atlaspack-isolated', async () => {
356
+ const code = `
357
+ <html>
358
+ <body>
359
+ <script data-atlaspack-isolated>console.log('blah'); require('path');</script>
360
+ </body>
361
+ </html>
362
+ `;
363
+ const {transformResult, inputAsset} = await runTestTransform(code);
364
+ assert(transformResult.includes(inputAsset));
365
+ const assets = normalizeAssets(transformResult);
366
+ assert.deepEqual(assets[1], {
367
+ type: 'js',
368
+ content: "console.log('blah'); require('path');",
369
+ uniqueKey: 'a8a37984d2e520b9',
370
+ bundleBehavior: 'inlineIsolated',
371
+ env: null,
372
+ meta: null,
373
+ });
374
+ });
361
375
  });
package/tsconfig.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "include": ["src"],
4
+ "compilerOptions": {
5
+ "composite": true
6
+ },
7
+ "references": [
8
+ {
9
+ "path": "../../core/core/tsconfig.json"
10
+ },
11
+ {
12
+ "path": "../../core/diagnostic/tsconfig.json"
13
+ },
14
+ {
15
+ "path": "../../core/feature-flags/tsconfig.json"
16
+ },
17
+ {
18
+ "path": "../../core/plugin/tsconfig.json"
19
+ },
20
+ {
21
+ "path": "../../core/rust/tsconfig.json"
22
+ }
23
+ ]
24
+ }