@ryanatkn/gro 0.136.1 → 0.138.0

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 +1 @@
1
- {"version":3,"file":"filer.d.ts","sourceRoot":"../src/lib/","sources":["filer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,yBAAyB,CAAC;AAGzD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AACvC,OAAO,EACN,SAAS,EAET,KAAK,cAAc,EACnB,KAAK,OAAO,IAAI,iBAAiB,EAEjC,MAAM,gBAAgB,CAAC;AAUxB,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACtC,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;AAEzF,MAAM,WAAW,OAAO;IACvB,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;CACzE;AAED,qBAAa,KAAK;;IACjB,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAa;gBAKjC,OAAO,GAAE,OAAsB;IAU3C,SAAS,OAAQ,OAAO,KAAG,WAAW,GAAG,SAAS,CAEhD;IAEF,aAAa,OAAQ,OAAO,KAAG,WAAW,CAWxC;IA4HI,KAAK,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IAKxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
1
+ {"version":3,"file":"filer.d.ts","sourceRoot":"../src/lib/","sources":["filer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,yBAAyB,CAAC;AAGzD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AACvC,OAAO,EACN,SAAS,EAET,KAAK,cAAc,EACnB,KAAK,OAAO,IAAI,iBAAiB,EAEjC,MAAM,gBAAgB,CAAC;AAUxB,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACtC,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;AAEzF,MAAM,WAAW,OAAO;IACvB,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;CACzE;AAED,qBAAa,KAAK;;IACjB,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAa;gBAKjC,OAAO,GAAE,OAAsB;IAU3C,SAAS,OAAQ,OAAO,KAAG,WAAW,GAAG,SAAS,CAEhD;IAEF,aAAa,OAAQ,OAAO,KAAG,WAAW,CAWxC;IA6HI,KAAK,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IAKxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
package/dist/filer.js CHANGED
@@ -40,44 +40,44 @@ export class Filer {
40
40
  #update(id) {
41
41
  const file = this.get_or_create(id);
42
42
  const new_contents = existsSync(id) ? readFileSync(id, 'utf8') : null;
43
- const contents_changed = file.contents !== new_contents;
43
+ if (file.contents === new_contents) {
44
+ return null;
45
+ }
44
46
  file.contents = new_contents;
45
- if (contents_changed) {
46
- const dir = dirname(file.id);
47
- const dependencies_before = new Set(file.dependencies.keys());
48
- const dependencies_removed = new Set(dependencies_before);
49
- const imported = file.contents ? parse_imports(file.id, file.contents) : [];
50
- for (const specifier of imported) {
51
- // TODO logic is duplicated from loader
52
- const path = map_sveltekit_aliases(specifier, aliases);
53
- // The specifier `path` has now been mapped to its final form, so we can inspect it.
54
- if (path[0] === '.' || path[0] === '/') {
55
- const { path_id } = resolve_specifier(path, dir);
56
- dependencies_removed.delete(path_id);
57
- if (!dependencies_before.has(path_id)) {
58
- const d = this.get_or_create(path_id);
59
- file.dependencies.set(d.id, d);
60
- d.dependents.set(file.id, file);
61
- }
47
+ const dir = dirname(file.id);
48
+ const dependencies_before = new Set(file.dependencies.keys());
49
+ const dependencies_removed = new Set(dependencies_before);
50
+ const imported = file.contents ? parse_imports(file.id, file.contents) : [];
51
+ for (const specifier of imported) {
52
+ // TODO logic is duplicated from loader
53
+ const path = map_sveltekit_aliases(specifier, aliases);
54
+ // The specifier `path` has now been mapped to its final form, so we can inspect it.
55
+ if (path[0] === '.' || path[0] === '/') {
56
+ const { path_id } = resolve_specifier(path, dir);
57
+ dependencies_removed.delete(path_id);
58
+ if (!dependencies_before.has(path_id)) {
59
+ const d = this.get_or_create(path_id);
60
+ file.dependencies.set(d.id, d);
61
+ d.dependents.set(file.id, file);
62
62
  }
63
63
  }
64
- // update any removed dependencies
65
- for (const dependency_removed of dependencies_removed) {
66
- const deleted1 = file.dependencies.delete(dependency_removed);
67
- if (!deleted1)
68
- throw Error('expected to delete1 ' + file.id); // TODO @many delete if correct
69
- const dependency_removed_file = this.get_or_create(dependency_removed);
70
- const deleted2 = dependency_removed_file.dependents.delete(file.id);
71
- if (!deleted2)
72
- throw Error('expected to delete2 ' + file.id); // TODO @many delete if correct
73
- }
64
+ }
65
+ // update any removed dependencies
66
+ for (const dependency_removed of dependencies_removed) {
67
+ const deleted1 = file.dependencies.delete(dependency_removed);
68
+ if (!deleted1)
69
+ throw Error('expected to delete1 ' + file.id); // TODO @many delete if correct
70
+ const dependency_removed_file = this.get_or_create(dependency_removed);
71
+ const deleted2 = dependency_removed_file.dependents.delete(file.id);
72
+ if (!deleted2)
73
+ throw Error('expected to delete2 ' + file.id); // TODO @many delete if correct
74
74
  }
75
75
  return file;
76
76
  }
77
77
  #remove(id) {
78
78
  const file = this.get_by_id(id);
79
79
  if (!file)
80
- return; // this is safe because the object would exist if any other file referenced it as a dependency or dependent
80
+ return null; // this is safe because the object would exist if any other file referenced it as a dependency or dependent
81
81
  file.contents = null; // clear contents in case it gets re-added later, we want the change to be detected
82
82
  let found = false;
83
83
  for (const d of this.files.values()) {
@@ -1 +1 @@
1
- {"version":3,"file":"gro.config.default.d.ts","sourceRoot":"../src/lib/","sources":["gro.config.default.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAOvD;;;;;;;;GAQG;AACH,QAAA,MAAM,MAAM,EAAE,iBAcb,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"gro.config.default.d.ts","sourceRoot":"../src/lib/","sources":["gro.config.default.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAOvD;;;;;;;;GAQG;AACH,QAAA,MAAM,MAAM,EAAE,iBAeb,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -21,7 +21,7 @@ const config = async (cfg) => {
21
21
  ? gro_plugin_sveltekit_app({ host_target: has_server_result.ok ? 'node' : 'github_pages' })
22
22
  : null,
23
23
  gro_plugin_gen(),
24
- ];
24
+ ].filter((v) => v !== null);
25
25
  return cfg;
26
26
  };
27
27
  export default config;
package/dist/package.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // generated by src/lib/package.gen.ts
2
2
  export const package_json = {
3
3
  name: '@ryanatkn/gro',
4
- version: '0.136.1',
4
+ version: '0.138.0',
5
5
  description: 'task runner and toolkit extending SvelteKit',
6
6
  motto: 'generate, run, optimize',
7
7
  glyph: '🌰',
@@ -264,7 +264,7 @@ export const package_json = {
264
264
  };
265
265
  export const src_json = {
266
266
  name: '@ryanatkn/gro',
267
- version: '0.136.1',
267
+ version: '0.138.0',
268
268
  modules: {
269
269
  '.': {
270
270
  path: 'index.ts',
package/dist/plugin.d.ts CHANGED
@@ -9,7 +9,7 @@ export interface Plugin<T_Plugin_Context extends Plugin_Context = Plugin_Context
9
9
  adapt?: (ctx: T_Plugin_Context) => void | Promise<void>;
10
10
  teardown?: (ctx: T_Plugin_Context) => void | Promise<void>;
11
11
  }
12
- export type Create_Config_Plugins<T_Plugin_Context extends Plugin_Context = Plugin_Context> = (ctx: T_Plugin_Context) => (Plugin<T_Plugin_Context> | null | Array<Plugin<T_Plugin_Context> | null>) | Promise<Plugin<T_Plugin_Context> | null | Array<Plugin<T_Plugin_Context> | null>>;
12
+ export type Create_Config_Plugins<T_Plugin_Context extends Plugin_Context = Plugin_Context> = (ctx: T_Plugin_Context) => Array<Plugin<T_Plugin_Context>> | Promise<Array<Plugin<T_Plugin_Context>>>;
13
13
  export interface Plugin_Context<T_Args = object> extends Task_Context<T_Args> {
14
14
  dev: boolean;
15
15
  watch: boolean;
@@ -31,5 +31,5 @@ export declare class Plugins<T_Plugin_Context extends Plugin_Context> {
31
31
  * @param name - @default new_plugin.name
32
32
  * @returns `plugins` with `new_plugin` at the index of the plugin with `name`
33
33
  */
34
- export declare const replace_plugin: <T_Plugins extends T_Plugin | null | Array<T_Plugin | null>, T_Plugin extends Plugin>(plugins: T_Plugins, new_plugin: Plugin, name?: string) => T_Plugin[];
34
+ export declare const replace_plugin: (plugins: Plugin[], new_plugin: Plugin, name?: string) => Plugin[];
35
35
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"../src/lib/","sources":["plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAE5C;;;GAGG;AACH,MAAM,WAAW,MAAM,CAAC,gBAAgB,SAAS,cAAc,GAAG,cAAc;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED,MAAM,MAAM,qBAAqB,CAAC,gBAAgB,SAAS,cAAc,GAAG,cAAc,IAAI,CAC7F,GAAG,EAAE,gBAAgB,KAEnB,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,GAC1E,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAErF,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,MAAM,CAAC;IAC5E,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,OAAO,CAAC,gBAAgB,SAAS,cAAc;IAG1D,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,SAAS;gBADT,GAAG,EAAE,gBAAgB,EACrB,SAAS,EAAE,MAAM,EAAE;WAGf,MAAM,CAAC,gBAAgB,SAAS,cAAc,EAC1D,GAAG,EAAE,gBAAgB,GACnB,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAW/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAc/B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GAC1B,SAAS,SAAS,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,EAC1D,QAAQ,SAAS,MAAM,WAEd,SAAS,cACN,MAAM,oBAEhB,QAAQ,EAOV,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"../src/lib/","sources":["plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAE5C;;;GAGG;AACH,MAAM,WAAW,MAAM,CAAC,gBAAgB,SAAS,cAAc,GAAG,cAAc;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED,MAAM,MAAM,qBAAqB,CAAC,gBAAgB,SAAS,cAAc,GAAG,cAAc,IAAI,CAC7F,GAAG,EAAE,gBAAgB,KACjB,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEhF,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,MAAM,CAAC;IAC5E,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,OAAO,CAAC,gBAAgB,SAAS,cAAc;IAG1D,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,SAAS;gBADT,GAAG,EAAE,gBAAgB,EACrB,SAAS,EAAE,MAAM,EAAE;WAGf,MAAM,CAAC,gBAAgB,SAAS,cAAc,EAC1D,GAAG,EAAE,gBAAgB,GACnB,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAS/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAc/B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,YACjB,MAAM,EAAE,cACL,MAAM,oBAEhB,MAAM,EAMR,CAAC"}
package/dist/plugin.js CHANGED
@@ -1,4 +1,3 @@
1
- import { to_array } from '@ryanatkn/belt/array.js';
2
1
  export class Plugins {
3
2
  ctx;
4
3
  instances;
@@ -10,7 +9,7 @@ export class Plugins {
10
9
  static async create(ctx) {
11
10
  const { timings } = ctx;
12
11
  const timing_to_create = timings.start('plugins.create');
13
- const instances = to_array(await ctx.config.plugins(ctx)).filter((v) => v !== null); // TODO remove cast, should infer the type predicate? `Type '(Plugin<Plugin_Context<object>> | null)[]' is not assignable to type 'Plugin<Plugin_Context<object>>[]'.`
12
+ const instances = await ctx.config.plugins(ctx);
14
13
  const plugins = new Plugins(ctx, instances);
15
14
  timing_to_create();
16
15
  return plugins;
@@ -70,11 +69,10 @@ export class Plugins {
70
69
  * @returns `plugins` with `new_plugin` at the index of the plugin with `name`
71
70
  */
72
71
  export const replace_plugin = (plugins, new_plugin, name = new_plugin.name) => {
73
- const array = to_array(plugins).filter((v) => v !== null);
74
- const index = array.findIndex((p) => p.name === name);
72
+ const index = plugins.findIndex((p) => p.name === name);
75
73
  if (index === -1)
76
74
  throw Error('Failed to find plugin to replace: ' + name);
77
- const replaced = array.slice();
75
+ const replaced = plugins.slice();
78
76
  replaced[index] = new_plugin;
79
77
  return replaced;
80
78
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryanatkn/gro",
3
- "version": "0.136.1",
3
+ "version": "0.138.0",
4
4
  "description": "task runner and toolkit extending SvelteKit",
5
5
  "motto": "generate, run, optimize",
6
6
  "glyph": "🌰",
package/src/lib/filer.ts CHANGED
@@ -74,51 +74,52 @@ export class Filer {
74
74
  return file;
75
75
  };
76
76
 
77
- #update(id: Path_Id): Source_File {
77
+ #update(id: Path_Id): Source_File | null {
78
78
  const file = this.get_or_create(id);
79
79
  const new_contents = existsSync(id) ? readFileSync(id, 'utf8') : null;
80
- const contents_changed = file.contents !== new_contents;
80
+ if (file.contents === new_contents) {
81
+ return null;
82
+ }
83
+
81
84
  file.contents = new_contents;
82
85
 
83
- if (contents_changed) {
84
- const dir = dirname(file.id);
85
-
86
- const dependencies_before = new Set(file.dependencies.keys());
87
- const dependencies_removed = new Set(dependencies_before);
88
-
89
- const imported = file.contents ? parse_imports(file.id, file.contents) : [];
90
- for (const specifier of imported) {
91
- // TODO logic is duplicated from loader
92
- const path = map_sveltekit_aliases(specifier, aliases);
93
-
94
- // The specifier `path` has now been mapped to its final form, so we can inspect it.
95
- if (path[0] === '.' || path[0] === '/') {
96
- const {path_id} = resolve_specifier(path, dir);
97
- dependencies_removed.delete(path_id);
98
- if (!dependencies_before.has(path_id)) {
99
- const d = this.get_or_create(path_id);
100
- file.dependencies.set(d.id, d);
101
- d.dependents.set(file.id, file);
102
- }
86
+ const dir = dirname(file.id);
87
+
88
+ const dependencies_before = new Set(file.dependencies.keys());
89
+ const dependencies_removed = new Set(dependencies_before);
90
+
91
+ const imported = file.contents ? parse_imports(file.id, file.contents) : [];
92
+ for (const specifier of imported) {
93
+ // TODO logic is duplicated from loader
94
+ const path = map_sveltekit_aliases(specifier, aliases);
95
+
96
+ // The specifier `path` has now been mapped to its final form, so we can inspect it.
97
+ if (path[0] === '.' || path[0] === '/') {
98
+ const {path_id} = resolve_specifier(path, dir);
99
+ dependencies_removed.delete(path_id);
100
+ if (!dependencies_before.has(path_id)) {
101
+ const d = this.get_or_create(path_id);
102
+ file.dependencies.set(d.id, d);
103
+ d.dependents.set(file.id, file);
103
104
  }
104
105
  }
106
+ }
105
107
 
106
- // update any removed dependencies
107
- for (const dependency_removed of dependencies_removed) {
108
- const deleted1 = file.dependencies.delete(dependency_removed);
109
- if (!deleted1) throw Error('expected to delete1 ' + file.id); // TODO @many delete if correct
110
- const dependency_removed_file = this.get_or_create(dependency_removed);
111
- const deleted2 = dependency_removed_file.dependents.delete(file.id);
112
- if (!deleted2) throw Error('expected to delete2 ' + file.id); // TODO @many delete if correct
113
- }
108
+ // update any removed dependencies
109
+ for (const dependency_removed of dependencies_removed) {
110
+ const deleted1 = file.dependencies.delete(dependency_removed);
111
+ if (!deleted1) throw Error('expected to delete1 ' + file.id); // TODO @many delete if correct
112
+ const dependency_removed_file = this.get_or_create(dependency_removed);
113
+ const deleted2 = dependency_removed_file.dependents.delete(file.id);
114
+ if (!deleted2) throw Error('expected to delete2 ' + file.id); // TODO @many delete if correct
114
115
  }
115
116
 
116
117
  return file;
117
118
  }
118
119
 
119
- #remove(id: Path_Id): Source_File | undefined {
120
+ #remove(id: Path_Id): Source_File | null {
120
121
  const file = this.get_by_id(id);
121
- if (!file) return; // this is safe because the object would exist if any other file referenced it as a dependency or dependent
122
+ if (!file) return null; // this is safe because the object would exist if any other file referenced it as a dependency or dependent
122
123
 
123
124
  file.contents = null; // clear contents in case it gets re-added later, we want the change to be detected
124
125
 
@@ -177,7 +178,7 @@ export class Filer {
177
178
 
178
179
  #on_change: Watcher_Change_Callback = (change) => {
179
180
  if (change.is_directory) return;
180
- let source_file: Source_File | undefined;
181
+ let source_file: Source_File | null;
181
182
  switch (change.type) {
182
183
  case 'add':
183
184
  case 'update': {
@@ -18,14 +18,15 @@ const config: Create_Gro_Config = async (cfg) => {
18
18
  const [has_sveltekit_library_result, has_server_result, has_sveltekit_app_result] =
19
19
  await Promise.all([has_sveltekit_library(), has_server(), has_sveltekit_app()]);
20
20
 
21
- cfg.plugins = () => [
22
- has_sveltekit_library_result.ok ? gro_plugin_sveltekit_library() : null,
23
- has_server_result.ok ? gro_plugin_server() : null,
24
- has_sveltekit_app_result.ok
25
- ? gro_plugin_sveltekit_app({host_target: has_server_result.ok ? 'node' : 'github_pages'})
26
- : null,
27
- gro_plugin_gen(),
28
- ];
21
+ cfg.plugins = () =>
22
+ [
23
+ has_sveltekit_library_result.ok ? gro_plugin_sveltekit_library() : null,
24
+ has_server_result.ok ? gro_plugin_server() : null,
25
+ has_sveltekit_app_result.ok
26
+ ? gro_plugin_sveltekit_app({host_target: has_server_result.ok ? 'node' : 'github_pages'})
27
+ : null,
28
+ gro_plugin_gen(),
29
+ ].filter((v) => v !== null);
29
30
 
30
31
  return cfg;
31
32
  };
@@ -5,7 +5,7 @@ import type {Src_Json} from './src_json.js';
5
5
 
6
6
  export const package_json = {
7
7
  name: '@ryanatkn/gro',
8
- version: '0.136.1',
8
+ version: '0.138.0',
9
9
  description: 'task runner and toolkit extending SvelteKit',
10
10
  motto: 'generate, run, optimize',
11
11
  glyph: '🌰',
@@ -270,7 +270,7 @@ export const package_json = {
270
270
 
271
271
  export const src_json = {
272
272
  name: '@ryanatkn/gro',
273
- version: '0.136.1',
273
+ version: '0.138.0',
274
274
  modules: {
275
275
  '.': {
276
276
  path: 'index.ts',
package/src/lib/plugin.ts CHANGED
@@ -1,5 +1,3 @@
1
- import {to_array} from '@ryanatkn/belt/array.js';
2
-
3
1
  import type {Task_Context} from './task.js';
4
2
 
5
3
  /**
@@ -15,9 +13,7 @@ export interface Plugin<T_Plugin_Context extends Plugin_Context = Plugin_Context
15
13
 
16
14
  export type Create_Config_Plugins<T_Plugin_Context extends Plugin_Context = Plugin_Context> = (
17
15
  ctx: T_Plugin_Context,
18
- ) =>
19
- | (Plugin<T_Plugin_Context> | null | Array<Plugin<T_Plugin_Context> | null>)
20
- | Promise<Plugin<T_Plugin_Context> | null | Array<Plugin<T_Plugin_Context> | null>>;
16
+ ) => Array<Plugin<T_Plugin_Context>> | Promise<Array<Plugin<T_Plugin_Context>>>;
21
17
 
22
18
  export interface Plugin_Context<T_Args = object> extends Task_Context<T_Args> {
23
19
  dev: boolean;
@@ -36,9 +32,7 @@ export class Plugins<T_Plugin_Context extends Plugin_Context> {
36
32
  ): Promise<Plugins<T_Plugin_Context>> {
37
33
  const {timings} = ctx;
38
34
  const timing_to_create = timings.start('plugins.create');
39
- const instances: Plugin[] = to_array(await ctx.config.plugins(ctx)).filter(
40
- (v) => v !== null,
41
- ) as Plugin[]; // TODO remove cast, should infer the type predicate? `Type '(Plugin<Plugin_Context<object>> | null)[]' is not assignable to type 'Plugin<Plugin_Context<object>>[]'.`
35
+ const instances: Plugin[] = await ctx.config.plugins(ctx);
42
36
  const plugins = new Plugins(ctx, instances);
43
37
  timing_to_create();
44
38
  return plugins;
@@ -96,18 +90,14 @@ export class Plugins<T_Plugin_Context extends Plugin_Context> {
96
90
  * @param name - @default new_plugin.name
97
91
  * @returns `plugins` with `new_plugin` at the index of the plugin with `name`
98
92
  */
99
- export const replace_plugin = <
100
- T_Plugins extends T_Plugin | null | Array<T_Plugin | null>,
101
- T_Plugin extends Plugin,
102
- >(
103
- plugins: T_Plugins,
93
+ export const replace_plugin = (
94
+ plugins: Plugin[],
104
95
  new_plugin: Plugin,
105
96
  name = new_plugin.name,
106
- ): T_Plugin[] => {
107
- const array = to_array(plugins).filter((v) => v !== null);
108
- const index = array.findIndex((p) => p.name === name);
97
+ ): Plugin[] => {
98
+ const index = plugins.findIndex((p) => p.name === name);
109
99
  if (index === -1) throw Error('Failed to find plugin to replace: ' + name);
110
- const replaced = array.slice();
100
+ const replaced = plugins.slice();
111
101
  replaced[index] = new_plugin;
112
- return replaced as T_Plugin[];
102
+ return replaced;
113
103
  };