@animus-ui/next-plugin 0.1.2 → 0.1.4

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
@@ -60,9 +60,9 @@ it in a server-only module and inline it as the first child of `<head>`.
60
60
  // appearance-bootstrap.ts — server-only; never import from a client component
61
61
  import { createAppearanceBootstrap } from '@animus-ui/system/bootstrap';
62
62
 
63
- import { tokens } from './src/ds';
63
+ import { theme } from './src/ds';
64
64
 
65
- export const appearanceBootstrap = createAppearanceBootstrap(tokens);
65
+ export const appearanceBootstrap = createAppearanceBootstrap(theme);
66
66
  ```
67
67
 
68
68
  ```tsx
@@ -31,6 +31,10 @@ export declare class ExtractionSession {
31
31
  rootDir: string | null;
32
32
  /** Serialized path aliases, harvested by the adapter from bundler config. */
33
33
  pathAliasesJson: string | null;
34
+ private assetCopyCache;
35
+ /** Physical asset files registered with the host watcher. */
36
+ assetDependencyPaths: Set<string>;
37
+ private assetDependencyKeys;
34
38
  /** When set (Turbopack orchestration), every analysis also persists
35
39
  * `.animus/analysis-inputs.json` so isolated loader workers can hydrate.
36
40
  * Webpack mode leaves this off — its loader shares the process. */
@@ -42,6 +46,10 @@ export declare class ExtractionSession {
42
46
  systemPropsModuleId: string | null;
43
47
  /** Absolute directory prefixes for external DS packages (loader allowlisting). */
44
48
  externalPackageDirs: string[];
49
+ /** Absolute package dir → owning specifier (cross-source correlation). */
50
+ private externalDirOwners;
51
+ /** rootDir-relative external file → owning specifier (correlation join). */
52
+ private externalFileOwners;
45
53
  /** External package specifier → absolute source entry path. */
46
54
  externalSourceEntries: Map<string, string>;
47
55
  private readonly options;
@@ -134,5 +142,34 @@ export declare class ExtractionSession {
134
142
  * pid — Next dev evaluates the config in more than one process, and two
135
143
  * sessions writing the same artifact must not race on one tmp path. */
136
144
  private writeAnimusFile;
145
+ /**
146
+ * asset() placeholder substitution (global-styles-system): resolve each
147
+ * referenced specifier through Node resolution, copy the bytes into
148
+ * `.animus/assets/` under a content-hashed name, and substitute a
149
+ * RELATIVE url. `.animus/styles.css` is processed by Next's own CSS
150
+ * pipeline (webpack and Turbopack alike), which applies its native asset
151
+ * handling — publicPath and output hashing — to relative url()
152
+ * references. Unsubstitutable specifiers warn and emit literally in
153
+ * non-strict mode, fail the build under `strict: true`.
154
+ */
155
+ private substituteAssetReferences;
156
+ private trackAssetDependency;
157
+ /**
158
+ * Resolve an asset specifier to an absolute file via the shared pipeline
159
+ * resolver (host aliases → Node resolution → package root), with one
160
+ * session-local last resort: an already-discovered source entry's package
161
+ * root (dist-less workspace kits the shared resolver cannot see).
162
+ */
163
+ private resolveAssetSpecifier;
137
164
  }
165
+ /**
166
+ * Sync `.animus/assets/` to the current build's content-hashed file set:
167
+ * anything else in the directory is a superseded revision (the copies are
168
+ * content-addressed and never overwritten) or the leftover of an asset()
169
+ * reference that no longer exists. Failures are tolerated per entry — Next
170
+ * dev evaluates the config in more than one process, and a concurrent
171
+ * session may have removed (or be about to rewrite) the same file; every
172
+ * pass rewrites whatever of its own set is missing, so races self-heal.
173
+ */
174
+ export declare function pruneStaleAssets(assetsDir: string, expected: ReadonlySet<string>): void;
138
175
  //# sourceMappingURL=extraction-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extraction-session.d.ts","sourceRoot":"","sources":["../src/extraction-session.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAOjD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AAczD,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,iBAAiB;IAC5B,kDAAkD;IAClD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9B,6EAA6E;IAC7E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC;;wEAEoE;IACpE,qBAAqB,UAAS;IAC9B;;;2EAGuE;IACvE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,kFAAkF;IAClF,mBAAmB,EAAE,MAAM,EAAE,CAAM;IACnC,+DAA+D;IAC/D,qBAAqB,sBAA6B;IAElD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,MAAM,CAA6B;IAC3C;iFAC6E;IAC7E,OAAO,CAAC,cAAc,CAA8B;IAGpD,OAAO,CAAC,SAAS,CAAuD;IAMxE,OAAO,CAAC,oBAAoB,CAA0B;IAEtD,uEAAuE;IACvE,qBAAqB,EAAE,MAAM,EAAE,CAAM;IAKrC,OAAO,CAAC,sBAAsB,CAAkC;IAChE,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,sBAAsB,CAAuB;IAGrD,OAAO,CAAC,WAAW,CAAiC;IAEpD,YAAY,OAAO,EAAE,iBAAiB,EAKrC;IAED,IAAI,OAAO,IAAI,OAAO,CAMrB;IAED,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,OAAO;IAIf;iFAC6E;IAC7E,OAAO,CAAC,iBAAiB;IAezB;;;;OAIG;IACG,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA0I5D;IAED;;;;;;;;;OASG;YACW,kBAAkB;IA2B1B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAmJrC;IAED;;OAEG;IACH,WAAW,IAAI,IAAI,CAOlB;IAED;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;;OAGG;YACW,sBAAsB;IAmBpC;;;;;;;;;;;;;;;;;OAiBG;YACW,cAAc;IAmJ5B;;;;sBAIkB;IAClB,OAAO,CAAC,gBAAgB;IAUxB;;;;4EAIwE;IACxE,OAAO,CAAC,eAAe;CASxB"}
1
+ {"version":3,"file":"extraction-session.d.ts","sourceRoot":"","sources":["../src/extraction-session.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAOjD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AAczD,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,iBAAiB;IAC5B,kDAAkD;IAClD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9B,6EAA6E;IAC7E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAItC,OAAO,CAAC,cAAc,CASlB;IACJ,6DAA6D;IAC7D,oBAAoB,cAAqB;IACzC,OAAO,CAAC,mBAAmB,CAAqB;IAChD;;wEAEoE;IACpE,qBAAqB,UAAS;IAC9B;;;2EAGuE;IACvE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,kFAAkF;IAClF,mBAAmB,EAAE,MAAM,EAAE,CAAM;IACnC,0EAA0E;IAC1E,OAAO,CAAC,iBAAiB,CAA8B;IACvD,4EAA4E;IAC5E,OAAO,CAAC,kBAAkB,CAA8B;IACxD,+DAA+D;IAC/D,qBAAqB,sBAA6B;IAElD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,MAAM,CAA6B;IAC3C;iFAC6E;IAC7E,OAAO,CAAC,cAAc,CAA8B;IAGpD,OAAO,CAAC,SAAS,CAAuD;IAMxE,OAAO,CAAC,oBAAoB,CAA0B;IAEtD,uEAAuE;IACvE,qBAAqB,EAAE,MAAM,EAAE,CAAM;IAKrC,OAAO,CAAC,sBAAsB,CAAkC;IAChE,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,sBAAsB,CAAuB;IAGrD,OAAO,CAAC,WAAW,CAAiC;IAEpD,YAAY,OAAO,EAAE,iBAAiB,EAKrC;IAED,IAAI,OAAO,IAAI,OAAO,CAMrB;IAED,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,OAAO;IAIf;iFAC6E;IAC7E,OAAO,CAAC,iBAAiB;IAezB;;;;OAIG;IACG,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8J5D;IAED;;;;;;;;;OASG;YACW,kBAAkB;IA2B1B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA+KrC;IAED;;OAEG;IACH,WAAW,IAAI,IAAI,CAOlB;IAED;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;;OAGG;YACW,sBAAsB;IAmBpC;;;;;;;;;;;;;;;;;OAiBG;YACW,cAAc;IA0K5B;;;;sBAIkB;IAClB,OAAO,CAAC,gBAAgB;IAUxB;;;;4EAIwE;IACxE,OAAO,CAAC,eAAe;IAUvB;;;;;;;;;OASG;IACH,OAAO,CAAC,yBAAyB;IA2EjC,OAAO,CAAC,oBAAoB;IAK5B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;CA0B9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,IAAI,CAgBN"}
package/dist/index.cjs CHANGED
@@ -124,6 +124,10 @@ var ExtractionSession = class {
124
124
  rootDir = null;
125
125
  /** Serialized path aliases, harvested by the adapter from bundler config. */
126
126
  pathAliasesJson = null;
127
+ assetCopyCache = /* @__PURE__ */ new Map();
128
+ /** Physical asset files registered with the host watcher. */
129
+ assetDependencyPaths = /* @__PURE__ */ new Set();
130
+ assetDependencyKeys = /* @__PURE__ */ new Set();
127
131
  /** When set (Turbopack orchestration), every analysis also persists
128
132
  * `.animus/analysis-inputs.json` so isolated loader workers can hydrate.
129
133
  * Webpack mode leaves this off — its loader shares the process. */
@@ -135,6 +139,10 @@ var ExtractionSession = class {
135
139
  systemPropsModuleId = null;
136
140
  /** Absolute directory prefixes for external DS packages (loader allowlisting). */
137
141
  externalPackageDirs = [];
142
+ /** Absolute package dir → owning specifier (cross-source correlation). */
143
+ externalDirOwners = {};
144
+ /** rootDir-relative external file → owning specifier (correlation join). */
145
+ externalFileOwners = {};
138
146
  /** External package specifier → absolute source entry path. */
139
147
  externalSourceEntries = /* @__PURE__ */ new Map();
140
148
  options;
@@ -190,6 +198,7 @@ var ExtractionSession = class {
190
198
  async handleWatchUpdate(changes) {
191
199
  if (!this.system) return;
192
200
  const rootDir = this.rootDir;
201
+ let assetChanged = false;
193
202
  try {
194
203
  let systemHit;
195
204
  if (!changes.modifiedFiles && !changes.removedFiles) for (const [dep, hash] of this.systemDependencyHashes) {
@@ -211,6 +220,10 @@ var ExtractionSession = class {
211
220
  await promise;
212
221
  return;
213
222
  }
223
+ if ([...changes.modifiedFiles ?? [], ...changes.removedFiles ?? []].some((path$3) => (0, _animus_ui_extract_pipeline.toWatchKeys)(path$3).some((key) => this.assetDependencyKeys.has(key)))) {
224
+ this.assetCopyCache.clear();
225
+ assetChanged = true;
226
+ }
214
227
  } catch (err) {
215
228
  this.warn(`HMR geological-reset check failed: ${String(err)}`);
216
229
  }
@@ -256,7 +269,7 @@ var ExtractionSession = class {
256
269
  });
257
270
  }
258
271
  }
259
- if (changedPaths.length > 0 || removedAny) {
272
+ if (changedPaths.length > 0 || removedAny || assetChanged) {
260
273
  const fileEntries = this.buildFileEntriesFromCache();
261
274
  require_singleton.resetAnalysisPromise();
262
275
  const promise = this.runIncrementalPipeline(fileEntries);
@@ -304,6 +317,9 @@ var ExtractionSession = class {
304
317
  rootDir,
305
318
  prefix: this.options.prefix
306
319
  });
320
+ this.assetCopyCache.clear();
321
+ this.assetDependencyPaths.clear();
322
+ this.assetDependencyKeys.clear();
307
323
  {
308
324
  const deps = this.system.dependencies ?? [];
309
325
  const keys = /* @__PURE__ */ new Set();
@@ -374,8 +390,20 @@ var ExtractionSession = class {
374
390
  onUnreadable: (relPath, err) => this.warn(`skipped unreadable package file ${relPath}: ${String(err)}`)
375
391
  });
376
392
  for (const record of collected.outcomes) if (record.outcome === "empty") this.warn(`include '${record.specifier}' resolved but discovered no component sources`);
393
+ const unresolvableMessage = (0, _animus_ui_extract_pipeline.unresolvableIncludesMessage)(collected.outcomes);
394
+ if (unresolvableMessage !== null) {
395
+ if (this.options.strict) throw new Error(unresolvableMessage);
396
+ this.warn(unresolvableMessage);
397
+ }
398
+ const staleDistMessage = (0, _animus_ui_extract_pipeline.staleDistIncludesMessage)(collected.outcomes);
399
+ if (staleDistMessage !== null) {
400
+ if (this.options.strict) throw new Error(staleDistMessage);
401
+ this.warn(staleDistMessage);
402
+ }
377
403
  const packageMap = collected.packageMap;
378
404
  this.lastPackageMap = packageMap;
405
+ this.externalDirOwners = collected.dirOwners;
406
+ this.externalFileOwners = collected.fileOwners;
379
407
  this.externalSourceEntries = collected.sourceEntries;
380
408
  for (const entry of collected.entries) {
381
409
  const hash = (0, _animus_ui_extract_pipeline.contentHash)(entry.source);
@@ -414,8 +442,8 @@ var ExtractionSession = class {
414
442
  */
415
443
  buildFileEntriesFromCache() {
416
444
  const entries = [];
417
- for (const [path$3, { hash, source }] of this.fileCache) entries.push({
418
- path: path$3,
445
+ for (const [path$4, { hash, source }] of this.fileCache) entries.push({
446
+ path: path$4,
419
447
  source,
420
448
  hash
421
449
  });
@@ -461,9 +489,19 @@ var ExtractionSession = class {
461
489
  },
462
490
  pathAliasesJson: this.pathAliasesJson,
463
491
  staticCssJson: this.staticCssJson,
492
+ externalDirs: this.externalPackageDirs.map((dir) => (0, path.relative)(this.rootDir, dir)),
464
493
  devMode,
465
494
  warn: (message) => this.warn(message)
466
495
  });
496
+ (0, _animus_ui_extract_pipeline.enforceExternalTokenContracts)({
497
+ diagnostics: result.manifest?.diagnostics,
498
+ fileOwners: this.externalFileOwners,
499
+ dirOwners: this.externalDirOwners,
500
+ sourceThemeManifestsJson: system.sourceThemeManifestsJson,
501
+ strict: this.options.strict,
502
+ prefix: "[animus-next]",
503
+ warn: (message) => this.warn(message)
504
+ });
467
505
  bt.jsonSerialize = result.timings.serializeMs;
468
506
  bt.rustExtract = result.timings.extractMs;
469
507
  bt.jsonParse = result.timings.parseMs;
@@ -472,10 +510,11 @@ var ExtractionSession = class {
472
510
  bt.analysis = (bt.jsonSerialize ?? 0) + (bt.rustExtract ?? 0) + (bt.jsonParse ?? 0);
473
511
  if (manifest?.report) this.log(`Extracted ${manifest.report.components_extracted ?? "?"}/${manifest.report.components_total ?? "?"} components (${bt.analysis}ms)`);
474
512
  }
513
+ const globalCss = this.substituteAssetReferences(result.globalCss, devMode);
475
514
  const { declaration, variables, body } = (0, _animus_ui_extract_pipeline.assembleStylesheet)({
476
515
  layers: this.options.layers,
477
516
  variableCss: system.variableCss,
478
- globalCss: result.globalCss,
517
+ globalCss,
479
518
  componentCss: result.componentCss,
480
519
  split: true
481
520
  });
@@ -551,7 +590,113 @@ var ExtractionSession = class {
551
590
  (0, fs.writeFileSync)(tmpPath, content);
552
591
  (0, fs.renameSync)(tmpPath, (0, path.join)(dir, name));
553
592
  }
593
+ /**
594
+ * asset() placeholder substitution (global-styles-system): resolve each
595
+ * referenced specifier through Node resolution, copy the bytes into
596
+ * `.animus/assets/` under a content-hashed name, and substitute a
597
+ * RELATIVE url. `.animus/styles.css` is processed by Next's own CSS
598
+ * pipeline (webpack and Turbopack alike), which applies its native asset
599
+ * handling — publicPath and output hashing — to relative url()
600
+ * references. Unsubstitutable specifiers warn and emit literally in
601
+ * non-strict mode, fail the build under `strict: true`.
602
+ */
603
+ substituteAssetReferences(globalCss, devMode) {
604
+ const specifiers = (0, _animus_ui_extract_pipeline.findAssetSpecifiers)(globalCss);
605
+ const assetsDir = (0, path.join)(this.rootDir, ".animus", "assets");
606
+ const expected = /* @__PURE__ */ new Set();
607
+ this.assetDependencyPaths.clear();
608
+ this.assetDependencyKeys.clear();
609
+ const urlBySpecifier = /* @__PURE__ */ new Map();
610
+ for (const specifier of specifiers) {
611
+ const cached = this.assetCopyCache.get(specifier);
612
+ if (cached && (0, fs.existsSync)((0, path.join)(assetsDir, cached.fileName))) try {
613
+ const current = (0, fs.statSync)(cached.sourcePath);
614
+ if (current.mtimeMs === cached.mtimeMs && current.size === cached.size) {
615
+ this.trackAssetDependency(cached.sourcePath);
616
+ expected.add(cached.fileName);
617
+ urlBySpecifier.set(specifier, cached.url);
618
+ continue;
619
+ }
620
+ } catch {}
621
+ const resolvedPath = this.resolveAssetSpecifier(specifier);
622
+ if (!resolvedPath) {
623
+ const message = `unresolvable asset() specifier: ${specifier}`;
624
+ if (this.options.strict) throw new Error(`[animus-next] ${message}`);
625
+ this.warn(message);
626
+ urlBySpecifier.set(specifier, specifier);
627
+ continue;
628
+ }
629
+ const bytes = (0, fs.readFileSync)(resolvedPath);
630
+ const sourceStat = (0, fs.statSync)(resolvedPath);
631
+ this.trackAssetDependency(resolvedPath);
632
+ const ext = (0, path.extname)(resolvedPath);
633
+ const fileName = `${(0, path.basename)(resolvedPath, ext)}.${(0, _animus_ui_extract_pipeline.contentHash)(bytes).slice(0, 8)}${ext}`;
634
+ expected.add(fileName);
635
+ if (!(0, fs.existsSync)(assetsDir)) (0, fs.mkdirSync)(assetsDir, { recursive: true });
636
+ const assetPath = (0, path.join)(assetsDir, fileName);
637
+ if (!(0, fs.existsSync)(assetPath)) (0, fs.writeFileSync)(assetPath, bytes);
638
+ const url = `./assets/${fileName}`;
639
+ urlBySpecifier.set(specifier, url);
640
+ this.assetCopyCache.set(specifier, {
641
+ sourcePath: resolvedPath,
642
+ mtimeMs: sourceStat.mtimeMs,
643
+ size: sourceStat.size,
644
+ fileName,
645
+ url
646
+ });
647
+ }
648
+ if (!devMode) pruneStaleAssets(assetsDir, expected);
649
+ return (0, _animus_ui_extract_pipeline.substituteAssetPlaceholders)(globalCss, urlBySpecifier);
650
+ }
651
+ trackAssetDependency(path$5) {
652
+ this.assetDependencyPaths.add(path$5);
653
+ for (const key of (0, _animus_ui_extract_pipeline.toWatchKeys)(path$5)) this.assetDependencyKeys.add(key);
654
+ }
655
+ /**
656
+ * Resolve an asset specifier to an absolute file via the shared pipeline
657
+ * resolver (host aliases → Node resolution → package root), with one
658
+ * session-local last resort: an already-discovered source entry's package
659
+ * root (dist-less workspace kits the shared resolver cannot see).
660
+ */
661
+ resolveAssetSpecifier(specifier) {
662
+ const resolved = (0, _animus_ui_extract_pipeline.resolveAssetFile)(specifier, this.rootDir, this.pathAliasesJson);
663
+ if (resolved) return resolved;
664
+ const segments = specifier.split("/");
665
+ const packageName = specifier.startsWith("@") ? segments.slice(0, 2).join("/") : segments[0];
666
+ const subpath = specifier.slice(packageName.length + 1);
667
+ if (!subpath) return null;
668
+ const sourceEntry = this.externalSourceEntries.get(packageName) ?? [...this.externalSourceEntries].find(([declared]) => declared === packageName || declared.startsWith(`${packageName}/`))?.[1];
669
+ if (sourceEntry) {
670
+ const candidate = (0, path.join)((0, _animus_ui_extract_pipeline.findPackageRoot)(sourceEntry), subpath);
671
+ if ((0, fs.existsSync)(candidate)) return candidate;
672
+ }
673
+ return null;
674
+ }
554
675
  };
676
+ /**
677
+ * Sync `.animus/assets/` to the current build's content-hashed file set:
678
+ * anything else in the directory is a superseded revision (the copies are
679
+ * content-addressed and never overwritten) or the leftover of an asset()
680
+ * reference that no longer exists. Failures are tolerated per entry — Next
681
+ * dev evaluates the config in more than one process, and a concurrent
682
+ * session may have removed (or be about to rewrite) the same file; every
683
+ * pass rewrites whatever of its own set is missing, so races self-heal.
684
+ */
685
+ function pruneStaleAssets(assetsDir, expected) {
686
+ if (!(0, fs.existsSync)(assetsDir)) return;
687
+ let entries;
688
+ try {
689
+ entries = (0, fs.readdirSync)(assetsDir);
690
+ } catch {
691
+ return;
692
+ }
693
+ for (const entry of entries) {
694
+ if (expected.has(entry)) continue;
695
+ try {
696
+ (0, fs.unlinkSync)((0, path.join)(assetsDir, entry));
697
+ } catch {}
698
+ }
699
+ }
555
700
  //#endregion
556
701
  //#region src/plugin.ts
557
702
  const PLUGIN_NAME = "AnimusWebpackPlugin";
@@ -600,6 +745,8 @@ var AnimusWebpackPlugin = class {
600
745
  const registerSystemDependencies = () => {
601
746
  for (const dep of this.session.systemDependencyPaths) if ((0, fs.existsSync)(dep)) compilation.fileDependencies.add(dep);
602
747
  else compilation.missingDependencies.add(dep);
748
+ for (const dep of this.session.assetDependencyPaths) if ((0, fs.existsSync)(dep)) compilation.fileDependencies.add(dep);
749
+ else compilation.missingDependencies.add(dep);
603
750
  };
604
751
  registerSystemDependencies();
605
752
  const stage = compiler.webpack?.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL ?? -2e3;
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import { t as __require } from "./chunk-y_GBKt04.mjs";
2
2
  import { a as getSharedExternalDirs, c as setAnalysisPromise, d as setSharedEngine, f as setSharedExternalDirs, i as getSharedCss, l as setManifestJson, m as setSharedSystemProps, n as getAnalysisPromise, o as getSharedExternalEntries, p as setSharedExternalEntries, s as resetAnalysisPromise, t as engineApi, u as setSharedCss } from "./singleton-BKALu7Mk.mjs";
3
- import { DEFAULT_EXTENSIONS, assembleStylesheet, assertNoRetiredEngineSelection, buildPathAliasesJson, buildSystemPropsModule, clearEngineCache, collectExternalPackageSources, contentHash, discoverFiles, extractSystemFilePackages, formatRustTimingWaterfall, loadSystemConfig, postProcessCss, preprocessMdx, readTsconfigAliasPairs, resolveLightningTargets, runProjectAnalysis, serializeStaticCss, toWatchKeys } from "@animus-ui/extract/pipeline";
4
- import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, watch, writeFileSync } from "fs";
5
- import { dirname, extname, join, relative, resolve, sep } from "path";
3
+ import { DEFAULT_EXTENSIONS, assembleStylesheet, assertNoRetiredEngineSelection, buildPathAliasesJson, buildSystemPropsModule, clearEngineCache, collectExternalPackageSources, contentHash, discoverFiles, enforceExternalTokenContracts, extractSystemFilePackages, findAssetSpecifiers, findPackageRoot, formatRustTimingWaterfall, loadSystemConfig, postProcessCss, preprocessMdx, readTsconfigAliasPairs, resolveAssetFile, resolveLightningTargets, runProjectAnalysis, serializeStaticCss, staleDistIncludesMessage, substituteAssetPlaceholders, toWatchKeys, unresolvableIncludesMessage } from "@animus-ui/extract/pipeline";
4
+ import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync, watch, writeFileSync } from "fs";
5
+ import { basename, dirname, extname, join, relative, resolve, sep } from "path";
6
6
  import { fileURLToPath } from "url";
7
7
  //#region src/resolve-packages.ts
8
8
  /**
@@ -124,6 +124,10 @@ var ExtractionSession = class {
124
124
  rootDir = null;
125
125
  /** Serialized path aliases, harvested by the adapter from bundler config. */
126
126
  pathAliasesJson = null;
127
+ assetCopyCache = /* @__PURE__ */ new Map();
128
+ /** Physical asset files registered with the host watcher. */
129
+ assetDependencyPaths = /* @__PURE__ */ new Set();
130
+ assetDependencyKeys = /* @__PURE__ */ new Set();
127
131
  /** When set (Turbopack orchestration), every analysis also persists
128
132
  * `.animus/analysis-inputs.json` so isolated loader workers can hydrate.
129
133
  * Webpack mode leaves this off — its loader shares the process. */
@@ -135,6 +139,10 @@ var ExtractionSession = class {
135
139
  systemPropsModuleId = null;
136
140
  /** Absolute directory prefixes for external DS packages (loader allowlisting). */
137
141
  externalPackageDirs = [];
142
+ /** Absolute package dir → owning specifier (cross-source correlation). */
143
+ externalDirOwners = {};
144
+ /** rootDir-relative external file → owning specifier (correlation join). */
145
+ externalFileOwners = {};
138
146
  /** External package specifier → absolute source entry path. */
139
147
  externalSourceEntries = /* @__PURE__ */ new Map();
140
148
  options;
@@ -190,6 +198,7 @@ var ExtractionSession = class {
190
198
  async handleWatchUpdate(changes) {
191
199
  if (!this.system) return;
192
200
  const rootDir = this.rootDir;
201
+ let assetChanged = false;
193
202
  try {
194
203
  let systemHit;
195
204
  if (!changes.modifiedFiles && !changes.removedFiles) for (const [dep, hash] of this.systemDependencyHashes) {
@@ -211,6 +220,10 @@ var ExtractionSession = class {
211
220
  await promise;
212
221
  return;
213
222
  }
223
+ if ([...changes.modifiedFiles ?? [], ...changes.removedFiles ?? []].some((path) => toWatchKeys(path).some((key) => this.assetDependencyKeys.has(key)))) {
224
+ this.assetCopyCache.clear();
225
+ assetChanged = true;
226
+ }
214
227
  } catch (err) {
215
228
  this.warn(`HMR geological-reset check failed: ${String(err)}`);
216
229
  }
@@ -256,7 +269,7 @@ var ExtractionSession = class {
256
269
  });
257
270
  }
258
271
  }
259
- if (changedPaths.length > 0 || removedAny) {
272
+ if (changedPaths.length > 0 || removedAny || assetChanged) {
260
273
  const fileEntries = this.buildFileEntriesFromCache();
261
274
  resetAnalysisPromise();
262
275
  const promise = this.runIncrementalPipeline(fileEntries);
@@ -304,6 +317,9 @@ var ExtractionSession = class {
304
317
  rootDir,
305
318
  prefix: this.options.prefix
306
319
  });
320
+ this.assetCopyCache.clear();
321
+ this.assetDependencyPaths.clear();
322
+ this.assetDependencyKeys.clear();
307
323
  {
308
324
  const deps = this.system.dependencies ?? [];
309
325
  const keys = /* @__PURE__ */ new Set();
@@ -374,8 +390,20 @@ var ExtractionSession = class {
374
390
  onUnreadable: (relPath, err) => this.warn(`skipped unreadable package file ${relPath}: ${String(err)}`)
375
391
  });
376
392
  for (const record of collected.outcomes) if (record.outcome === "empty") this.warn(`include '${record.specifier}' resolved but discovered no component sources`);
393
+ const unresolvableMessage = unresolvableIncludesMessage(collected.outcomes);
394
+ if (unresolvableMessage !== null) {
395
+ if (this.options.strict) throw new Error(unresolvableMessage);
396
+ this.warn(unresolvableMessage);
397
+ }
398
+ const staleDistMessage = staleDistIncludesMessage(collected.outcomes);
399
+ if (staleDistMessage !== null) {
400
+ if (this.options.strict) throw new Error(staleDistMessage);
401
+ this.warn(staleDistMessage);
402
+ }
377
403
  const packageMap = collected.packageMap;
378
404
  this.lastPackageMap = packageMap;
405
+ this.externalDirOwners = collected.dirOwners;
406
+ this.externalFileOwners = collected.fileOwners;
379
407
  this.externalSourceEntries = collected.sourceEntries;
380
408
  for (const entry of collected.entries) {
381
409
  const hash = contentHash(entry.source);
@@ -461,9 +489,19 @@ var ExtractionSession = class {
461
489
  },
462
490
  pathAliasesJson: this.pathAliasesJson,
463
491
  staticCssJson: this.staticCssJson,
492
+ externalDirs: this.externalPackageDirs.map((dir) => relative(this.rootDir, dir)),
464
493
  devMode,
465
494
  warn: (message) => this.warn(message)
466
495
  });
496
+ enforceExternalTokenContracts({
497
+ diagnostics: result.manifest?.diagnostics,
498
+ fileOwners: this.externalFileOwners,
499
+ dirOwners: this.externalDirOwners,
500
+ sourceThemeManifestsJson: system.sourceThemeManifestsJson,
501
+ strict: this.options.strict,
502
+ prefix: "[animus-next]",
503
+ warn: (message) => this.warn(message)
504
+ });
467
505
  bt.jsonSerialize = result.timings.serializeMs;
468
506
  bt.rustExtract = result.timings.extractMs;
469
507
  bt.jsonParse = result.timings.parseMs;
@@ -472,10 +510,11 @@ var ExtractionSession = class {
472
510
  bt.analysis = (bt.jsonSerialize ?? 0) + (bt.rustExtract ?? 0) + (bt.jsonParse ?? 0);
473
511
  if (manifest?.report) this.log(`Extracted ${manifest.report.components_extracted ?? "?"}/${manifest.report.components_total ?? "?"} components (${bt.analysis}ms)`);
474
512
  }
513
+ const globalCss = this.substituteAssetReferences(result.globalCss, devMode);
475
514
  const { declaration, variables, body } = assembleStylesheet({
476
515
  layers: this.options.layers,
477
516
  variableCss: system.variableCss,
478
- globalCss: result.globalCss,
517
+ globalCss,
479
518
  componentCss: result.componentCss,
480
519
  split: true
481
520
  });
@@ -551,7 +590,113 @@ var ExtractionSession = class {
551
590
  writeFileSync(tmpPath, content);
552
591
  renameSync(tmpPath, join(dir, name));
553
592
  }
593
+ /**
594
+ * asset() placeholder substitution (global-styles-system): resolve each
595
+ * referenced specifier through Node resolution, copy the bytes into
596
+ * `.animus/assets/` under a content-hashed name, and substitute a
597
+ * RELATIVE url. `.animus/styles.css` is processed by Next's own CSS
598
+ * pipeline (webpack and Turbopack alike), which applies its native asset
599
+ * handling — publicPath and output hashing — to relative url()
600
+ * references. Unsubstitutable specifiers warn and emit literally in
601
+ * non-strict mode, fail the build under `strict: true`.
602
+ */
603
+ substituteAssetReferences(globalCss, devMode) {
604
+ const specifiers = findAssetSpecifiers(globalCss);
605
+ const assetsDir = join(this.rootDir, ".animus", "assets");
606
+ const expected = /* @__PURE__ */ new Set();
607
+ this.assetDependencyPaths.clear();
608
+ this.assetDependencyKeys.clear();
609
+ const urlBySpecifier = /* @__PURE__ */ new Map();
610
+ for (const specifier of specifiers) {
611
+ const cached = this.assetCopyCache.get(specifier);
612
+ if (cached && existsSync(join(assetsDir, cached.fileName))) try {
613
+ const current = statSync(cached.sourcePath);
614
+ if (current.mtimeMs === cached.mtimeMs && current.size === cached.size) {
615
+ this.trackAssetDependency(cached.sourcePath);
616
+ expected.add(cached.fileName);
617
+ urlBySpecifier.set(specifier, cached.url);
618
+ continue;
619
+ }
620
+ } catch {}
621
+ const resolvedPath = this.resolveAssetSpecifier(specifier);
622
+ if (!resolvedPath) {
623
+ const message = `unresolvable asset() specifier: ${specifier}`;
624
+ if (this.options.strict) throw new Error(`[animus-next] ${message}`);
625
+ this.warn(message);
626
+ urlBySpecifier.set(specifier, specifier);
627
+ continue;
628
+ }
629
+ const bytes = readFileSync(resolvedPath);
630
+ const sourceStat = statSync(resolvedPath);
631
+ this.trackAssetDependency(resolvedPath);
632
+ const ext = extname(resolvedPath);
633
+ const fileName = `${basename(resolvedPath, ext)}.${contentHash(bytes).slice(0, 8)}${ext}`;
634
+ expected.add(fileName);
635
+ if (!existsSync(assetsDir)) mkdirSync(assetsDir, { recursive: true });
636
+ const assetPath = join(assetsDir, fileName);
637
+ if (!existsSync(assetPath)) writeFileSync(assetPath, bytes);
638
+ const url = `./assets/${fileName}`;
639
+ urlBySpecifier.set(specifier, url);
640
+ this.assetCopyCache.set(specifier, {
641
+ sourcePath: resolvedPath,
642
+ mtimeMs: sourceStat.mtimeMs,
643
+ size: sourceStat.size,
644
+ fileName,
645
+ url
646
+ });
647
+ }
648
+ if (!devMode) pruneStaleAssets(assetsDir, expected);
649
+ return substituteAssetPlaceholders(globalCss, urlBySpecifier);
650
+ }
651
+ trackAssetDependency(path) {
652
+ this.assetDependencyPaths.add(path);
653
+ for (const key of toWatchKeys(path)) this.assetDependencyKeys.add(key);
654
+ }
655
+ /**
656
+ * Resolve an asset specifier to an absolute file via the shared pipeline
657
+ * resolver (host aliases → Node resolution → package root), with one
658
+ * session-local last resort: an already-discovered source entry's package
659
+ * root (dist-less workspace kits the shared resolver cannot see).
660
+ */
661
+ resolveAssetSpecifier(specifier) {
662
+ const resolved = resolveAssetFile(specifier, this.rootDir, this.pathAliasesJson);
663
+ if (resolved) return resolved;
664
+ const segments = specifier.split("/");
665
+ const packageName = specifier.startsWith("@") ? segments.slice(0, 2).join("/") : segments[0];
666
+ const subpath = specifier.slice(packageName.length + 1);
667
+ if (!subpath) return null;
668
+ const sourceEntry = this.externalSourceEntries.get(packageName) ?? [...this.externalSourceEntries].find(([declared]) => declared === packageName || declared.startsWith(`${packageName}/`))?.[1];
669
+ if (sourceEntry) {
670
+ const candidate = join(findPackageRoot(sourceEntry), subpath);
671
+ if (existsSync(candidate)) return candidate;
672
+ }
673
+ return null;
674
+ }
554
675
  };
676
+ /**
677
+ * Sync `.animus/assets/` to the current build's content-hashed file set:
678
+ * anything else in the directory is a superseded revision (the copies are
679
+ * content-addressed and never overwritten) or the leftover of an asset()
680
+ * reference that no longer exists. Failures are tolerated per entry — Next
681
+ * dev evaluates the config in more than one process, and a concurrent
682
+ * session may have removed (or be about to rewrite) the same file; every
683
+ * pass rewrites whatever of its own set is missing, so races self-heal.
684
+ */
685
+ function pruneStaleAssets(assetsDir, expected) {
686
+ if (!existsSync(assetsDir)) return;
687
+ let entries;
688
+ try {
689
+ entries = readdirSync(assetsDir);
690
+ } catch {
691
+ return;
692
+ }
693
+ for (const entry of entries) {
694
+ if (expected.has(entry)) continue;
695
+ try {
696
+ unlinkSync(join(assetsDir, entry));
697
+ } catch {}
698
+ }
699
+ }
555
700
  //#endregion
556
701
  //#region src/plugin.ts
557
702
  const PLUGIN_NAME = "AnimusWebpackPlugin";
@@ -600,6 +745,8 @@ var AnimusWebpackPlugin = class {
600
745
  const registerSystemDependencies = () => {
601
746
  for (const dep of this.session.systemDependencyPaths) if (existsSync(dep)) compilation.fileDependencies.add(dep);
602
747
  else compilation.missingDependencies.add(dep);
748
+ for (const dep of this.session.assetDependencyPaths) if (existsSync(dep)) compilation.fileDependencies.add(dep);
749
+ else compilation.missingDependencies.add(dep);
603
750
  };
604
751
  registerSystemDependencies();
605
752
  const stage = compiler.webpack?.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL ?? -2e3;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,KAAK,aAAa,GAAG;IACnB,MAAM,IAAI,MAAM,GAAG,MAAM,CAAC;IAC1B,IAAI,IAAI,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE;QACL,aAAa,EAAE;YACb,GAAG,EAAE,CACH,OAAO,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,EACxC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,IAAI,KAChD,IAAI,CAAC;SACX,CAAC;KACH,CAAC;IACF,yEAAyE;IACzE,gBAAgB,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9C,oEAAoE;IACpE,mBAAmB,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,aAAa,CAAA;KAAE,GAAG,SAAS,CAAC;IAC9D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE;QACL,GAAG,EAAE;YACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;SACxE,CAAC;QACF,QAAQ,EAAE;YACR,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;SACxE,CAAC;QACF,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,KAAK,IAAI,CAAC;SACrE,CAAC;KACH,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE;YACR,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;SACnD,CAAC;KACH,CAAC;IACF,OAAO,CAAC,EAAE;QACR,WAAW,EAAE;YACX,+BAA+B,EAAE,MAAM,CAAC;SACzC,CAAC;QACF,OAAO,EAAE;YACP,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC;SAClD,CAAC;KACH,CAAC;CACH,CAAC;AAIF;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IAEjC,YAAY,OAAO,EAAE,iBAAiB,EASrC;IAED;yEACqE;IACrE,OAAO,CAAC,cAAc;IAwBtB,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CA6F9B;IAED;;OAEG;IACH,WAAW,IAAI,IAAI,CAElB;IAED,oCAAoC;IACpC,UAAU,IAAI,iBAAiB,CAE9B;IAED;mFAC+E;IAC/E,sBAAsB,IAAI,MAAM,EAAE,CAIjC;IAED;mFAC+E;IAC/E,wBAAwB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAI9C;CACF"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,KAAK,aAAa,GAAG;IACnB,MAAM,IAAI,MAAM,GAAG,MAAM,CAAC;IAC1B,IAAI,IAAI,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE;QACL,aAAa,EAAE;YACb,GAAG,EAAE,CACH,OAAO,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,EACxC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,IAAI,KAChD,IAAI,CAAC;SACX,CAAC;KACH,CAAC;IACF,yEAAyE;IACzE,gBAAgB,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9C,oEAAoE;IACpE,mBAAmB,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,aAAa,CAAA;KAAE,GAAG,SAAS,CAAC;IAC9D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE;QACL,GAAG,EAAE;YACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;SACxE,CAAC;QACF,QAAQ,EAAE;YACR,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;SACxE,CAAC;QACF,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,KAAK,IAAI,CAAC;SACrE,CAAC;KACH,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE;YACR,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;SACnD,CAAC;KACH,CAAC;IACF,OAAO,CAAC,EAAE;QACR,WAAW,EAAE;YACX,+BAA+B,EAAE,MAAM,CAAC;SACzC,CAAC;QACF,OAAO,EAAE;YACP,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC;SAClD,CAAC;KACH,CAAC;CACH,CAAC;AAIF;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IAEjC,YAAY,OAAO,EAAE,iBAAiB,EASrC;IAED;yEACqE;IACrE,OAAO,CAAC,cAAc;IAwBtB,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAiG9B;IAED;;OAEG;IACH,WAAW,IAAI,IAAI,CAElB;IAED,oCAAoC;IACpC,UAAU,IAAI,iBAAiB,CAE9B;IAED;mFAC+E;IAC/E,sBAAsB,IAAI,MAAM,EAAE,CAIjC;IAED;mFAC+E;IAC/E,wBAAwB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAI9C;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@animus-ui/next-plugin",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Animus static CSS extraction for Next.js (webpack)",
5
5
  "keywords": [
6
6
  "animus",
@@ -40,7 +40,7 @@
40
40
  "compile": "tsc --noEmit"
41
41
  },
42
42
  "dependencies": {
43
- "@animus-ui/extract": "0.1.2"
43
+ "@animus-ui/extract": "0.1.4"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@mdx-js/mdx": "^3.0.0",