@ryanatkn/gro 0.155.0 → 0.157.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.
Files changed (46) hide show
  1. package/dist/constants.d.ts +5 -0
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +5 -0
  4. package/dist/esbuild_plugin_svelte.d.ts.map +1 -1
  5. package/dist/esbuild_plugin_svelte.js +1 -2
  6. package/dist/gro_plugin_sveltekit_app.js +1 -1
  7. package/dist/loader.d.ts.map +1 -1
  8. package/dist/loader.js +33 -27
  9. package/dist/package.d.ts +44 -13
  10. package/dist/package.d.ts.map +1 -1
  11. package/dist/package.gen.js +1 -1
  12. package/dist/package.js +42 -21
  13. package/dist/parse_exports.d.ts +20 -0
  14. package/dist/parse_exports.d.ts.map +1 -0
  15. package/dist/parse_exports.js +65 -0
  16. package/dist/parse_exports_context.d.ts +21 -0
  17. package/dist/parse_exports_context.d.ts.map +1 -0
  18. package/dist/parse_exports_context.js +332 -0
  19. package/dist/parse_imports.d.ts.map +1 -1
  20. package/dist/parse_imports.js +1 -2
  21. package/dist/paths.d.ts +8 -0
  22. package/dist/paths.d.ts.map +1 -1
  23. package/dist/paths.js +6 -3
  24. package/dist/src_json.d.ts +68 -66
  25. package/dist/src_json.d.ts.map +1 -1
  26. package/dist/src_json.js +58 -55
  27. package/dist/test_helpers.d.ts +21 -0
  28. package/dist/test_helpers.d.ts.map +1 -0
  29. package/dist/test_helpers.js +122 -0
  30. package/package.json +20 -12
  31. package/src/lib/constants.ts +5 -0
  32. package/src/lib/esbuild_plugin_svelte.ts +1 -2
  33. package/src/lib/gro_plugin_sveltekit_app.ts +1 -1
  34. package/src/lib/loader.ts +38 -23
  35. package/src/lib/package.gen.ts +1 -1
  36. package/src/lib/package.ts +42 -21
  37. package/src/lib/parse_exports.ts +108 -0
  38. package/src/lib/parse_exports_context.ts +394 -0
  39. package/src/lib/parse_imports.ts +1 -2
  40. package/src/lib/paths.ts +13 -3
  41. package/src/lib/src_json.ts +80 -68
  42. package/src/lib/test_helpers.ts +159 -0
  43. package/dist/svelte_helpers.d.ts +0 -3
  44. package/dist/svelte_helpers.d.ts.map +0 -1
  45. package/dist/svelte_helpers.js +0 -2
  46. package/src/lib/svelte_helpers.ts +0 -2
@@ -3,8 +3,11 @@ export declare const GRO_DIRNAME = ".gro";
3
3
  export declare const GRO_DIST_PREFIX = "dist_";
4
4
  export declare const SERVER_DIST_PATH = "dist_server";
5
5
  export declare const GRO_DEV_DIRNAME: string;
6
+ /** @trailing_slash */
6
7
  export declare const SOURCE_DIR: string;
8
+ /** @trailing_slash */
7
9
  export declare const GRO_DIR: string;
10
+ /** @trailing_slash */
8
11
  export declare const GRO_DEV_DIR: string;
9
12
  export declare const GRO_CONFIG_PATH = "gro.config.ts";
10
13
  export declare const README_FILENAME = "README.md";
@@ -22,6 +25,8 @@ export declare const TSCONFIG_FILENAME = "tsconfig.json";
22
25
  export declare const TS_MATCHER: RegExp;
23
26
  export declare const JS_MATCHER: RegExp;
24
27
  export declare const JSON_MATCHER: RegExp;
28
+ export declare const SVELTE_MATCHER: RegExp;
29
+ export declare const SVELTE_RUNES_MATCHER: RegExp;
25
30
  /** Extracts the script content from Svelte files. */
26
31
  export declare const SVELTE_SCRIPT_MATCHER: RegExp;
