@fastkit/plugboy 1.0.0-next.3 → 1.0.0-next.5

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/README.md CHANGED
@@ -190,18 +190,21 @@ export default defineProjectConfig({
190
190
 
191
191
  ### Custom Plugins
192
192
 
193
+ A plugin extends a tsdown (Rollup-compatible) plugin with an additional `hooks` field for plugboy lifecycle hooks. Use `definePlugin` to get type inference.
194
+
193
195
  ```typescript
194
- import type { Plugin } from '@fastkit/plugboy';
195
-
196
- const customPlugin = (): Plugin => ({
197
- name: 'custom-plugin',
198
- setup(workspace) {
199
- // Plugin initialization
200
- workspace.hooks.buildStart?.tap('custom-plugin', () => {
201
- console.log('Build started');
202
- });
203
- }
204
- });
196
+ import { definePlugin } from '@fastkit/plugboy';
197
+
198
+ const customPlugin = () =>
199
+ definePlugin({
200
+ name: 'custom-plugin',
201
+ hooks: {
202
+ // Called just before the workspace instance is created
203
+ setupWorkspace(ctx, getWorkspace) {
204
+ console.log('Setting up workspace:', ctx.json.name);
205
+ }
206
+ }
207
+ });
205
208
 
206
209
  export default defineWorkspaceConfig({
207
210
  plugins: [customPlugin()]
@@ -280,25 +283,30 @@ export default defineWorkspaceConfig({
280
283
  createVueJSXPlugin(),
281
284
  createSassPlugin()
282
285
  ],
283
- external: ['vue']
286
+ deps: {
287
+ neverBundle: ['vue']
288
+ }
284
289
  });
285
290
  ```
286
291
 
287
292
  ## Hook System
288
293
 
289
- ### Build Hooks
294
+ ### Lifecycle Hooks
290
295
 
291
296
  ```typescript
292
297
  export default defineWorkspaceConfig({
293
298
  hooks: {
294
- buildStart: () => {
295
- console.log('Build starting...');
299
+ // Called just before the workspace instance is created
300
+ setupWorkspace: (ctx, getWorkspace) => {
301
+ console.log('Setting up workspace:', ctx.json.name);
296
302
  },
297
- buildEnd: (result) => {
298
- console.log('Build completed:', result);
303
+ // Called after the workspace instance is created
304
+ createWorkspace: (workspace) => {
305
+ console.log('Workspace created:', workspace.name);
299
306
  },
300
- buildError: (error) => {
301
- console.error('Build failed:', error);
307
+ // Called just before package.json is modified and saved
308
+ preparePackageJSON: (json, workspace) => {
309
+ json.sideEffects = false;
302
310
  }
303
311
  }
304
312
  });
@@ -344,8 +352,7 @@ export default defineWorkspaceConfig({
344
352
 
345
353
  ### Main Dependencies
346
354
 
347
- - `esbuild`: High-speed JavaScript builder
348
- - `tsdown`: TypeScript build tool
355
+ - `tsdown`: High-speed TypeScript build tool (based on Rolldown)
349
356
  - `cac`: CLI creation library
350
357
  - `glob`: File matching
351
358
  - `cssnano`: CSS optimization
package/dist/cli.mjs CHANGED
@@ -1,9 +1,7 @@
1
- import { i as getWorkspace, t as generateWorkspace } from "./workspace-CVcq6W59.mjs";
1
+ import { i as getWorkspace, t as generateWorkspace } from "./workspace-VIdL5Yhp.mjs";
2
2
  import { cac } from "cac";
3
-
4
3
  //#region package.json
5
- var version = "1.0.0-next.3";
6
-
4
+ var version = "1.0.0-next.5";
7
5
  //#endregion
8
6
  //#region src/cli.ts
9
7
  async function main() {
@@ -34,7 +32,7 @@ async function main() {
34
32
  cli.parse();
35
33
  }
36
34
  main();
37
-
38
35
  //#endregion
39
36
  export { main };
37
+
40
38
  //# sourceMappingURL=cli.mjs.map
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["pkg.version"],"sources":["../package.json","../src/cli.ts"],"sourcesContent":["","import { cac } from 'cac';\nimport { getWorkspace, generateWorkspace } from './workspace';\nimport pkg from '../package.json';\n\nexport async function main() {\n const cli = cac('plugboy');\n cli.version(pkg.version);\n\n cli\n .command('json', 'Apply workspace settings in package.json.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n });\n\n cli\n .command('stub', 'Link workspace distributions and source directories.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.stub();\n });\n\n cli\n .command(\n 'build',\n 'Guess all entries in the workspace and bundle the source code.',\n )\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.build();\n });\n\n cli\n .command('clean', 'Deletes the distribution directory of the workspace.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.clean();\n });\n\n cli\n .command(\n 'generate [workspaceName]',\n 'Generate a workspace for your project.',\n )\n .alias('gen')\n .action(async (workspaceName: string | undefined, options) => {\n await generateWorkspace(workspaceName);\n });\n\n cli.help();\n cli.parse();\n}\n\nmain();\n"],"mappings":";;;;;;;;ACIA,eAAsB,OAAO;CAC3B,MAAM,MAAM,IAAI,UAAU;AAC1B,KAAI,QAAQA,QAAY;AAExB,KACG,QAAQ,QAAQ,4CAA4C,CAC5D,OAAO,OAAO,OAAO,YAAY;AAEhC,SADkB,MAAM,cAAc,EACtB,oBAAoB;GACpC;AAEJ,KACG,QAAQ,QAAQ,uDAAuD,CACvE,OAAO,OAAO,OAAO,YAAY;EAChC,MAAM,YAAY,MAAM,cAAc;AACtC,QAAM,UAAU,oBAAoB;AACpC,QAAM,UAAU,MAAM;GACtB;AAEJ,KACG,QACC,SACA,iEACD,CACA,OAAO,OAAO,OAAO,YAAY;EAChC,MAAM,YAAY,MAAM,cAAc;AACtC,QAAM,UAAU,oBAAoB;AACpC,QAAM,UAAU,OAAO;GACvB;AAEJ,KACG,QAAQ,SAAS,uDAAuD,CACxE,OAAO,OAAO,OAAO,YAAY;EAChC,MAAM,YAAY,MAAM,cAAc;AACtC,QAAM,UAAU,oBAAoB;AACpC,QAAM,UAAU,OAAO;GACvB;AAEJ,KACG,QACC,4BACA,yCACD,CACA,MAAM,MAAM,CACZ,OAAO,OAAO,eAAmC,YAAY;AAC5D,QAAM,kBAAkB,cAAc;GACtC;AAEJ,KAAI,MAAM;AACV,KAAI,OAAO;;AAGb,MAAM"}
1
+ {"version":3,"file":"cli.mjs","names":["pkg.version"],"sources":["../package.json","../src/cli.ts"],"sourcesContent":["","import { cac } from 'cac';\nimport { getWorkspace, generateWorkspace } from './workspace';\nimport pkg from '../package.json';\n\nexport async function main() {\n const cli = cac('plugboy');\n cli.version(pkg.version);\n\n cli\n .command('json', 'Apply workspace settings in package.json.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n });\n\n cli\n .command('stub', 'Link workspace distributions and source directories.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.stub();\n });\n\n cli\n .command(\n 'build',\n 'Guess all entries in the workspace and bundle the source code.',\n )\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.build();\n });\n\n cli\n .command('clean', 'Deletes the distribution directory of the workspace.')\n .action(async (files, options) => {\n const workspace = await getWorkspace();\n await workspace.preparePackageJSON();\n await workspace.clean();\n });\n\n cli\n .command(\n 'generate [workspaceName]',\n 'Generate a workspace for your project.',\n )\n .alias('gen')\n .action(async (workspaceName: string | undefined, options) => {\n await generateWorkspace(workspaceName);\n });\n\n cli.help();\n cli.parse();\n}\n\nmain();\n"],"mappings":";;;;;;ACIA,eAAsB,OAAO;CAC3B,MAAM,MAAM,IAAI,SAAS;CACzB,IAAI,QAAQA,OAAW;CAEvB,IACG,QAAQ,QAAQ,2CAA2C,CAAC,CAC5D,OAAO,OAAO,OAAO,YAAY;EAEhC,OAAM,MADkB,aAAa,EAAA,CACrB,mBAAmB;CACrC,CAAC;CAEH,IACG,QAAQ,QAAQ,sDAAsD,CAAC,CACvE,OAAO,OAAO,OAAO,YAAY;EAChC,MAAM,YAAY,MAAM,aAAa;EACrC,MAAM,UAAU,mBAAmB;EACnC,MAAM,UAAU,KAAK;CACvB,CAAC;CAEH,IACG,QACC,SACA,gEACF,CAAC,CACA,OAAO,OAAO,OAAO,YAAY;EAChC,MAAM,YAAY,MAAM,aAAa;EACrC,MAAM,UAAU,mBAAmB;EACnC,MAAM,UAAU,MAAM;CACxB,CAAC;CAEH,IACG,QAAQ,SAAS,sDAAsD,CAAC,CACxE,OAAO,OAAO,OAAO,YAAY;EAChC,MAAM,YAAY,MAAM,aAAa;EACrC,MAAM,UAAU,mBAAmB;EACnC,MAAM,UAAU,MAAM;CACxB,CAAC;CAEH,IACG,QACC,4BACA,wCACF,CAAC,CACA,MAAM,KAAK,CAAC,CACZ,OAAO,OAAO,eAAmC,YAAY;EAC5D,MAAM,kBAAkB,aAAa;CACvC,CAAC;CAEH,IAAI,KAAK;CACT,IAAI,MAAM;AACZ;AAEA,KAAK"}
@@ -1,5 +1,4 @@
1
1
  import postcss, { Root } from "postcss";
2
-
3
2
  //#region src/postcss/plugins/combine-rules.ts
4
3
  function buildFilterFn(spec) {
5
4
  return (rule) => {
@@ -60,7 +59,7 @@ function CombineRules(opts) {
60
59
  };
61
60
  }
62
61
  CombineRules.postcss = true;
63
-
64
62
  //#endregion
65
- export { CombineRules };
66
- //# sourceMappingURL=combine-rules-CWp-M491.mjs.map
63
+ export { CombineRules, CombineRules as default };
64
+
65
+ //# sourceMappingURL=combine-rules-DKihHyJd.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"combine-rules-CWp-M491.mjs","names":[],"sources":["../src/postcss/plugins/combine-rules.ts"],"sourcesContent":["import postcss, { Plugin, Root, Container, Rule } from 'postcss';\n\nexport type RuleFilter = string | RegExp;\n\nexport type RuleSpecFn = (rule: Rule) => boolean;\n\nexport type RuleSpec = RuleFilter[] | RuleSpecFn;\n\nexport interface CombineRulesOptions {\n rules: RuleSpec;\n}\n\nfunction buildFilterFn(spec: RuleSpec): RuleSpecFn {\n return (rule) => {\n if (typeof spec === 'function') return spec(rule);\n const { selector } = rule;\n return spec.some((target) => {\n if (typeof target === 'string') return selector === target;\n return target.test(selector);\n });\n };\n}\n\nexport function combineContainerRules(\n container: Container,\n filter: RuleSpecFn,\n) {\n const { nodes } = container;\n if (!nodes) return;\n\n const rules: Rule[] = (nodes as Rule[]).filter(filter);\n const combinedRules: { selector: string; rules: Rule[]; container: Rule }[] =\n [];\n rules.forEach((rule) => {\n const { selector } = rule;\n let combinedRule = combinedRules.find((c) => c.selector === selector);\n if (!combinedRule) {\n combinedRule = {\n selector,\n rules: [],\n container: rule,\n };\n combinedRules.push(combinedRule);\n }\n combinedRule.rules.push(rule);\n });\n\n combinedRules.forEach((combinedRule) => {\n combinedRule.rules.forEach((rule, index) => {\n if (index === 0) return;\n\n const { nodes } = rule;\n if (!nodes) return;\n nodes.forEach((node) => {\n combinedRule.container.append(node.clone());\n });\n rule.remove();\n });\n });\n}\n\nexport function combineRules(\n css: string | { toString(): string } | Root,\n opts: CombineRulesOptions,\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const filter = buildFilterFn(opts.rules);\n combineContainerRules(root, filter);\n root.walkAtRules((atRule) => {\n combineContainerRules(atRule, filter);\n });\n return root;\n}\n\nconst PLUGIN_NAME = 'combine-rules';\n\nexport function CombineRules(opts: CombineRulesOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n combineRules(root, opts);\n },\n };\n}\n\nCombineRules.postcss = true;\n\nexport default CombineRules;\n"],"mappings":";;;AAYA,SAAS,cAAc,MAA4B;AACjD,SAAQ,SAAS;AACf,MAAI,OAAO,SAAS,WAAY,QAAO,KAAK,KAAK;EACjD,MAAM,EAAE,aAAa;AACrB,SAAO,KAAK,MAAM,WAAW;AAC3B,OAAI,OAAO,WAAW,SAAU,QAAO,aAAa;AACpD,UAAO,OAAO,KAAK,SAAS;IAC5B;;;AAIN,SAAgB,sBACd,WACA,QACA;CACA,MAAM,EAAE,UAAU;AAClB,KAAI,CAAC,MAAO;CAEZ,MAAM,QAAiB,MAAiB,OAAO,OAAO;CACtD,MAAM,gBACJ,EAAE;AACJ,OAAM,SAAS,SAAS;EACtB,MAAM,EAAE,aAAa;EACrB,IAAI,eAAe,cAAc,MAAM,MAAM,EAAE,aAAa,SAAS;AACrE,MAAI,CAAC,cAAc;AACjB,kBAAe;IACb;IACA,OAAO,EAAE;IACT,WAAW;IACZ;AACD,iBAAc,KAAK,aAAa;;AAElC,eAAa,MAAM,KAAK,KAAK;GAC7B;AAEF,eAAc,SAAS,iBAAiB;AACtC,eAAa,MAAM,SAAS,MAAM,UAAU;AAC1C,OAAI,UAAU,EAAG;GAEjB,MAAM,EAAE,UAAU;AAClB,OAAI,CAAC,MAAO;AACZ,SAAM,SAAS,SAAS;AACtB,iBAAa,UAAU,OAAO,KAAK,OAAO,CAAC;KAC3C;AACF,QAAK,QAAQ;IACb;GACF;;AAGJ,SAAgB,aACd,KACA,MACM;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,IAAI;CAC3D,MAAM,SAAS,cAAc,KAAK,MAAM;AACxC,uBAAsB,MAAM,OAAO;AACnC,MAAK,aAAa,WAAW;AAC3B,wBAAsB,QAAQ,OAAO;GACrC;AACF,QAAO;;AAGT,MAAM,cAAc;AAEpB,SAAgB,aAAa,MAAmC;AAC9D,QAAO;EACL,eAAe;EACf,KAAK,MAAM;AACT,gBAAa,MAAM,KAAK;;EAE3B;;AAGH,aAAa,UAAU"}
1
+ {"version":3,"file":"combine-rules-DKihHyJd.mjs","names":[],"sources":["../src/postcss/plugins/combine-rules.ts"],"sourcesContent":["import postcss, { Plugin, Root, Container, Rule } from 'postcss';\n\nexport type RuleFilter = string | RegExp;\n\nexport type RuleSpecFn = (rule: Rule) => boolean;\n\nexport type RuleSpec = RuleFilter[] | RuleSpecFn;\n\nexport interface CombineRulesOptions {\n rules: RuleSpec;\n}\n\nfunction buildFilterFn(spec: RuleSpec): RuleSpecFn {\n return (rule) => {\n if (typeof spec === 'function') return spec(rule);\n const { selector } = rule;\n return spec.some((target) => {\n if (typeof target === 'string') return selector === target;\n return target.test(selector);\n });\n };\n}\n\nexport function combineContainerRules(\n container: Container,\n filter: RuleSpecFn,\n) {\n const { nodes } = container;\n if (!nodes) return;\n\n const rules: Rule[] = (nodes as Rule[]).filter(filter);\n const combinedRules: { selector: string; rules: Rule[]; container: Rule }[] =\n [];\n rules.forEach((rule) => {\n const { selector } = rule;\n let combinedRule = combinedRules.find((c) => c.selector === selector);\n if (!combinedRule) {\n combinedRule = {\n selector,\n rules: [],\n container: rule,\n };\n combinedRules.push(combinedRule);\n }\n combinedRule.rules.push(rule);\n });\n\n combinedRules.forEach((combinedRule) => {\n combinedRule.rules.forEach((rule, index) => {\n if (index === 0) return;\n\n const { nodes } = rule;\n if (!nodes) return;\n nodes.forEach((node) => {\n combinedRule.container.append(node.clone());\n });\n rule.remove();\n });\n });\n}\n\nexport function combineRules(\n css: string | { toString(): string } | Root,\n opts: CombineRulesOptions,\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const filter = buildFilterFn(opts.rules);\n combineContainerRules(root, filter);\n root.walkAtRules((atRule) => {\n combineContainerRules(atRule, filter);\n });\n return root;\n}\n\nconst PLUGIN_NAME = 'combine-rules';\n\nexport function CombineRules(opts: CombineRulesOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n combineRules(root, opts);\n },\n };\n}\n\nCombineRules.postcss = true;\n\nexport default CombineRules;\n"],"mappings":";;AAYA,SAAS,cAAc,MAA4B;CACjD,QAAQ,SAAS;EACf,IAAI,OAAO,SAAS,YAAY,OAAO,KAAK,IAAI;EAChD,MAAM,EAAE,aAAa;EACrB,OAAO,KAAK,MAAM,WAAW;GAC3B,IAAI,OAAO,WAAW,UAAU,OAAO,aAAa;GACpD,OAAO,OAAO,KAAK,QAAQ;EAC7B,CAAC;CACH;AACF;AAEA,SAAgB,sBACd,WACA,QACA;CACA,MAAM,EAAE,UAAU;CAClB,IAAI,CAAC,OAAO;CAEZ,MAAM,QAAiB,MAAiB,OAAO,MAAM;CACrD,MAAM,gBACJ,CAAC;CACH,MAAM,SAAS,SAAS;EACtB,MAAM,EAAE,aAAa;EACrB,IAAI,eAAe,cAAc,MAAM,MAAM,EAAE,aAAa,QAAQ;EACpE,IAAI,CAAC,cAAc;GACjB,eAAe;IACb;IACA,OAAO,CAAC;IACR,WAAW;GACb;GACA,cAAc,KAAK,YAAY;EACjC;EACA,aAAa,MAAM,KAAK,IAAI;CAC9B,CAAC;CAED,cAAc,SAAS,iBAAiB;EACtC,aAAa,MAAM,SAAS,MAAM,UAAU;GAC1C,IAAI,UAAU,GAAG;GAEjB,MAAM,EAAE,UAAU;GAClB,IAAI,CAAC,OAAO;GACZ,MAAM,SAAS,SAAS;IACtB,aAAa,UAAU,OAAO,KAAK,MAAM,CAAC;GAC5C,CAAC;GACD,KAAK,OAAO;EACd,CAAC;CACH,CAAC;AACH;AAEA,SAAgB,aACd,KACA,MACM;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;CAC1D,MAAM,SAAS,cAAc,KAAK,KAAK;CACvC,sBAAsB,MAAM,MAAM;CAClC,KAAK,aAAa,WAAW;EAC3B,sBAAsB,QAAQ,MAAM;CACtC,CAAC;CACD,OAAO;AACT;AAEA,MAAM,cAAc;AAEpB,SAAgB,aAAa,MAAmC;CAC9D,OAAO;EACL,eAAe;EACf,KAAK,MAAM;GACT,aAAa,MAAM,IAAI;EACzB;CACF;AACF;AAEA,aAAa,UAAU"}
@@ -1,3 +1,2 @@
1
- export * from "bundle-require"
2
-
3
- export { };
1
+ export * from "bundle-require";
2
+ export {};
@@ -1,3 +1,2 @@
1
- export * from "cac"
2
-
3
- export { };
1
+ export * from "cac";
2
+ export {};
@@ -1,3 +1,2 @@
1
- export * from "glob"
2
-
3
- export { };
1
+ export * from "glob";
2
+ export {};
@@ -1,3 +1,2 @@
1
- export * from "@inquirer/prompts"
2
-
3
- export { };
1
+ export * from "@inquirer/prompts";
2
+ export {};
@@ -1,3 +1,2 @@
1
- export * from "pkg-types"
2
-
3
- export { };
1
+ export * from "pkg-types";
2
+ export {};
@@ -1,8 +1,7 @@
1
1
  import sortPackageJson from "sort-package-json";
2
-
3
2
  //#region src/dependencies/sort-package-json.ts
4
3
  var sort_package_json_default = sortPackageJson;
5
-
6
4
  //#endregion
7
5
  export { sort_package_json_default as default };
6
+
8
7
  //# sourceMappingURL=sort-package-json.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sort-package-json.mjs","names":[],"sources":["../../src/dependencies/sort-package-json.ts"],"sourcesContent":["import sortPackageJson from 'sort-package-json';\n\nexport default sortPackageJson;\n"],"mappings":";;;AAEA,gCAAe"}
1
+ {"version":3,"file":"sort-package-json.mjs","names":[],"sources":["../../src/dependencies/sort-package-json.ts"],"sourcesContent":["import sortPackageJson from 'sort-package-json';\n\nexport default sortPackageJson;\n"],"mappings":";;AAEA,IAAA,4BAAe"}
@@ -1,3 +1,2 @@
1
- export * from "tsdown"
2
-
3
- export { };
1
+ export * from "tsdown";
2
+ export {};
@@ -1,5 +1,4 @@
1
1
  import postcss, { Root } from "postcss";
2
-
3
2
  //#region src/postcss/plugins/optimize-layer.ts
4
3
  function resolveFilter(spec, defaults) {
5
4
  if (!spec) return () => defaults;
@@ -52,7 +51,7 @@ function OptimizeLayer(opts) {
52
51
  };
53
52
  }
54
53
  OptimizeLayer.postcss = true;
55
-
56
54
  //#endregion
57
- export { OptimizeLayer };
58
- //# sourceMappingURL=optimize-layer-CK8NR_VC.mjs.map
55
+ export { OptimizeLayer, OptimizeLayer as default };
56
+
57
+ //# sourceMappingURL=optimize-layer-DZdbIjXg.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"optimize-layer-CK8NR_VC.mjs","names":[],"sources":["../src/postcss/plugins/optimize-layer.ts"],"sourcesContent":["import postcss, { AtRule, Plugin, Root } from 'postcss';\n\ntype Filter = (layerName: string, rule: AtRule) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nexport interface OptimizeLayerOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n}\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) =>\n conditions.some((condition) =>\n typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName),\n );\n}\n\ninterface Layer {\n name: string;\n rule: AtRule;\n}\n\nexport function optimizeLayer(\n css: string | { toString(): string } | Root,\n opts: OptimizeLayerOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const layers: Layer[] = [];\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const getLayer = (\n layerRule: AtRule,\n ): {\n layer: Layer;\n atFirst: boolean;\n } => {\n const name = layerRule.params;\n const layer = layers.find((_layer) => _layer.name === name);\n if (layer)\n return {\n layer,\n atFirst: false,\n };\n\n const created: Layer = { name, rule: layerRule };\n layers.push(created);\n return {\n layer: created,\n atFirst: true,\n };\n };\n\n root.walkAtRules('layer', (layerRule) => {\n if (layerRule.parent?.type !== 'root') return;\n const { params, nodes } = layerRule;\n if (!nodes || !include(params, layerRule) || exclude(params, layerRule))\n return;\n\n const { layer, atFirst } = getLayer(layerRule);\n\n if (atFirst) return;\n\n layerRule.nodes?.forEach((node) => {\n layer.rule.append(node.clone());\n });\n\n layerRule.remove();\n });\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-layer';\n\nexport function OptimizeLayer(opts?: OptimizeLayerOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeLayer(root, opts);\n },\n };\n}\n\nOptimizeLayer.postcss = true;\n\nexport default OptimizeLayer;\n"],"mappings":";;;AAWA,SAAS,cACP,MACA,UACQ;AACR,KAAI,CAAC,KAAM,cAAa;AACxB,KAAI,OAAO,SAAS,WAAY,QAAO;CACvC,MAAM,aAAa,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC,KAAK;AACtD,SAAQ,cACN,WAAW,MAAM,cACf,OAAO,cAAc,WACjB,UAAU,SAAS,UAAU,GAC7B,UAAU,KAAK,UAAU,CAC9B;;AAQL,SAAgB,cACd,KACA,OAA6B,EAAE,EACzB;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,IAAI;CAC3D,MAAM,SAAkB,EAAE;CAC1B,MAAM,UAAU,cAAc,KAAK,SAAS,KAAK;CACjD,MAAM,UAAU,cAAc,KAAK,SAAS,MAAM;CAElD,MAAM,YACJ,cAIG;EACH,MAAM,OAAO,UAAU;EACvB,MAAM,QAAQ,OAAO,MAAM,WAAW,OAAO,SAAS,KAAK;AAC3D,MAAI,MACF,QAAO;GACL;GACA,SAAS;GACV;EAEH,MAAM,UAAiB;GAAE;GAAM,MAAM;GAAW;AAChD,SAAO,KAAK,QAAQ;AACpB,SAAO;GACL,OAAO;GACP,SAAS;GACV;;AAGH,MAAK,YAAY,UAAU,cAAc;AACvC,MAAI,UAAU,QAAQ,SAAS,OAAQ;EACvC,MAAM,EAAE,QAAQ,UAAU;AAC1B,MAAI,CAAC,SAAS,CAAC,QAAQ,QAAQ,UAAU,IAAI,QAAQ,QAAQ,UAAU,CACrE;EAEF,MAAM,EAAE,OAAO,YAAY,SAAS,UAAU;AAE9C,MAAI,QAAS;AAEb,YAAU,OAAO,SAAS,SAAS;AACjC,SAAM,KAAK,OAAO,KAAK,OAAO,CAAC;IAC/B;AAEF,YAAU,QAAQ;GAClB;AAEF,QAAO;;AAGT,MAAM,cAAc;AAEpB,SAAgB,cAAc,MAAqC;AACjE,QAAO;EACL,eAAe;EACf,KAAK,MAAM;AACT,iBAAc,MAAM,KAAK;;EAE5B;;AAGH,cAAc,UAAU"}
1
+ {"version":3,"file":"optimize-layer-DZdbIjXg.mjs","names":[],"sources":["../src/postcss/plugins/optimize-layer.ts"],"sourcesContent":["import postcss, { AtRule, Plugin, Root } from 'postcss';\n\ntype Filter = (layerName: string, rule: AtRule) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nexport interface OptimizeLayerOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n}\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) =>\n conditions.some((condition) =>\n typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName),\n );\n}\n\ninterface Layer {\n name: string;\n rule: AtRule;\n}\n\nexport function optimizeLayer(\n css: string | { toString(): string } | Root,\n opts: OptimizeLayerOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const layers: Layer[] = [];\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const getLayer = (\n layerRule: AtRule,\n ): {\n layer: Layer;\n atFirst: boolean;\n } => {\n const name = layerRule.params;\n const layer = layers.find((_layer) => _layer.name === name);\n if (layer)\n return {\n layer,\n atFirst: false,\n };\n\n const created: Layer = { name, rule: layerRule };\n layers.push(created);\n return {\n layer: created,\n atFirst: true,\n };\n };\n\n root.walkAtRules('layer', (layerRule) => {\n if (layerRule.parent?.type !== 'root') return;\n const { params, nodes } = layerRule;\n if (!nodes || !include(params, layerRule) || exclude(params, layerRule))\n return;\n\n const { layer, atFirst } = getLayer(layerRule);\n\n if (atFirst) return;\n\n layerRule.nodes?.forEach((node) => {\n layer.rule.append(node.clone());\n });\n\n layerRule.remove();\n });\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-layer';\n\nexport function OptimizeLayer(opts?: OptimizeLayerOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeLayer(root, opts);\n },\n };\n}\n\nOptimizeLayer.postcss = true;\n\nexport default OptimizeLayer;\n"],"mappings":";;AAWA,SAAS,cACP,MACA,UACQ;CACR,IAAI,CAAC,MAAM,aAAa;CACxB,IAAI,OAAO,SAAS,YAAY,OAAO;CACvC,MAAM,aAAa,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;CACrD,QAAQ,cACN,WAAW,MAAM,cACf,OAAO,cAAc,WACjB,UAAU,SAAS,SAAS,IAC5B,UAAU,KAAK,SAAS,CAC9B;AACJ;AAOA,SAAgB,cACd,KACA,OAA6B,CAAC,GACxB;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;CAC1D,MAAM,SAAkB,CAAC;CACzB,MAAM,UAAU,cAAc,KAAK,SAAS,IAAI;CAChD,MAAM,UAAU,cAAc,KAAK,SAAS,KAAK;CAEjD,MAAM,YACJ,cAIG;EACH,MAAM,OAAO,UAAU;EACvB,MAAM,QAAQ,OAAO,MAAM,WAAW,OAAO,SAAS,IAAI;EAC1D,IAAI,OACF,OAAO;GACL;GACA,SAAS;EACX;EAEF,MAAM,UAAiB;GAAE;GAAM,MAAM;EAAU;EAC/C,OAAO,KAAK,OAAO;EACnB,OAAO;GACL,OAAO;GACP,SAAS;EACX;CACF;CAEA,KAAK,YAAY,UAAU,cAAc;EACvC,IAAI,UAAU,QAAQ,SAAS,QAAQ;EACvC,MAAM,EAAE,QAAQ,UAAU;EAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS,GACpE;EAEF,MAAM,EAAE,OAAO,YAAY,SAAS,SAAS;EAE7C,IAAI,SAAS;EAEb,UAAU,OAAO,SAAS,SAAS;GACjC,MAAM,KAAK,OAAO,KAAK,MAAM,CAAC;EAChC,CAAC;EAED,UAAU,OAAO;CACnB,CAAC;CAED,OAAO;AACT;AAEA,MAAM,cAAc;AAEpB,SAAgB,cAAc,MAAqC;CACjE,OAAO;EACL,eAAe;EACf,KAAK,MAAM;GACT,cAAc,MAAM,IAAI;EAC1B;CACF;AACF;AAEA,cAAc,UAAU"}
@@ -1,5 +1,4 @@
1
1
  import postcss, { AtRule, Root } from "postcss";
2
-
3
2
  //#region src/postcss/plugins/optimize-media.ts
4
3
  function resolveFilter(spec, defaults) {
5
4
  if (!spec) return () => defaults;
@@ -80,7 +79,7 @@ function OptimizeMedia(opts) {
80
79
  };
81
80
  }
82
81
  OptimizeMedia.postcss = true;
83
-
84
82
  //#endregion
85
- export { OptimizeMedia };
86
- //# sourceMappingURL=optimize-media-Bxy27Cj7.mjs.map
83
+ export { OptimizeMedia, OptimizeMedia as default };
84
+
85
+ //# sourceMappingURL=optimize-media-CocGC9bo.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"optimize-media-Bxy27Cj7.mjs","names":[],"sources":["../src/postcss/plugins/optimize-media.ts"],"sourcesContent":["import postcss, {\n AtRule,\n Plugin,\n Root,\n Container,\n ChildNode,\n Comment,\n} from 'postcss';\n\ninterface Media {\n query: string;\n rule: AtRule;\n container: Container;\n}\n\ntype Filter = (query: string, media: Media) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) =>\n conditions.some((condition) =>\n typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName),\n );\n}\n\ntype SortMedia = (a: Media, b: Media) => number;\n\nexport interface OptimizeMediaOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n sort?: SortMedia;\n}\n\nfunction parseMedia(mediaRule: AtRule): Media {\n const { params, parent } = mediaRule;\n if (!parent) {\n throw mediaRule.error('@media rules require a parent container.');\n }\n return {\n query: params,\n rule: mediaRule,\n container: parent,\n };\n}\n\nfunction isSourceMapAnnotation(node: ChildNode | undefined): node is Comment {\n if (!node) return false;\n if (node.type !== 'comment') return false;\n return node.text.toLowerCase().startsWith('# sourcemappingurl=');\n}\n\nfunction getSourceMapAnnotation(container: Container): ChildNode | undefined {\n const maybeAnnotation = container.last;\n if (isSourceMapAnnotation(maybeAnnotation)) {\n return maybeAnnotation;\n }\n}\n\nexport function optimizeMedia(\n css: string | { toString(): string } | Root,\n opts: OptimizeMediaOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const sourceMap = getSourceMapAnnotation(root);\n\n const containerMap = new Map<Container, Media[]>();\n\n root.walkAtRules('media', (mediaRule) => {\n const media = parseMedia(mediaRule);\n if (\n !mediaRule.nodes ||\n !include(media.query, media) ||\n exclude(media.query, media)\n )\n return;\n\n let bucket = containerMap.get(media.container);\n if (!bucket) {\n bucket = [];\n containerMap.set(media.container, bucket);\n }\n bucket.push(media);\n });\n\n containerMap.forEach((bucket, container) => {\n if (opts.sort) {\n bucket.sort(opts.sort);\n }\n\n const combinedRules: {\n query: string;\n medias: Media[];\n }[] = [];\n\n bucket.forEach((media) => {\n let rule = combinedRules.find((r) => r.query === media.query);\n if (!rule) {\n rule = { query: media.query, medias: [] };\n combinedRules.push(rule);\n }\n rule.medias.push(media);\n });\n\n combinedRules.forEach((rule) => {\n const nodes = rule.medias\n .map((media) => (media.rule.nodes || []).map((node) => node.clone()))\n .flat();\n const newAtRule = new AtRule({\n name: 'media',\n params: rule.query,\n nodes,\n });\n rule.medias.forEach((media) => media.rule.remove());\n container.append(newAtRule);\n });\n });\n\n containerMap.clear();\n\n if (sourceMap) {\n root.append(sourceMap);\n }\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-media';\n\nexport function OptimizeMedia(opts?: OptimizeMediaOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeMedia(root, opts);\n },\n };\n}\n\nOptimizeMedia.postcss = true;\n\nexport default OptimizeMedia;\n"],"mappings":";;;AAmBA,SAAS,cACP,MACA,UACQ;AACR,KAAI,CAAC,KAAM,cAAa;AACxB,KAAI,OAAO,SAAS,WAAY,QAAO;CACvC,MAAM,aAAa,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC,KAAK;AACtD,SAAQ,cACN,WAAW,MAAM,cACf,OAAO,cAAc,WACjB,UAAU,SAAS,UAAU,GAC7B,UAAU,KAAK,UAAU,CAC9B;;AAWL,SAAS,WAAW,WAA0B;CAC5C,MAAM,EAAE,QAAQ,WAAW;AAC3B,KAAI,CAAC,OACH,OAAM,UAAU,MAAM,2CAA2C;AAEnE,QAAO;EACL,OAAO;EACP,MAAM;EACN,WAAW;EACZ;;AAGH,SAAS,sBAAsB,MAA8C;AAC3E,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,KAAK,SAAS,UAAW,QAAO;AACpC,QAAO,KAAK,KAAK,aAAa,CAAC,WAAW,sBAAsB;;AAGlE,SAAS,uBAAuB,WAA6C;CAC3E,MAAM,kBAAkB,UAAU;AAClC,KAAI,sBAAsB,gBAAgB,CACxC,QAAO;;AAIX,SAAgB,cACd,KACA,OAA6B,EAAE,EACzB;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,IAAI;CAC3D,MAAM,UAAU,cAAc,KAAK,SAAS,KAAK;CACjD,MAAM,UAAU,cAAc,KAAK,SAAS,MAAM;CAElD,MAAM,YAAY,uBAAuB,KAAK;CAE9C,MAAM,+BAAe,IAAI,KAAyB;AAElD,MAAK,YAAY,UAAU,cAAc;EACvC,MAAM,QAAQ,WAAW,UAAU;AACnC,MACE,CAAC,UAAU,SACX,CAAC,QAAQ,MAAM,OAAO,MAAM,IAC5B,QAAQ,MAAM,OAAO,MAAM,CAE3B;EAEF,IAAI,SAAS,aAAa,IAAI,MAAM,UAAU;AAC9C,MAAI,CAAC,QAAQ;AACX,YAAS,EAAE;AACX,gBAAa,IAAI,MAAM,WAAW,OAAO;;AAE3C,SAAO,KAAK,MAAM;GAClB;AAEF,cAAa,SAAS,QAAQ,cAAc;AAC1C,MAAI,KAAK,KACP,QAAO,KAAK,KAAK,KAAK;EAGxB,MAAM,gBAGA,EAAE;AAER,SAAO,SAAS,UAAU;GACxB,IAAI,OAAO,cAAc,MAAM,MAAM,EAAE,UAAU,MAAM,MAAM;AAC7D,OAAI,CAAC,MAAM;AACT,WAAO;KAAE,OAAO,MAAM;KAAO,QAAQ,EAAE;KAAE;AACzC,kBAAc,KAAK,KAAK;;AAE1B,QAAK,OAAO,KAAK,MAAM;IACvB;AAEF,gBAAc,SAAS,SAAS;GAC9B,MAAM,QAAQ,KAAK,OAChB,KAAK,WAAW,MAAM,KAAK,SAAS,EAAE,EAAE,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,CACpE,MAAM;GACT,MAAM,YAAY,IAAI,OAAO;IAC3B,MAAM;IACN,QAAQ,KAAK;IACb;IACD,CAAC;AACF,QAAK,OAAO,SAAS,UAAU,MAAM,KAAK,QAAQ,CAAC;AACnD,aAAU,OAAO,UAAU;IAC3B;GACF;AAEF,cAAa,OAAO;AAEpB,KAAI,UACF,MAAK,OAAO,UAAU;AAGxB,QAAO;;AAGT,MAAM,cAAc;AAEpB,SAAgB,cAAc,MAAqC;AACjE,QAAO;EACL,eAAe;EACf,KAAK,MAAM;AACT,iBAAc,MAAM,KAAK;;EAE5B;;AAGH,cAAc,UAAU"}
1
+ {"version":3,"file":"optimize-media-CocGC9bo.mjs","names":[],"sources":["../src/postcss/plugins/optimize-media.ts"],"sourcesContent":["import postcss, {\n AtRule,\n Plugin,\n Root,\n Container,\n ChildNode,\n Comment,\n} from 'postcss';\n\ninterface Media {\n query: string;\n rule: AtRule;\n container: Container;\n}\n\ntype Filter = (query: string, media: Media) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nfunction resolveFilter(\n spec: FilterSpec | undefined,\n defaults: boolean,\n): Filter {\n if (!spec) return () => defaults;\n if (typeof spec === 'function') return spec;\n const conditions = Array.isArray(spec) ? spec : [spec];\n return (layerName) =>\n conditions.some((condition) =>\n typeof condition === 'string'\n ? layerName.includes(condition)\n : condition.test(layerName),\n );\n}\n\ntype SortMedia = (a: Media, b: Media) => number;\n\nexport interface OptimizeMediaOptions {\n include?: FilterSpec;\n exclude?: FilterSpec;\n sort?: SortMedia;\n}\n\nfunction parseMedia(mediaRule: AtRule): Media {\n const { params, parent } = mediaRule;\n if (!parent) {\n throw mediaRule.error('@media rules require a parent container.');\n }\n return {\n query: params,\n rule: mediaRule,\n container: parent,\n };\n}\n\nfunction isSourceMapAnnotation(node: ChildNode | undefined): node is Comment {\n if (!node) return false;\n if (node.type !== 'comment') return false;\n return node.text.toLowerCase().startsWith('# sourcemappingurl=');\n}\n\nfunction getSourceMapAnnotation(container: Container): ChildNode | undefined {\n const maybeAnnotation = container.last;\n if (isSourceMapAnnotation(maybeAnnotation)) {\n return maybeAnnotation;\n }\n}\n\nexport function optimizeMedia(\n css: string | { toString(): string } | Root,\n opts: OptimizeMediaOptions = {},\n): Root {\n const root = css instanceof Root ? css : postcss.parse(css);\n const include = resolveFilter(opts.include, true);\n const exclude = resolveFilter(opts.exclude, false);\n\n const sourceMap = getSourceMapAnnotation(root);\n\n const containerMap = new Map<Container, Media[]>();\n\n root.walkAtRules('media', (mediaRule) => {\n const media = parseMedia(mediaRule);\n if (\n !mediaRule.nodes ||\n !include(media.query, media) ||\n exclude(media.query, media)\n )\n return;\n\n let bucket = containerMap.get(media.container);\n if (!bucket) {\n bucket = [];\n containerMap.set(media.container, bucket);\n }\n bucket.push(media);\n });\n\n containerMap.forEach((bucket, container) => {\n if (opts.sort) {\n bucket.sort(opts.sort);\n }\n\n const combinedRules: {\n query: string;\n medias: Media[];\n }[] = [];\n\n bucket.forEach((media) => {\n let rule = combinedRules.find((r) => r.query === media.query);\n if (!rule) {\n rule = { query: media.query, medias: [] };\n combinedRules.push(rule);\n }\n rule.medias.push(media);\n });\n\n combinedRules.forEach((rule) => {\n const nodes = rule.medias\n .map((media) => (media.rule.nodes || []).map((node) => node.clone()))\n .flat();\n const newAtRule = new AtRule({\n name: 'media',\n params: rule.query,\n nodes,\n });\n rule.medias.forEach((media) => media.rule.remove());\n container.append(newAtRule);\n });\n });\n\n containerMap.clear();\n\n if (sourceMap) {\n root.append(sourceMap);\n }\n\n return root;\n}\n\nconst PLUGIN_NAME = 'optimize-media';\n\nexport function OptimizeMedia(opts?: OptimizeMediaOptions): Plugin {\n return {\n postcssPlugin: PLUGIN_NAME,\n Once(root) {\n optimizeMedia(root, opts);\n },\n };\n}\n\nOptimizeMedia.postcss = true;\n\nexport default OptimizeMedia;\n"],"mappings":";;AAmBA,SAAS,cACP,MACA,UACQ;CACR,IAAI,CAAC,MAAM,aAAa;CACxB,IAAI,OAAO,SAAS,YAAY,OAAO;CACvC,MAAM,aAAa,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;CACrD,QAAQ,cACN,WAAW,MAAM,cACf,OAAO,cAAc,WACjB,UAAU,SAAS,SAAS,IAC5B,UAAU,KAAK,SAAS,CAC9B;AACJ;AAUA,SAAS,WAAW,WAA0B;CAC5C,MAAM,EAAE,QAAQ,WAAW;CAC3B,IAAI,CAAC,QACH,MAAM,UAAU,MAAM,0CAA0C;CAElE,OAAO;EACL,OAAO;EACP,MAAM;EACN,WAAW;CACb;AACF;AAEA,SAAS,sBAAsB,MAA8C;CAC3E,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,KAAK,SAAS,WAAW,OAAO;CACpC,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC,WAAW,qBAAqB;AACjE;AAEA,SAAS,uBAAuB,WAA6C;CAC3E,MAAM,kBAAkB,UAAU;CAClC,IAAI,sBAAsB,eAAe,GACvC,OAAO;AAEX;AAEA,SAAgB,cACd,KACA,OAA6B,CAAC,GACxB;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;CAC1D,MAAM,UAAU,cAAc,KAAK,SAAS,IAAI;CAChD,MAAM,UAAU,cAAc,KAAK,SAAS,KAAK;CAEjD,MAAM,YAAY,uBAAuB,IAAI;CAE7C,MAAM,+BAAe,IAAI,IAAwB;CAEjD,KAAK,YAAY,UAAU,cAAc;EACvC,MAAM,QAAQ,WAAW,SAAS;EAClC,IACE,CAAC,UAAU,SACX,CAAC,QAAQ,MAAM,OAAO,KAAK,KAC3B,QAAQ,MAAM,OAAO,KAAK,GAE1B;EAEF,IAAI,SAAS,aAAa,IAAI,MAAM,SAAS;EAC7C,IAAI,CAAC,QAAQ;GACX,SAAS,CAAC;GACV,aAAa,IAAI,MAAM,WAAW,MAAM;EAC1C;EACA,OAAO,KAAK,KAAK;CACnB,CAAC;CAED,aAAa,SAAS,QAAQ,cAAc;EAC1C,IAAI,KAAK,MACP,OAAO,KAAK,KAAK,IAAI;EAGvB,MAAM,gBAGA,CAAC;EAEP,OAAO,SAAS,UAAU;GACxB,IAAI,OAAO,cAAc,MAAM,MAAM,EAAE,UAAU,MAAM,KAAK;GAC5D,IAAI,CAAC,MAAM;IACT,OAAO;KAAE,OAAO,MAAM;KAAO,QAAQ,CAAC;IAAE;IACxC,cAAc,KAAK,IAAI;GACzB;GACA,KAAK,OAAO,KAAK,KAAK;EACxB,CAAC;EAED,cAAc,SAAS,SAAS;GAC9B,MAAM,QAAQ,KAAK,OAChB,KAAK,WAAW,MAAM,KAAK,SAAS,CAAC,EAAA,CAAG,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CACpE,KAAK;GACR,MAAM,YAAY,IAAI,OAAO;IAC3B,MAAM;IACN,QAAQ,KAAK;IACb;GACF,CAAC;GACD,KAAK,OAAO,SAAS,UAAU,MAAM,KAAK,OAAO,CAAC;GAClD,UAAU,OAAO,SAAS;EAC5B,CAAC;CACH,CAAC;CAED,aAAa,MAAM;CAEnB,IAAI,WACF,KAAK,OAAO,SAAS;CAGvB,OAAO;AACT;AAEA,MAAM,cAAc;AAEpB,SAAgB,cAAc,MAAqC;CACjE,OAAO;EACL,eAAe;EACf,KAAK,MAAM;GACT,cAAc,MAAM,IAAI;EAC1B;CACF;AACF;AAEA,cAAc,UAAU"}