@rollup-extras/plugin-html 1.3.0 → 1.3.1

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.
package/dist/index.cjs CHANGED
@@ -3,16 +3,67 @@
3
3
  var fs = require('fs/promises');
4
4
  var oldStyleFs = require('fs');
5
5
  var path = require('path');
6
- var options = require('@rollup-extras/utils/options');
7
- var logger = require('@rollup-extras/utils/logger');
8
- var mutliConfigPluginBase = require('@rollup-extras/utils/mutli-config-plugin-base');
6
+ var logger$1 = require('@niceties/logger');
9
7
 
10
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+ function getOptionsObject(options, defaults, factory) {
9
+ const result = Object.assign(Object.assign({}, defaults), options);
10
+ if (factory) {
11
+ for (const [k, v] of Object.entries(factory)) {
12
+ result[k] = v(result, k);
13
+ }
14
+ }
15
+ return result;
16
+ }
17
+
18
+ function logger (options) {
19
+ return logger$1.createLogger(options.pluginName);
20
+ }
11
21
 
12
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
13
- var oldStyleFs__default = /*#__PURE__*/_interopDefaultLegacy(oldStyleFs);
14
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
15
- var logger__default = /*#__PURE__*/_interopDefaultLegacy(logger);
22
+ function multiConfigPluginBase(useWriteBundle, pluginName, execute, onFinalHook) {
23
+ const finalHook = useWriteBundle ? 'writeBundle' : 'generateBundle';
24
+ let remainingOutputsCount = 0, configsCount = 0;
25
+ const configs = new Set();
26
+ const instance = {
27
+ name: pluginName,
28
+ renderStart,
29
+ [finalHook]: writeBundle,
30
+ api: { addInstance }
31
+ };
32
+ return instance;
33
+ function addInstance() {
34
+ const configId = ++configsCount;
35
+ configs.add(configId);
36
+ return {
37
+ name: `${pluginName}#${configId}`,
38
+ renderStart: () => {
39
+ configs.delete(configId);
40
+ return renderStart();
41
+ },
42
+ [finalHook]: writeBundle
43
+ };
44
+ }
45
+ function renderStart() {
46
+ ++remainingOutputsCount;
47
+ }
48
+ async function writeBundle(options, bundle) {
49
+ --remainingOutputsCount;
50
+ if (onFinalHook) {
51
+ await onFinalHook.call(this, options, bundle, configs.size, remainingOutputsCount);
52
+ }
53
+ if (configs.size === 0 && remainingOutputsCount === 0) {
54
+ // do work
55
+ try {
56
+ await execute.call(this, options, bundle);
57
+ }
58
+ finally {
59
+ // reset configs
60
+ for (let i = configsCount; i > 0; --i) {
61
+ configs.add(i);
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
16
67
 
17
68
  const defaultTemplate = '<!DOCTYPE html><html><head></head><body></body></html>';
18
69
  const headClosingElement = '</head>';
@@ -28,9 +79,9 @@ const defaults = {
28
79
  ignore: toAssetPredicate(false),
29
80
  templateFactory: ((template, assets, defaultTemplateFactory) => defaultTemplateFactory(template, assets))
30
81
  };
31
- const factories = { logger: logger__default["default"], injectIntoHead: predicateFactory, ignore: predicateFactory };
32
- function index (options$1 = {}) {
33
- const { pluginName, outputFile, template, watch, emitFile, conditionalLoading, logger, useWriteBundle, logLevel, useEmittedTemplate, injectIntoHead, ignore, assetsFactory, templateFactory } = options.getOptionsObject(options$1, Object.assign(Object.assign({}, defaults), { useEmittedTemplate: !('template' in options$1), logLevel: options$1.verbose ? 1 /* info */ : 0 /* verbose */ }), factories), hasCustomTemplateFactory = 'templateFactory' in options$1;
82
+ const factories = { logger, injectIntoHead: predicateFactory, ignore: predicateFactory };
83
+ function index (options = {}) {
84
+ const { pluginName, outputFile, template, watch, emitFile, conditionalLoading, logger, useWriteBundle, logLevel, useEmittedTemplate, injectIntoHead, ignore, assetsFactory, templateFactory } = getOptionsObject(options, Object.assign(Object.assign({}, defaults), { useEmittedTemplate: !('template' in options), logLevel: options.verbose ? 1 /* LogLevel.info */ : 0 /* LogLevel.verbose */ }), factories), hasCustomTemplateFactory = 'templateFactory' in options;
34
85
  let templateString = defaultTemplate, hasTemplateFile = false;
35
86
  if (template) {
36
87
  if (isUsableByDefaultTemplateFactory(template)) {
@@ -40,7 +91,7 @@ function index (options$1 = {}) {
40
91
  if (watch) {
41
92
  try {
42
93
  // using sync fs call because we need to return plugin object immidiately
43
- useNewTemplate(oldStyleFs__default["default"].readFileSync(template, { encoding: 'utf8' }));
94
+ useNewTemplate(oldStyleFs.readFileSync(template, { encoding: 'utf8' }));
44
95
  hasTemplateFile = true;
45
96
  }
46
97
  catch (e) {
@@ -49,7 +100,7 @@ function index (options$1 = {}) {
49
100
  }
50
101
  else {
51
102
  templateString = new Promise(resolve => {
52
- fs__default["default"].readFile(template, { encoding: 'utf8' })
103
+ fs.readFile(template, { encoding: 'utf8' })
53
104
  .then((newTemplateString) => {
54
105
  if (!isUsableByDefaultTemplateFactory(newTemplateString) && !hasCustomTemplateFactory) {
55
106
  warnAboutUsingDefaultTemplate();
@@ -66,13 +117,13 @@ function index (options$1 = {}) {
66
117
  }
67
118
  let initialDir = '', fileNameInInitialDir, assets = freshAssets();
68
119
  const processedFiles = new Set();
69
- const instance = mutliConfigPluginBase.multiConfigPluginBase(useWriteBundle, pluginName, generateBundle, updateAssets);
120
+ const instance = multiConfigPluginBase(useWriteBundle, pluginName, generateBundle, updateAssets);
70
121
  const baseRenderStart = instance.renderStart;
71
122
  const baseAddInstance = instance.api.addInstance;
72
123
  instance.renderStart = function (outputOptions, inputOptions) {
73
- logger('started collecting information', 0 /* verbose */);
124
+ logger('started collecting information', 0 /* LogLevel.verbose */);
74
125
  initialDir = outputOptions.dir || '';
75
- fileNameInInitialDir = path__default["default"].join(initialDir, outputFile);
126
+ fileNameInInitialDir = path.join(initialDir, outputFile);
76
127
  return baseRenderStart.call(this, outputOptions, inputOptions);
77
128
  };
78
129
  instance.api.addInstance = () => {
@@ -85,7 +136,7 @@ function index (options$1 = {}) {
85
136
  if (hasTemplateFile && watch) {
86
137
  instance.buildStart = async function () {
87
138
  try {
88
- useNewTemplate(await fs__default["default"].readFile(template, { encoding: 'utf8' }));
139
+ useNewTemplate(await fs.readFile(template, { encoding: 'utf8' }));
89
140
  }
90
141
  catch (e) {
91
142
  handleTemplateReadError(e);
@@ -101,16 +152,16 @@ function index (options$1 = {}) {
101
152
  .filter(item => item.count)
102
153
  .map(({ key, count }) => `${key}: ${count}`)
103
154
  .join(', ');
104
- logger(`assets collected: [${statistics}], remaining: ${remainingOutputsCount} outputs, ${remainingConfigsCount} configs`, 0 /* verbose */);
105
- const dir = options.dir || '', fileName = path__default["default"].relative(dir, fileNameInInitialDir);
155
+ logger(`assets collected: [${statistics}], remaining: ${remainingOutputsCount} outputs, ${remainingConfigsCount} configs`, 0 /* LogLevel.verbose */);
156
+ const dir = options.dir || '', fileName = path.relative(dir, fileNameInInitialDir);
106
157
  if (fileName in bundle) {
107
158
  if (useEmittedTemplate) {
108
- logger(`using exiting emitted ${fileName} as an input for out templateFactory`, 0 /* verbose */);
159
+ logger(`using exiting emitted ${fileName} as an input for out templateFactory`, 0 /* LogLevel.verbose */);
109
160
  const source = bundle[fileName].type === 'asset' ? bundle[fileName].source.toString() : bundle[fileName].code;
110
161
  useNewTemplate(source);
111
162
  }
112
163
  else {
113
- logger(`removing exiting emitted ${fileName}`, 0 /* verbose */);
164
+ logger(`removing exiting emitted ${fileName}`, 0 /* LogLevel.verbose */);
114
165
  }
115
166
  if (remainingConfigsCount === 0 && emitFile && !useWriteBundle) {
116
167
  delete bundle[fileName];
@@ -135,14 +186,14 @@ function index (options$1 = {}) {
135
186
  }
136
187
  function handleTemplateReadError(e) {
137
188
  if ((e === null || e === void 0 ? void 0 : e.code) === 'ENOENT') {
138
- logger('template nor a file or string', 2 /* warn */, e);
189
+ logger('template nor a file or string', 2 /* LogLevel.warn */, e);
139
190
  }
140
191
  else {
141
- logger('error reading template', 2 /* warn */, e);
192
+ logger('error reading template', 2 /* LogLevel.warn */, e);
142
193
  }
143
194
  }
144
195
  function warnAboutUsingDefaultTemplate() {
145
- logger('template is unusable by default template factory, using default one', 2 /* warn */);
196
+ logger('template is unusable by default template factory, using default one', 2 /* LogLevel.warn */);
146
197
  }
147
198
  async function buildStart() {
148
199
  this.addWatchFile(template);
@@ -150,14 +201,14 @@ function index (options$1 = {}) {
150
201
  async function generateBundle(options) {
151
202
  logger.start('generating html', logLevel);
152
203
  try {
153
- const dir = options.dir || '', fileName = path__default["default"].relative(dir, fileNameInInitialDir);
204
+ const dir = options.dir || '', fileName = path.relative(dir, fileNameInInitialDir);
154
205
  const depromisifiedTemplateString = await templateString, source = await templateFactory(depromisifiedTemplateString, assets, defaultTemplateFactory);
155
206
  if (!emitFile || fileName.startsWith('..') || useWriteBundle) {
156
207
  if (emitFile && emitFile !== 'auto') {
157
- logger('cannot emitFile because it is outside of current output.dir, using writeFile instead', 0 /* verbose */);
208
+ logger('cannot emitFile because it is outside of current output.dir, using writeFile instead', 0 /* LogLevel.verbose */);
158
209
  }
159
- await fs__default["default"].mkdir(path__default["default"].dirname(fileNameInInitialDir), { recursive: true });
160
- await fs__default["default"].writeFile(fileNameInInitialDir, source);
210
+ await fs.mkdir(path.dirname(fileNameInInitialDir), { recursive: true });
211
+ await fs.writeFile(fileNameInInitialDir, source);
161
212
  }
162
213
  else {
163
214
  this.emitFile({
@@ -172,13 +223,13 @@ function index (options$1 = {}) {
172
223
  logger.finish('html file generated');
173
224
  }
174
225
  catch (e) {
175
- logger.finish('html generation failed', 3 /* error */, e);
226
+ logger.finish('html generation failed', 3 /* LogLevel.error */, e);
176
227
  }
177
228
  }
178
229
  async function getAssets(options, bundle) {
179
230
  const dir = options.dir || '';
180
231
  for (const fileName of Object.keys(bundle)) {
181
- const relativeToRootAssetPath = path__default["default"].join(dir, fileName);
232
+ const relativeToRootAssetPath = path.join(dir, fileName);
182
233
  if (ignore(relativeToRootAssetPath) || processedFiles.has(relativeToRootAssetPath)) {
183
234
  continue;
184
235
  }
@@ -188,7 +239,7 @@ function index (options$1 = {}) {
188
239
  continue;
189
240
  }
190
241
  if (fileName.endsWith(cssExtention)) {
191
- const assetPath = path__default["default"].relative(initialDir, relativeToRootAssetPath);
242
+ const assetPath = path.relative(initialDir, relativeToRootAssetPath);
192
243
  assets.asset.push({
193
244
  html: getLinkElement(assetPath),
194
245
  head: injectIntoHead(relativeToRootAssetPath),
@@ -204,7 +255,7 @@ function index (options$1 = {}) {
204
255
  continue;
205
256
  }
206
257
  if (options.format === 'es' || options.format === 'iife' || options.format === 'umd') {
207
- const assetPath = path__default["default"].relative(initialDir, relativeToRootAssetPath);
258
+ const assetPath = path.relative(initialDir, relativeToRootAssetPath);
208
259
  assets[options.format].push({
209
260
  html: (assets) => {
210
261
  let useConditionalLoading = conditionalLoading;
@@ -241,7 +292,7 @@ function index (options$1 = {}) {
241
292
  }
242
293
  }
243
294
  catch (e) {
244
- logger('exception in assetFactory', 2 /* warn */, e);
295
+ logger('exception in assetFactory', 2 /* LogLevel.warn */, e);
245
296
  }
246
297
  }
247
298
  return false;
@@ -266,7 +317,7 @@ function predicateFactory(options, field) {
266
317
  return predicate;
267
318
  }
268
319
  else {
269
- options.logger && options.logger(`${field} option ignored because it is not a function, RegExp or boolean`, 2 /* warn */);
320
+ options.logger && options.logger(`${field} option ignored because it is not a function, RegExp or boolean`, 2 /* LogLevel.warn */);
270
321
  }
271
322
  }
272
323
  return defaults[field];
package/dist/index.mjs CHANGED
@@ -1,9 +1,67 @@
1
1
  import fs from 'fs/promises';
2
2
  import oldStyleFs from 'fs';
3
3
  import path from 'path';
4
- import { getOptionsObject } from '@rollup-extras/utils/options';
5
- import logger from '@rollup-extras/utils/logger';
6
- import { multiConfigPluginBase } from '@rollup-extras/utils/mutli-config-plugin-base';
4
+ import { createLogger } from '@niceties/logger';
5
+
6
+ function getOptionsObject(options, defaults, factory) {
7
+ const result = Object.assign(Object.assign({}, defaults), options);
8
+ if (factory) {
9
+ for (const [k, v] of Object.entries(factory)) {
10
+ result[k] = v(result, k);
11
+ }
12
+ }
13
+ return result;
14
+ }
15
+
16
+ function logger (options) {
17
+ return createLogger(options.pluginName);
18
+ }
19
+
20
+ function multiConfigPluginBase(useWriteBundle, pluginName, execute, onFinalHook) {
21
+ const finalHook = useWriteBundle ? 'writeBundle' : 'generateBundle';
22
+ let remainingOutputsCount = 0, configsCount = 0;
23
+ const configs = new Set();
24
+ const instance = {
25
+ name: pluginName,
26
+ renderStart,
27
+ [finalHook]: writeBundle,
28
+ api: { addInstance }
29
+ };
30
+ return instance;
31
+ function addInstance() {
32
+ const configId = ++configsCount;
33
+ configs.add(configId);
34
+ return {
35
+ name: `${pluginName}#${configId}`,
36
+ renderStart: () => {
37
+ configs.delete(configId);
38
+ return renderStart();
39
+ },
40
+ [finalHook]: writeBundle
41
+ };
42
+ }
43
+ function renderStart() {
44
+ ++remainingOutputsCount;
45
+ }
46
+ async function writeBundle(options, bundle) {
47
+ --remainingOutputsCount;
48
+ if (onFinalHook) {
49
+ await onFinalHook.call(this, options, bundle, configs.size, remainingOutputsCount);
50
+ }
51
+ if (configs.size === 0 && remainingOutputsCount === 0) {
52
+ // do work
53
+ try {
54
+ await execute.call(this, options, bundle);
55
+ }
56
+ finally {
57
+ // reset configs
58
+ for (let i = configsCount; i > 0; --i) {
59
+ configs.add(i);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
7
65
 
8
66
  const defaultTemplate = '<!DOCTYPE html><html><head></head><body></body></html>';
9
67
  const headClosingElement = '</head>';
@@ -21,7 +79,7 @@ const defaults = {
21
79
  };
22
80
  const factories = { logger, injectIntoHead: predicateFactory, ignore: predicateFactory };
23
81
  function index (options = {}) {
24
- const { pluginName, outputFile, template, watch, emitFile, conditionalLoading, logger, useWriteBundle, logLevel, useEmittedTemplate, injectIntoHead, ignore, assetsFactory, templateFactory } = getOptionsObject(options, Object.assign(Object.assign({}, defaults), { useEmittedTemplate: !('template' in options), logLevel: options.verbose ? 1 /* info */ : 0 /* verbose */ }), factories), hasCustomTemplateFactory = 'templateFactory' in options;
82
+ const { pluginName, outputFile, template, watch, emitFile, conditionalLoading, logger, useWriteBundle, logLevel, useEmittedTemplate, injectIntoHead, ignore, assetsFactory, templateFactory } = getOptionsObject(options, Object.assign(Object.assign({}, defaults), { useEmittedTemplate: !('template' in options), logLevel: options.verbose ? 1 /* LogLevel.info */ : 0 /* LogLevel.verbose */ }), factories), hasCustomTemplateFactory = 'templateFactory' in options;
25
83
  let templateString = defaultTemplate, hasTemplateFile = false;
26
84
  if (template) {
27
85
  if (isUsableByDefaultTemplateFactory(template)) {
@@ -61,7 +119,7 @@ function index (options = {}) {
61
119
  const baseRenderStart = instance.renderStart;
62
120
  const baseAddInstance = instance.api.addInstance;
63
121
  instance.renderStart = function (outputOptions, inputOptions) {
64
- logger('started collecting information', 0 /* verbose */);
122
+ logger('started collecting information', 0 /* LogLevel.verbose */);
65
123
  initialDir = outputOptions.dir || '';
66
124
  fileNameInInitialDir = path.join(initialDir, outputFile);
67
125
  return baseRenderStart.call(this, outputOptions, inputOptions);
@@ -92,16 +150,16 @@ function index (options = {}) {
92
150
  .filter(item => item.count)
93
151
  .map(({ key, count }) => `${key}: ${count}`)
94
152
  .join(', ');
95
- logger(`assets collected: [${statistics}], remaining: ${remainingOutputsCount} outputs, ${remainingConfigsCount} configs`, 0 /* verbose */);
153
+ logger(`assets collected: [${statistics}], remaining: ${remainingOutputsCount} outputs, ${remainingConfigsCount} configs`, 0 /* LogLevel.verbose */);
96
154
  const dir = options.dir || '', fileName = path.relative(dir, fileNameInInitialDir);
97
155
  if (fileName in bundle) {
98
156
  if (useEmittedTemplate) {
99
- logger(`using exiting emitted ${fileName} as an input for out templateFactory`, 0 /* verbose */);
157
+ logger(`using exiting emitted ${fileName} as an input for out templateFactory`, 0 /* LogLevel.verbose */);
100
158
  const source = bundle[fileName].type === 'asset' ? bundle[fileName].source.toString() : bundle[fileName].code;
101
159
  useNewTemplate(source);
102
160
  }
103
161
  else {
104
- logger(`removing exiting emitted ${fileName}`, 0 /* verbose */);
162
+ logger(`removing exiting emitted ${fileName}`, 0 /* LogLevel.verbose */);
105
163
  }
106
164
  if (remainingConfigsCount === 0 && emitFile && !useWriteBundle) {
107
165
  delete bundle[fileName];
@@ -126,14 +184,14 @@ function index (options = {}) {
126
184
  }
127
185
  function handleTemplateReadError(e) {
128
186
  if ((e === null || e === void 0 ? void 0 : e.code) === 'ENOENT') {
129
- logger('template nor a file or string', 2 /* warn */, e);
187
+ logger('template nor a file or string', 2 /* LogLevel.warn */, e);
130
188
  }
131
189
  else {
132
- logger('error reading template', 2 /* warn */, e);
190
+ logger('error reading template', 2 /* LogLevel.warn */, e);
133
191
  }
134
192
  }
135
193
  function warnAboutUsingDefaultTemplate() {
136
- logger('template is unusable by default template factory, using default one', 2 /* warn */);
194
+ logger('template is unusable by default template factory, using default one', 2 /* LogLevel.warn */);
137
195
  }
138
196
  async function buildStart() {
139
197
  this.addWatchFile(template);
@@ -145,7 +203,7 @@ function index (options = {}) {
145
203
  const depromisifiedTemplateString = await templateString, source = await templateFactory(depromisifiedTemplateString, assets, defaultTemplateFactory);
146
204
  if (!emitFile || fileName.startsWith('..') || useWriteBundle) {
147
205
  if (emitFile && emitFile !== 'auto') {
148
- logger('cannot emitFile because it is outside of current output.dir, using writeFile instead', 0 /* verbose */);
206
+ logger('cannot emitFile because it is outside of current output.dir, using writeFile instead', 0 /* LogLevel.verbose */);
149
207
  }
150
208
  await fs.mkdir(path.dirname(fileNameInInitialDir), { recursive: true });
151
209
  await fs.writeFile(fileNameInInitialDir, source);
@@ -163,7 +221,7 @@ function index (options = {}) {
163
221
  logger.finish('html file generated');
164
222
  }
165
223
  catch (e) {
166
- logger.finish('html generation failed', 3 /* error */, e);
224
+ logger.finish('html generation failed', 3 /* LogLevel.error */, e);
167
225
  }
168
226
  }
169
227
  async function getAssets(options, bundle) {
@@ -232,7 +290,7 @@ function index (options = {}) {
232
290
  }
233
291
  }
234
292
  catch (e) {
235
- logger('exception in assetFactory', 2 /* warn */, e);
293
+ logger('exception in assetFactory', 2 /* LogLevel.warn */, e);
236
294
  }
237
295
  }
238
296
  return false;
@@ -257,7 +315,7 @@ function predicateFactory(options, field) {
257
315
  return predicate;
258
316
  }
259
317
  else {
260
- options.logger && options.logger(`${field} option ignored because it is not a function, RegExp or boolean`, 2 /* warn */);
318
+ options.logger && options.logger(`${field} option ignored because it is not a function, RegExp or boolean`, 2 /* LogLevel.warn */);
261
319
  }
262
320
  }
263
321
  return defaults[field];
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.3.0",
2
+ "version": "1.3.1",
3
3
  "license": "MIT",
4
4
  "name": "@rollup-extras/plugin-html",
5
5
  "author": {
@@ -38,7 +38,7 @@
38
38
  "bundle"
39
39
  ],
40
40
  "scripts": {
41
- "build": "pkgbld",
41
+ "build": "pkgbld-internal",
42
42
  "test": "jest --collectCoverage",
43
43
  "lint": "eslint ./src",
44
44
  "semantic-release": "npx semantic-release"
@@ -60,13 +60,13 @@
60
60
  "ts-jest": "28.0.2",
61
61
  "typescript": "4.6.x",
62
62
  "update-monorepo-package-json": "0.2.0",
63
- "pkgbld": "1.2.12"
63
+ "pkgbld-internal": "1.0.2"
64
64
  },
65
65
  "peerDependencies": {
66
66
  "rollup": "^2.60.1 || ^3.0.0"
67
67
  },
68
68
  "dependencies": {
69
69
  "@niceties/logger": "^1.1.4",
70
- "@rollup-extras/utils": "^1.3.0"
70
+ "@rollup-extras/utils": "^1.3.1"
71
71
  }
72
72
  }