27
32
  export declare const EVERYTHING_MATCHER: RegExp;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/constants.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,cAAc,QAAQ,CAAC;AACpC,eAAO,MAAM,WAAW,SAAS,CAAC;AAClC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,eAAe,QAAuB,CAAC;AACpD,eAAO,MAAM,UAAU,QAAuB,CAAC;AAC/C,eAAO,MAAM,OAAO,QAAoB,CAAC;AACzC,eAAO,MAAM,WAAW,QAAwB,CAAC;AACjD,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAC/C,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AACnD,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAC/C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,yBAAyB,QAAkC,CAAC;AACzE,eAAO,MAAM,cAAc,YAAY,CAAC;AACxC,eAAO,MAAM,WAAW,SAAS,CAAC;AAClC,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,eAAO,MAAM,UAAU,QAAwB,CAAC;AAChD,eAAO,MAAM,UAAU,QAAwB,CAAC;AAChD,eAAO,MAAM,YAAY,QAAY,CAAC;AACtC,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,QAAiD,CAAC;AACpF,eAAO,MAAM,kBAAkB,QAAO,CAAC;AAEvC,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,cAAc,QAAQ,CAAC;AACpC,eAAO,MAAM,oBAAoB,aAAa,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/constants.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,cAAc,QAAQ,CAAC;AACpC,eAAO,MAAM,WAAW,SAAS,CAAC;AAClC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,eAAe,QAAuB,CAAC;AACpD,sBAAsB;AACtB,eAAO,MAAM,UAAU,QAAuB,CAAC;AAC/C,sBAAsB;AACtB,eAAO,MAAM,OAAO,QAAoB,CAAC;AACzC,sBAAsB;AACtB,eAAO,MAAM,WAAW,QAAwB,CAAC;AACjD,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAC/C,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AACnD,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAC/C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,yBAAyB,QAAkC,CAAC;AACzE,eAAO,MAAM,cAAc,YAAY,CAAC;AACxC,eAAO,MAAM,WAAW,SAAS,CAAC;AAClC,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,eAAO,MAAM,UAAU,QAAwB,CAAC;AAChD,eAAO,MAAM,UAAU,QAAwB,CAAC;AAChD,eAAO,MAAM,YAAY,QAAY,CAAC;AACtC,eAAO,MAAM,cAAc,QAAc,CAAC;AAC1C,eAAO,MAAM,oBAAoB,QAAuB,CAAC;AACzD,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,QAAiD,CAAC;AACpF,eAAO,MAAM,kBAAkB,QAAO,CAAC;AAEvC,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,cAAc,QAAQ,CAAC;AACpC,eAAO,MAAM,oBAAoB,aAAa,CAAC"}
package/dist/constants.js CHANGED
@@ -10,8 +10,11 @@ export const GRO_DIRNAME = '.gro';
10
10
  export const GRO_DIST_PREFIX = 'dist_'; //
11
11
  export const SERVER_DIST_PATH = 'dist_server'; // TODO should all of these be `_PATH` or should this be `DIRNAME`? also, add `_PLUGIN` to this name?
12
12
  export const GRO_DEV_DIRNAME = GRO_DIRNAME + '/dev';
13
+ /** @trailing_slash */
13
14
  export const SOURCE_DIR = SOURCE_DIRNAME + '/';
15
+ /** @trailing_slash */
14
16
  export const GRO_DIR = GRO_DIRNAME + '/';
17
+ /** @trailing_slash */
15
18
  export const GRO_DEV_DIR = GRO_DEV_DIRNAME + '/';
16
19
  export const GRO_CONFIG_PATH = 'gro.config.ts';
17
20
  export const README_FILENAME = 'README.md';
@@ -29,6 +32,8 @@ export const TSCONFIG_FILENAME = 'tsconfig.json';
29
32
  export const TS_MATCHER = /\.(ts|tsx|mts|cts)$/;
30
33
  export const JS_MATCHER = /\.(js|jsx|mjs|cjs)$/;
31
34
  export const JSON_MATCHER = /\.json$/;
35
+ export const SVELTE_MATCHER = /\.svelte$/;
36
+ export const SVELTE_RUNES_MATCHER = /\.svelte\.(js|ts)$/; // TODO probably let `.svelte.` appear anywhere - https://github.com/sveltejs/svelte/issues/11536
32
37
  /** Extracts the script content from Svelte files. */
33
38
  export const SVELTE_SCRIPT_MATCHER = /<script(?:\s+[^>]*)?>([\s\S]*?)<\/script>/gim; // TODO maybe this shouldnt be global? or make a getter?
34
39
  export const EVERYTHING_MATCHER = /.*/;
@@ -1 +1 @@
1
- {"version":3,"file":"esbuild_plugin_svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/esbuild_plugin_svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAIN,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAGN,KAAK,oBAAoB,EACzB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,6BAA6B;IAC7C,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB,CAAC,EAAE,cAAc,CAAC;IACxC,6BAA6B,CAAC,EAAE,oBAAoB,CAAC;IACrD,oBAAoB,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpE,oBAAoB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAChD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACtC;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,6BAA6B,KAAG,OAAO,CAAC,MAmEtF,CAAC"}
1
+ {"version":3,"file":"esbuild_plugin_svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/esbuild_plugin_svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAIN,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAGN,KAAK,oBAAoB,EACzB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,6BAA6B;IAC7C,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB,CAAC,EAAE,cAAc,CAAC;IACxC,6BAA6B,CAAC,EAAE,oBAAoB,CAAC;IACrD,oBAAoB,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpE,oBAAoB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAChD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACtC;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,6BAA6B,KAAG,OAAO,CAAC,MAmEtF,CAAC"}
@@ -2,10 +2,9 @@ import * as esbuild from 'esbuild';
2
2
  import { compile, compileModule, preprocess, } from 'svelte/compiler';
3
3
  import { readFile } from 'node:fs/promises';
4
4
  import { relative } from 'node:path';
5
- import { SVELTE_MATCHER, SVELTE_RUNES_MATCHER } from "./svelte_helpers.js";
6
5
  import { to_define_import_meta_env, default_ts_transform_options } from "./esbuild_helpers.js";
7
6
  import { default_svelte_config, to_default_compile_module_options, } from "./svelte_config.js";
8
- import { TS_MATCHER } from "./constants.js";
7
+ import { TS_MATCHER, SVELTE_MATCHER, SVELTE_RUNES_MATCHER } from "./constants.js";
9
8
  export const esbuild_plugin_svelte = (options) => {
10
9
  const { dev, base_url, dir = process.cwd(), svelte_compile_options = default_svelte_config.svelte_compile_options, svelte_compile_module_options = to_default_compile_module_options(svelte_compile_options), svelte_preprocessors, ts_transform_options = default_ts_transform_options, is_ts = (f) => TS_MATCHER.test(f), } = options;
11
10
  const final_ts_transform_options = {
@@ -43,7 +43,7 @@ export const gro_plugin_sveltekit_app = ({ host_target = 'github_pages', well_kn
43
43
  const serialized_package_json = mapped_package_json && serialize_package_json(mapped_package_json);
44
44
  // `.well-known/src.json` and `.well-known/src/`
45
45
  const final_package_json = mapped_package_json ?? package_json;
46
- const src_json = create_src_json(final_package_json);
46
+ const src_json = create_src_json(final_package_json, undefined);
47
47
  if (well_known_src_json === undefined) {
48
48
  well_known_src_json = final_package_json.public; // eslint-disable-line no-param-reassign
49
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,QAAQ,EAAE,WAAW,EAAC,MAAM,aAAa,CAAC;AAuEvD,eAAO,MAAM,IAAI,EAAE,QA+FlB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,WAqDrB,CAAC"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,QAAQ,EAAE,WAAW,EAAC,MAAM,aAAa,CAAC;AA2EvD,eAAO,MAAM,IAAI,EAAE,QA0GlB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,WAqDrB,CAAC"}
package/dist/loader.js CHANGED
@@ -7,9 +7,8 @@ import ts_blank_space from 'ts-blank-space';
7
7
  import { render_env_shim_module } from "./sveltekit_shim_env.js";
8
8
  import { render_sveltekit_shim_app_environment, render_sveltekit_shim_app_paths, SVELTEKIT_SHIM_APP_ENVIRONMENT_MATCHER, SVELTEKIT_SHIM_APP_PATHS_MATCHER, sveltekit_shim_app_specifiers, } from "./sveltekit_shim_app.js";
9
9
  import { default_svelte_config } from "./svelte_config.js";
10
- import { SVELTE_MATCHER, SVELTE_RUNES_MATCHER } from "./svelte_helpers.js";
11
10
  import { IS_THIS_GRO, paths } from "./paths.js";
12
- import { JSON_MATCHER, NODE_MODULES_DIRNAME, TS_MATCHER } from "./constants.js";
11
+ import { NODE_MODULES_DIRNAME, TS_MATCHER, SVELTE_MATCHER, SVELTE_RUNES_MATCHER, } from "./constants.js";
13
12
  import { resolve_specifier } from "./resolve_specifier.js";
14
13
  import { map_sveltekit_aliases } from "./sveltekit_helpers.js";
15
14
  // TODO get out of the loader business, starting with https://nodejs.org/api/typescript.html#type-stripping
@@ -69,7 +68,7 @@ export const load = async (url, context, nextLoad) => {
69
68
  const loaded = await nextLoad(url, { ...context, format: 'module-typescript' });
70
69
  const raw_source = loaded.source?.toString(); // eslint-disable-line @typescript-eslint/no-base-to-string
71
70
  if (raw_source == null)
72
- throw new Error(`Failed to load ${url}`);
71
+ throw Error(`Failed to load ${url}`);
73
72
  // TODO should be nice if we could use Node's builtin amaro transform, but I couldn't find a way after digging into the source, AFAICT it's internal and not exposed
74
73
  const source = ts_blank_space(raw_source); // TODO was using oxc-transform and probably should, but this doesn't require sourcemaps, and it's still alpha as of May 2025
75
74
  const transformed = compileModule(source, {
@@ -95,14 +94,15 @@ export const load = async (url, context, nextLoad) => {
95
94
  const transformed = compile(source, { ...svelte_compile_options, dev, filename });
96
95
  return { format: 'module', shortCircuit: true, source: transformed.js.code };
97
96
  }
98
- else if (JSON_MATCHER.test(url)) {
99
- // TODO probably require import attrs: `JSON_MATCHER.test(url) && context.importAttributes.type === 'json'`
100
- // json
97
+ else if (context.importAttributes.type === 'json') {
98
+ // json - any file extension
101
99
  // TODO probably follow esbuild and also export every top-level property for objects from the module for good treeshaking - https://esbuild.github.io/content-types/#json (type generation?)
102
- const loaded = await nextLoad(url, context);
100
+ // TODO why is removing the importAttributes needed? can't pass no context either -
101
+ // error: `Module "file:///home/user/dev/repo/foo.json" is not of type "json"`
102
+ const loaded = await nextLoad(url, { ...context, importAttributes: undefined });
103
103
  const raw_source = loaded.source?.toString(); // eslint-disable-line @typescript-eslint/no-base-to-string
104
104
  if (raw_source == null)
105
- throw new Error(`Failed to load ${url}`);
105
+ throw Error(`Failed to load ${url}`);
106
106
  const source = `export default ` + raw_source;
107
107
  return { format: 'module', shortCircuit: true, source };
108
108
  }
@@ -119,28 +119,34 @@ export const load = async (url, context, nextLoad) => {
119
119
  if (context.format === 'sveltekit-env') {
120
120
  let mode;
121
121
  let visibility;
122
- if (context.importAttributes.virtual === '$env/static/public') {
123
- mode = 'static';
124
- visibility = 'public';
125
- }
126
- else if (context.importAttributes.virtual === '$env/static/private') {
127
- mode = 'static';
128
- visibility = 'private';
129
- }
130
- else if (context.importAttributes.virtual === '$env/dynamic/public') {
131
- mode = 'dynamic';
132
- visibility = 'public';
133
- }
134
- else if (context.importAttributes.virtual === '$env/dynamic/private') {
135
- mode = 'dynamic';
136
- visibility = 'private';
137
- }
138
- else {
139
- throw new Error(`Unknown $env import: ${context.importAttributes.virtual}`);
122
+ switch (context.importAttributes.virtual) {
123
+ case '$env/static/public': {
124
+ mode = 'static';
125
+ visibility = 'public';
126
+ break;
127
+ }
128
+ case '$env/static/private': {
129
+ mode = 'static';
130
+ visibility = 'private';
131
+ break;
132
+ }
133
+ case '$env/dynamic/public': {
134
+ mode = 'dynamic';
135
+ visibility = 'public';
136
+ break;
137
+ }
138
+ case '$env/dynamic/private': {
139
+ mode = 'dynamic';
140
+ visibility = 'private';
141
+ break;
142
+ }
143
+ default: {
144
+ throw Error(`Unknown $env import: ${context.importAttributes.virtual}`);
145
+ }
140
146
  }
141
147
  const source = render_env_shim_module(dev, mode, visibility, public_prefix, private_prefix, env_dir);
142
148
  return { format: 'module', shortCircuit: true, source };
143
- } // else fallback
149
+ }
144
150
  }
145
151
  // fallback to default behavior
146
152
  return nextLoad(url, context);
package/dist/package.d.ts CHANGED
@@ -48,13 +48,13 @@ export declare const package_json: {
48
48
  prettier: string;
49
49
  'prettier-plugin-svelte': string;
50
50
  'ts-blank-space': string;
51
- 'ts-morph': string;
52
51
  tslib: string;
53
52
  zod: string;
54
53
  };
55
54
  peerDependencies: {
56
55
  esbuild: string;
57
56
  svelte: string;
57
+ typescript: string;
58
58
  };
59
59
  devDependencies: {
60
60
  '@changesets/changelog-git': string;
@@ -304,6 +304,14 @@ export declare const package_json: {
304
304
  types: string;
305
305
  default: string;
306
306
  };
307
+ './parse_exports_context.js': {
308
+ types: string;
309
+ default: string;
310
+ };
311
+ './parse_exports.js': {
312
+ types: string;
313
+ default: string;
314
+ };
307
315
  './parse_imports.js': {
308
316
  types: string;
309
317
  default: string;
@@ -368,10 +376,6 @@ export declare const package_json: {
368
376
  types: string;
369
377
  default: string;
370
378
  };
371
- './svelte_helpers.js': {
372
- types: string;
373
- default: string;
374
- };
375
379
  './sveltekit_helpers.js': {
376
380
  types: string;
377
381
  default: string;
@@ -416,6 +420,10 @@ export declare const package_json: {
416
420
  types: string;
417
421
  default: string;
418
422
  };
423
+ './test_helpers.js': {
424
+ types: string;
425
+ default: string;
426
+ };
419
427
  './test.task.js': {
420
428
  types: string;
421
429
  default: string;
@@ -453,7 +461,10 @@ export declare const src_json: {
453
461
  };
454
462
  './package.json': {
455
463
  path: string;
456
- declarations: never[];
464
+ declarations: {
465
+ name: string;
466
+ kind: "json";
467
+ }[];
457
468
  };
458
469
  './args.js': {
459
470
  path: string;
@@ -893,6 +904,23 @@ export declare const src_json: {
893
904
  kind: "variable";
894
905
  }[];
895
906
  };
907
+ './parse_exports_context.js': {
908
+ path: string;
909
+ declarations: {
910
+ name: string;
911
+ kind: "class";
912
+ }[];
913
+ };
914
+ './parse_exports.js': {
915
+ path: string;
916
+ declarations: ({
917
+ name: string;
918
+ kind: "type";
919
+ } | {
920
+ name: string;
921
+ kind: "function";
922
+ })[];
923
+ };
896
924
  './parse_imports.js': {
897
925
  path: string;
898
926
  declarations: ({
@@ -1044,13 +1072,6 @@ export declare const src_json: {
1044
1072
  kind: "variable";
1045
1073
  })[];
1046
1074
  };
1047
- './svelte_helpers.js': {
1048
- path: string;
1049
- declarations: {
1050
- name: string;
1051
- kind: "variable";
1052
- }[];
1053
- };
1054
1075
  './sveltekit_helpers.js': {
1055
1076
  path: string;
1056
1077
  declarations: ({
@@ -1149,6 +1170,16 @@ export declare const src_json: {
1149
1170
  kind: "class";
1150
1171
  })[];
1151
1172
  };
1173
+ './test_helpers.js': {
1174
+ path: string;
1175
+ declarations: ({
1176
+ name: string;
1177
+ kind: "variable";
1178
+ } | {
1179
+ name: string;
1180
+ kind: "function";
1181
+ })[];
1182
+ };
1152
1183
  './test.task.js': {
1153
1184
  path: string;
1154
1185
  declarations: {
@@ -1 +1 @@
1
- {"version":3,"file":"package.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/package.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiQD,CAAC;AAEzB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuwBD,CAAC"}
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/package.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkQD,CAAC;AAEzB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2xBD,CAAC"}
@@ -10,7 +10,7 @@ import { create_src_json } from "./src_json.js";
10
10
  */
11
11
  export const gen = ({ origin_path }) => {
12
12
  const package_json = load_package_json();
13
- const src_json = create_src_json(package_json);
13
+ const src_json = create_src_json(package_json, undefined);
14
14
  return `
15
15
  // generated by ${origin_path}
16
16
 
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.155.0',
4
+ version: '0.157.0',
5
5
  description: 'task runner and toolkit extending SvelteKit',
6
6
  motto: 'generate, run, optimize',
7
7
  glyph: '🌰',
@@ -44,15 +44,14 @@ export const package_json = {
44
44
  dotenv: '^16.5.0',
45
45
  'esm-env': '^1.2.2',
46
46
  mri: '^1.2.0',
47
- 'oxc-parser': '^0.67.0',
47
+ 'oxc-parser': '^0.68.1',
48
48
  prettier: '^3.5.3',
49
49
  'prettier-plugin-svelte': '^3.3.3',
50
50
  'ts-blank-space': '^0.6.1',
51
- 'ts-morph': '^25.0.1',
52
51
  tslib: '^2.8.1',
53
- zod: '^3.24.3',
52
+ zod: '^3.24.4',
54
53
  },
55
- peerDependencies: { esbuild: '^0.25', svelte: '^5' },
54
+ peerDependencies: { esbuild: '^0.25', svelte: '^5', typescript: '^5' },
56
55
  devDependencies: {
57
56
  '@changesets/changelog-git': '^0.2.1',
58
57
  '@changesets/types': '^6.1.0',
@@ -65,12 +64,12 @@ export const package_json = {
65
64
  '@sveltejs/vite-plugin-svelte': '^5.0.3',
66
65
  '@types/node': '^22.15.3',
67
66
  esbuild: '^0.25.3',
68
- eslint: '^9.25.1',
67
+ eslint: '9.25.1',
69
68
  'eslint-plugin-svelte': '^3.5.1',
70
69
  svelte: '^5.28.2',
71
- 'svelte-check': '^4.1.6',
70
+ 'svelte-check': '^4.1.7',
72
71
  typescript: '^5.8.3',
73
- 'typescript-eslint': '^8.31.1',
72
+ 'typescript-eslint': '^8.32.0',
74
73
  uvu: '^0.5.6',
75
74
  },
76
75
  optionalDependencies: { '@ryanatkn/moss': '>=0.27.0 <0.29.0' },
@@ -186,6 +185,11 @@ export const package_json = {
186
185
  './package_meta.js': { types: './dist/package_meta.d.ts', default: './dist/package_meta.js' },
187
186
  './package.gen.js': { types: './dist/package.gen.d.ts', default: './dist/package.gen.js' },
188
187
  './package.js': { types: './dist/package.d.ts', default: './dist/package.js' },
188
+ './parse_exports_context.js': {
189
+ types: './dist/parse_exports_context.d.ts',
190
+ default: './dist/parse_exports_context.js',
191
+ },
192
+ './parse_exports.js': { types: './dist/parse_exports.d.ts', default: './dist/parse_exports.js' },
189
193
  './parse_imports.js': { types: './dist/parse_imports.d.ts', default: './dist/parse_imports.js' },
190
194
  './path.js': { types: './dist/path.d.ts', default: './dist/path.js' },
191
195
  './paths.js': { types: './dist/paths.d.ts', default: './dist/paths.js' },
@@ -208,10 +212,6 @@ export const package_json = {
208
212
  './search_fs.js': { types: './dist/search_fs.d.ts', default: './dist/search_fs.js' },
209
213
  './src_json.js': { types: './dist/src_json.d.ts', default: './dist/src_json.js' },
210
214
  './svelte_config.js': { types: './dist/svelte_config.d.ts', default: './dist/svelte_config.js' },
211
- './svelte_helpers.js': {
212
- types: './dist/svelte_helpers.d.ts',
213
- default: './dist/svelte_helpers.js',
214
- },
215
215
  './sveltekit_helpers.js': {
216
216
  types: './dist/sveltekit_helpers.d.ts',
217
217
  default: './dist/sveltekit_helpers.js',
@@ -247,6 +247,7 @@ export const package_json = {
247
247
  './sync.task.js': { types: './dist/sync.task.d.ts', default: './dist/sync.task.js' },
248
248
  './task_logging.js': { types: './dist/task_logging.d.ts', default: './dist/task_logging.js' },
249
249
  './task.js': { types: './dist/task.d.ts', default: './dist/task.js' },
250
+ './test_helpers.js': { types: './dist/test_helpers.d.ts', default: './dist/test_helpers.js' },
250
251
  './test.task.js': { types: './dist/test.task.d.ts', default: './dist/test.task.js' },
251
252
  './typecheck.task.js': {
252
253
  types: './dist/typecheck.task.d.ts',
@@ -258,7 +259,7 @@ export const package_json = {
258
259
  };
259
260
  export const src_json = {
260
261
  name: '@ryanatkn/gro',
261
- version: '0.155.0',
262
+ version: '0.157.0',
262
263
  modules: {
263
264
  '.': {
264
265
  path: 'index.ts',
@@ -275,7 +276,7 @@ export const src_json = {
275
276
  { name: 'Task_Error', kind: 'class' },
276
277
  ],
277
278
  },
278
- './package.json': { path: 'package.json', declarations: [] },
279
+ './package.json': { path: 'package.json', declarations: [{ name: 'default', kind: 'json' }] },
279
280
  './args.js': {
280
281
  path: 'args.ts',
281
282
  declarations: [
@@ -387,6 +388,8 @@ export const src_json = {
387
388
  { name: 'TS_MATCHER', kind: 'variable' },
388
389
  { name: 'JS_MATCHER', kind: 'variable' },
389
390
  { name: 'JSON_MATCHER', kind: 'variable' },
391
+ { name: 'SVELTE_MATCHER', kind: 'variable' },
392
+ { name: 'SVELTE_RUNES_MATCHER', kind: 'variable' },
390
393
  { name: 'SVELTE_SCRIPT_MATCHER', kind: 'variable' },
391
394
  { name: 'EVERYTHING_MATCHER', kind: 'variable' },
392
395
  { name: 'JS_CLI_DEFAULT', kind: 'variable' },
@@ -731,6 +734,21 @@ export const src_json = {
731
734
  { name: 'src_json', kind: 'variable' },
732
735
  ],
733
736
  },
737
+ './parse_exports_context.js': {
738
+ path: 'parse_exports_context.ts',
739
+ declarations: [{ name: 'Parse_Exports_Context', kind: 'class' }],
740
+ },
741
+ './parse_exports.js': {
742
+ path: 'parse_exports.ts',
743
+ declarations: [
744
+ { name: 'Declaration_Kind', kind: 'type' },
745
+ { name: 'Declaration', kind: 'type' },
746
+ { name: 'Export_Declaration', kind: 'type' },
747
+ { name: 'parse_exports', kind: 'function' },
748
+ { name: 'infer_declarations_from_file_type', kind: 'function' },
749
+ { name: 'process_ts_exports', kind: 'function' },
750
+ ],
751
+ },
734
752
  './parse_imports.js': {
735
753
  path: 'parse_imports.ts',
736
754
  declarations: [
@@ -850,6 +868,7 @@ export const src_json = {
850
868
  './src_json.js': {
851
869
  path: 'src_json.ts',
852
870
  declarations: [
871
+ { name: 'Src_Module_Declaration_Kind', kind: 'variable' },
853
872
  { name: 'Src_Module_Declaration', kind: 'variable' },
854
873
  { name: 'Src_Module', kind: 'variable' },
855
874
  { name: 'Src_Modules', kind: 'variable' },
@@ -870,13 +889,6 @@ export const src_json = {
870
889
  { name: 'default_svelte_config', kind: 'variable' },
871
890
  ],
872
891
  },
873
- './svelte_helpers.js': {
874
- path: 'svelte_helpers.ts',
875
- declarations: [
876
- { name: 'SVELTE_MATCHER', kind: 'variable' },
877
- { name: 'SVELTE_RUNES_MATCHER', kind: 'variable' },
878
- ],
879
- },
880
892
  './sveltekit_helpers.js': {
881
893
  path: 'sveltekit_helpers.ts',
882
894
  declarations: [
@@ -998,6 +1010,15 @@ export const src_json = {
998
1010
  { name: 'validate_task_module', kind: 'function' },
999
1011
  ],
1000
1012
  },
1013
+ './test_helpers.js': {
1014
+ path: 'test_helpers.ts',
1015
+ declarations: [
1016
+ { name: 'SOME_PUBLIC_ENV_VAR_NAME', kind: 'variable' },
1017
+ { name: 'SOME_PUBLIC_ENV_VAR_VALUE', kind: 'variable' },
1018
+ { name: 'init_test_env', kind: 'function' },
1019
+ { name: 'create_ts_test_env', kind: 'function' },
1020
+ ],
1021
+ },
1001
1022
  './test.task.js': {
1002
1023
  path: 'test.task.ts',
1003
1024
  declarations: [
@@ -0,0 +1,20 @@
1
+ import ts from 'typescript';
2
+ import type { Flavored } from '@ryanatkn/belt/types.js';
3
+ import type { Path_Id } from './path.ts';
4
+ import type { Logger } from '@ryanatkn/belt/log.js';
5
+ export type Declaration_Kind = 'type' | 'function' | 'variable' | 'class' | 'component' | 'json' | 'css';
6
+ export interface Declaration {
7
+ name: string;
8
+ kind: Declaration_Kind | null;
9
+ }
10
+ export type Export_Declaration = Flavored<Declaration, 'Export_Declaration'>;
11
+ /**
12
+ * Parse exports from a file based on its file type and content.
13
+ */
14
+ export declare const parse_exports: (id: Path_Id, program?: ts.Program, declarations?: Array<Export_Declaration>, log?: Logger) => Array<Export_Declaration>;
15
+ export declare const infer_declarations_from_file_type: (file_path: Path_Id, declarations?: Array<Export_Declaration>) => Array<Export_Declaration>;
16
+ /**
17
+ * Process TypeScript exports, identifying their kinds.
18
+ */
19
+ export declare const process_ts_exports: (source_file: ts.SourceFile, program: ts.Program, exports: Array<ts.Symbol>, declarations?: Array<Export_Declaration>, log?: Logger) => Array<Export_Declaration>;
20
+ //# sourceMappingURL=parse_exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse_exports.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/parse_exports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AAEtD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAGvC,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,uBAAuB,CAAC;AAElD,MAAM,MAAM,gBAAgB,GACzB,MAAM,GACN,UAAU,GACV,UAAU,GACV,OAAO,GACP,WAAW,GACX,MAAM,GACN,KAAK,CAAC;AAET,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,aAAa,GACzB,IAAI,OAAO,EACX,UAAU,EAAE,CAAC,OAAO,EACpB,eAAc,KAAK,CAAC,kBAAkB,CAAM,EAC5C,MAAM,MAAM,KACV,KAAK,CAAC,kBAAkB,CAyB1B,CAAC;AAGF,eAAO,MAAM,iCAAiC,GAC7C,WAAW,OAAO,EAClB,eAAc,KAAK,CAAC,kBAAkB,CAAM,KAC1C,KAAK,CAAC,kBAAkB,CA4B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC9B,aAAa,EAAE,CAAC,UAAU,EAC1B,SAAS,EAAE,CAAC,OAAO,EACnB,SAAS,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EACzB,eAAc,KAAK,CAAC,kBAAkB,CAAM,EAC5C,MAAM,MAAM,KACV,KAAK,CAAC,kBAAkB,CAI1B,CAAC"}
@@ -0,0 +1,65 @@
1
+ import ts from 'typescript';
2
+ import { extname } from 'node:path';
3
+ import { TS_MATCHER } from "./constants.js";
4
+ import { Parse_Exports_Context } from "./parse_exports_context.js";
5
+ /**
6
+ * Parse exports from a file based on its file type and content.
7
+ */
8
+ export const parse_exports = (id, program, declarations = [], log) => {
9
+ // First, infer declarations based on file extension
10
+ infer_declarations_from_file_type(id, declarations);
11
+ // For TypeScript files with program, perform detailed export analysis
12
+ if (TS_MATCHER.test(id) && program) {
13
+ const source_file = program.getSourceFile(id);
14
+ if (!source_file)
15
+ return declarations;
16
+ const checker = program.getTypeChecker();
17
+ // Get the exports of the source file (module)
18
+ const symbol = checker.getSymbolAtLocation(source_file);
19
+ if (!symbol)
20
+ return declarations;
21
+ // Get the module exports
22
+ const exports = checker.getExportsOfModule(symbol);
23
+ // Process TypeScript declarations
24
+ const export_context = new Parse_Exports_Context(program, log);
25
+ export_context.analyze_source_file(source_file);
26
+ export_context.process_exports(source_file, exports, declarations);
27
+ }
28
+ return declarations;
29
+ };
30
+ // TODO temporary until proper type inference
31
+ export const infer_declarations_from_file_type = (file_path, declarations = []) => {
32
+ const extension = extname(file_path).toLowerCase();
33
+ switch (extension) {
34
+ case '.svelte': {
35
+ declarations.push({
36
+ name: 'default',
37
+ kind: 'component',
38
+ });
39
+ break;
40
+ }
41
+ case '.css': {
42
+ declarations.push({
43
+ name: 'default',
44
+ kind: 'css',
45
+ });
46
+ break;
47
+ }
48
+ case '.json': {
49
+ declarations.push({
50
+ name: 'default',
51
+ kind: 'json',
52
+ });
53
+ break;
54
+ }
55
+ }
56
+ return declarations;
57
+ };
58
+ /**
59
+ * Process TypeScript exports, identifying their kinds.
60
+ */
61
+ export const process_ts_exports = (source_file, program, exports, declarations = [], log) => {
62
+ const export_context = new Parse_Exports_Context(program, log);
63
+ export_context.analyze_source_file(source_file);
64
+ return export_context.process_exports(source_file, exports, declarations);
65
+ };
@@ -0,0 +1,21 @@
1
+ import ts from 'typescript';
2
+ import type { Logger } from '@ryanatkn/belt/log.js';
3
+ import type { Export_Declaration } from './parse_exports.ts';
4
+ /**
5
+ * A class to track export context and determine export kinds.
6
+ */
7
+ export declare class Parse_Exports_Context {
8
+ #private;
9
+ readonly log: Logger | undefined;
10
+ debug: boolean;
11
+ constructor(program: ts.Program, log?: Logger);
12
+ /**
13
+ * Analyze a source file to prepare for export processing.
14
+ */
15
+ analyze_source_file(source_file: ts.SourceFile): void;
16
+ /**
17
+ * Process a list of exported symbols and identify their kinds.
18
+ */
19
+ process_exports(source_file: ts.SourceFile, exports: Array<ts.Symbol>, declarations?: Array<Export_Declaration>): Array<Export_Declaration>;
20
+ }
21
+ //# sourceMappingURL=parse_exports_context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse_exports_context.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/parse_exports_context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,uBAAuB,CAAC;AAElD,OAAO,KAAK,EAAmB,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAE7E;;GAEG;AACH,qBAAa,qBAAqB;;IAQjC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,UAAwC;gBAEjC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM;IAc7C;;OAEG;IACH,mBAAmB,CAAC,WAAW,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI;IAerD;;OAEG;IACH,eAAe,CACd,WAAW,EAAE,EAAE,CAAC,UAAU,EAC1B,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EACzB,YAAY,GAAE,KAAK,CAAC,kBAAkB,CAAM,GAC1C,KAAK,CAAC,kBAAkB,CAAC;CA+U5B"}