@plumeria/utils 19.2.10 → 19.2.12

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.
@@ -232,7 +232,7 @@ exports.applyVarFallback = applyVarFallback;
232
232
  const resolveDynamicStyle = (func, runtimeParams, staticTable, tables, providedParams) => {
233
233
  if (func.unsupportedParams)
234
234
  throw new Error('[plumeria] Dynamic styles require named parameters or object destructuring; array and rest parameters are not supported.');
235
- const tempStaticTable = { ...staticTable };
235
+ const tempStaticTable = Object.create(staticTable);
236
236
  const resolveBody = () => (0, parser_1.objectExpressionToObject)(func.body, tempStaticTable, tables.keyframesHashTable, tables.viewTransitionHashTable, tables.createThemeHashTable, tables.createThemeObjectTable, tables.createHashTable, tables.createStaticHashTable, tables.createStaticObjectTable);
237
237
  const withDefault = Object.entries(func.defaults ?? {}).filter(([param]) => providedParams
238
238
  ? !providedParams.has(param)
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export type { CSSObject, StaticTable, KeyframesHashTable, ViewTransitionHashTable, CreateHashTable, CreateFunctionTable, CreateThemeHashTable, CreateStaticHashTable, } from './types';
2
- export { objectExpressionToObject, collectLocalConsts, traverse, t, getRootIdentifier, resolveOriginError, unwrapExpression, extractOndemandStyles, appendSheet, deepMerge, scanAll, resolveFileError, getFileDependencies, resolveExport, resolveComponentKey, resolveThemeSelector, } from './parser';
2
+ export { objectExpressionToObject, collectLocalConsts, traverse, t, getRootIdentifier, resolveOriginError, unwrapExpression, extractOndemandStyles, appendSheet, deepMerge, scanAll, scanOverlay, fileTableKeys, resolveFileError, getFileDependencies, resolveExport, resolveComponentKey, resolveThemeSelector, } from './parser';
3
3
  export type { StyleRecord } from './create';
4
4
  export { getStyleRecords } from './create';
5
5
  export type { NamedParam, StyleFunction, StyleFunctions, DynamicStyleTables, DynamicStyleResult, } from './dynamicKey';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.transformSource = exports.assertPropertyPolicy = exports.resolvePropertyPolicy = exports.DEFAULT_STYLE_PROP = exports.timedAsync = exports.timed = exports.tally = exports.measure = exports.mark = exports.profiling = exports.collectReferenceIdentifiers = exports.getLeadingCommentLength = exports.optimizer = exports.resolveImportPath = exports.themeHashOf = exports.getStateWeights = exports.getPseudoElement = exports.getSpecificity = exports.resolveDynamicStyle = exports.applyVarFallback = exports.splitVarByUnit = exports.isUnitlessProp = exports.styleFunctionsOf = exports.getStyleRecords = exports.resolveThemeSelector = exports.resolveComponentKey = exports.resolveExport = exports.getFileDependencies = exports.resolveFileError = exports.scanAll = exports.deepMerge = exports.appendSheet = exports.extractOndemandStyles = exports.unwrapExpression = exports.resolveOriginError = exports.getRootIdentifier = exports.t = exports.traverse = exports.collectLocalConsts = exports.objectExpressionToObject = void 0;
3
+ exports.transformSource = exports.assertPropertyPolicy = exports.resolvePropertyPolicy = exports.DEFAULT_STYLE_PROP = exports.timedAsync = exports.timed = exports.tally = exports.measure = exports.mark = exports.profiling = exports.collectReferenceIdentifiers = exports.getLeadingCommentLength = exports.optimizer = exports.resolveImportPath = exports.themeHashOf = exports.getStateWeights = exports.getPseudoElement = exports.getSpecificity = exports.resolveDynamicStyle = exports.applyVarFallback = exports.splitVarByUnit = exports.isUnitlessProp = exports.styleFunctionsOf = exports.getStyleRecords = exports.resolveThemeSelector = exports.resolveComponentKey = exports.resolveExport = exports.getFileDependencies = exports.resolveFileError = exports.fileTableKeys = exports.scanOverlay = exports.scanAll = exports.deepMerge = exports.appendSheet = exports.extractOndemandStyles = exports.unwrapExpression = exports.resolveOriginError = exports.getRootIdentifier = exports.t = exports.traverse = exports.collectLocalConsts = exports.objectExpressionToObject = void 0;
4
4
  var parser_1 = require("./parser");
5
5
  Object.defineProperty(exports, "objectExpressionToObject", { enumerable: true, get: function () { return parser_1.objectExpressionToObject; } });
6
6
  Object.defineProperty(exports, "collectLocalConsts", { enumerable: true, get: function () { return parser_1.collectLocalConsts; } });
@@ -13,6 +13,8 @@ Object.defineProperty(exports, "extractOndemandStyles", { enumerable: true, get:
13
13
  Object.defineProperty(exports, "appendSheet", { enumerable: true, get: function () { return parser_1.appendSheet; } });
14
14
  Object.defineProperty(exports, "deepMerge", { enumerable: true, get: function () { return parser_1.deepMerge; } });
15
15
  Object.defineProperty(exports, "scanAll", { enumerable: true, get: function () { return parser_1.scanAll; } });
16
+ Object.defineProperty(exports, "scanOverlay", { enumerable: true, get: function () { return parser_1.scanOverlay; } });
17
+ Object.defineProperty(exports, "fileTableKeys", { enumerable: true, get: function () { return parser_1.fileTableKeys; } });
16
18
  Object.defineProperty(exports, "resolveFileError", { enumerable: true, get: function () { return parser_1.resolveFileError; } });
17
19
  Object.defineProperty(exports, "getFileDependencies", { enumerable: true, get: function () { return parser_1.getFileDependencies; } });
18
20
  Object.defineProperty(exports, "resolveExport", { enumerable: true, get: function () { return parser_1.resolveExport; } });
package/dist/parser.d.ts CHANGED
@@ -49,6 +49,8 @@ export declare function resolveFileError(actualPath: string, importedName: strin
49
49
  filePath: string;
50
50
  message: string;
51
51
  } | undefined;
52
+ export declare function fileTableKeys(filePath: string, tableName: string): ReadonlySet<string> | undefined;
53
+ export declare function scanOverlay(scanCwd?: string): Tables;
52
54
  export declare function scanAll(scanCwd?: string): Tables;
53
55
  export declare function getFileDependencies(filePath: string): string[];
54
56
  export declare function resolveExport(filePath: string, exportName: string, visited?: Set<string>): {
package/dist/parser.js CHANGED
@@ -42,6 +42,8 @@ exports.objectExpressionToObject = objectExpressionToObject;
42
42
  exports.collectLocalConsts = collectLocalConsts;
43
43
  exports.resolveThemeSelector = resolveThemeSelector;
44
44
  exports.resolveFileError = resolveFileError;
45
+ exports.fileTableKeys = fileTableKeys;
46
+ exports.scanOverlay = scanOverlay;
45
47
  exports.scanAll = scanAll;
46
48
  exports.getFileDependencies = getFileDependencies;
47
49
  exports.resolveExport = resolveExport;
@@ -271,10 +273,9 @@ function objectExpressionToObject(node, staticTable, keyframesHashTable, viewTra
271
273
  const root = (0, exports.getRootIdentifier)(val);
272
274
  const resolved = root ? resolveVariable(root) : undefined;
273
275
  if (resolved !== undefined && root) {
274
- const member = resolveStaticTableMemberExpression(val, {
275
- ...staticTable,
276
+ const member = resolveStaticTableMemberExpression(val, Object.assign(Object.create(staticTable), {
276
277
  [root]: resolved,
277
- });
278
+ }));
278
279
  if (member === undefined)
279
280
  throw new Error(`[plumeria] Unknown style member on ${root}.`);
280
281
  obj[key] = member;
@@ -1040,12 +1041,46 @@ let scannedCwd;
1040
1041
  const objectTableOwners = new Map();
1041
1042
  const fileObjectContributions = new Map();
1042
1043
  const fileKeyContributions = new Map();
1043
- function snapshotTables() {
1044
- return Object.fromEntries(Object.entries(globalAgregatedTables).map(([key, value]) => [
1044
+ const detachedTables = new Set([
1045
+ 'staticTable',
1046
+ 'keyframesHashTable',
1047
+ 'viewTransitionHashTable',
1048
+ 'createHashTable',
1049
+ 'createObjectTable',
1050
+ 'createFunctionTable',
1051
+ 'createThemeHashTable',
1052
+ 'componentPropsTable',
1053
+ ]);
1054
+ const detachedOverlayTables = new Set([
1055
+ 'createThemeHashTable',
1056
+ 'componentPropsTable',
1057
+ ]);
1058
+ let overlayScan = false;
1059
+ let tablesGeneration = 0;
1060
+ let overlayBaseGeneration = -1;
1061
+ let overlayBase;
1062
+ function layerTables(source, detached) {
1063
+ return Object.fromEntries(Object.entries(source).map(([key, value]) => [
1045
1064
  key,
1046
- key === 'styleReceiverTable' ? value : { ...value },
1065
+ key === 'styleReceiverTable'
1066
+ ? value
1067
+ : detached.has(key)
1068
+ ? { ...value }
1069
+ : Object.create(value),
1047
1070
  ]));
1048
1071
  }
1072
+ function snapshotTables() {
1073
+ if (!overlayScan)
1074
+ return layerTables(globalAgregatedTables, detachedTables);
1075
+ if (overlayBaseGeneration !== tablesGeneration) {
1076
+ overlayBase = Object.fromEntries(Object.entries(globalAgregatedTables).map(([key, value]) => [
1077
+ key,
1078
+ key === 'styleReceiverTable' ? value : { ...value },
1079
+ ]));
1080
+ overlayBaseGeneration = tablesGeneration;
1081
+ }
1082
+ return layerTables(overlayBase, detachedOverlayTables);
1083
+ }
1049
1084
  function releaseFileObjects(filePath) {
1050
1085
  const contributions = fileObjectContributions.get(filePath);
1051
1086
  if (!contributions)
@@ -1056,6 +1091,9 @@ function releaseFileObjects(filePath) {
1056
1091
  }
1057
1092
  fileObjectContributions.delete(filePath);
1058
1093
  }
1094
+ function fileTableKeys(filePath, tableName) {
1095
+ return fileKeyContributions.get(filePath)?.get(tableName);
1096
+ }
1059
1097
  function registerFileKey(tableName, key, filePath) {
1060
1098
  let contributions = fileKeyContributions.get(filePath);
1061
1099
  if (!contributions)
@@ -1161,6 +1199,15 @@ function statFile(filePath) {
1161
1199
  throw e;
1162
1200
  }
1163
1201
  }
1202
+ function scanOverlay(scanCwd = process.cwd()) {
1203
+ overlayScan = true;
1204
+ try {
1205
+ return scanAll(scanCwd);
1206
+ }
1207
+ finally {
1208
+ overlayScan = false;
1209
+ }
1210
+ }
1164
1211
  function scanAll(scanCwd = process.cwd()) {
1165
1212
  scanning = true;
1166
1213
  statMemo.clear();
@@ -1287,6 +1334,7 @@ function runScan(scanCwd = process.cwd()) {
1287
1334
  if (invalidated.size === 0 && hasComputedOnce) {
1288
1335
  return snapshotTables();
1289
1336
  }
1337
+ tablesGeneration++;
1290
1338
  for (const fp of deletedFiles) {
1291
1339
  const cached = fileCache[fp];
1292
1340
  if (cached)
package/dist/transform.js CHANGED
@@ -201,7 +201,7 @@ const transformSource = async (env) => {
201
201
  }
202
202
  }
203
203
  };
204
- const scannedTables = (0, parser_1.scanAll)();
204
+ const scannedTables = (0, parser_1.scanOverlay)();
205
205
  const ownFailure = (0, parser_1.resolveFileError)(baseId, '');
206
206
  if (ownFailure)
207
207
  throwCompilationError(`Plumeria: ${ownFailure.message}`);
@@ -392,70 +392,51 @@ const transformSource = async (env) => {
392
392
  }
393
393
  },
394
394
  });
395
- const mergedStaticTable = {};
396
- for (const key of Object.keys(scannedTables.staticTable)) {
397
- mergedStaticTable[key] = scannedTables.staticTable[key];
398
- }
395
+ const mergedStaticTable = Object.create(scannedTables.staticTable);
399
396
  for (const key of Object.keys(localConsts)) {
400
397
  mergedStaticTable[key] = localConsts[key];
401
398
  }
402
399
  for (const key of Object.keys(importMap)) {
403
400
  mergedStaticTable[key] = importMap[key];
404
401
  }
405
- const mergedKeyframesTable = {};
406
- for (const key of Object.keys(scannedTables.keyframesHashTable)) {
407
- mergedKeyframesTable[key] = scannedTables.keyframesHashTable[key];
408
- if (key.startsWith(`${resourcePath}-`)) {
409
- const varName = key.slice(resourcePath.length + 1);
410
- mergedKeyframesTable[varName] = scannedTables.keyframesHashTable[key];
411
- }
402
+ const mergedKeyframesTable = Object.create(scannedTables.keyframesHashTable);
403
+ for (const key of (0, parser_1.fileTableKeys)(resourcePath, 'keyframesHashTable') ?? []) {
404
+ mergedKeyframesTable[key.slice(resourcePath.length + 1)] =
405
+ scannedTables.keyframesHashTable[key];
412
406
  }
413
407
  for (const key of Object.keys(keyframesImportMap)) {
414
408
  mergedKeyframesTable[key] = keyframesImportMap[key];
415
409
  }
416
- const mergedViewTransitionTable = {};
417
- for (const key of Object.keys(scannedTables.viewTransitionHashTable)) {
418
- mergedViewTransitionTable[key] = scannedTables.viewTransitionHashTable[key];
419
- if (key.startsWith(`${resourcePath}-`)) {
420
- const varName = key.slice(resourcePath.length + 1);
421
- mergedViewTransitionTable[varName] =
422
- scannedTables.viewTransitionHashTable[key];
423
- }
410
+ const mergedViewTransitionTable = Object.create(scannedTables.viewTransitionHashTable);
411
+ for (const key of (0, parser_1.fileTableKeys)(resourcePath, 'viewTransitionHashTable') ??
412
+ []) {
413
+ mergedViewTransitionTable[key.slice(resourcePath.length + 1)] =
414
+ scannedTables.viewTransitionHashTable[key];
424
415
  }
425
416
  for (const key of Object.keys(viewTransitionImportMap)) {
426
417
  mergedViewTransitionTable[key] = viewTransitionImportMap[key];
427
418
  }
428
- const mergedCreateTable = {};
429
- for (const key of Object.keys(scannedTables.createHashTable)) {
430
- mergedCreateTable[key] = scannedTables.createHashTable[key];
431
- if (key.startsWith(`${resourcePath}-`)) {
432
- const varName = key.slice(resourcePath.length + 1);
433
- mergedCreateTable[varName] = scannedTables.createHashTable[key];
434
- }
419
+ const mergedCreateTable = Object.create(scannedTables.createHashTable);
420
+ for (const key of (0, parser_1.fileTableKeys)(resourcePath, 'createHashTable') ?? []) {
421
+ mergedCreateTable[key.slice(resourcePath.length + 1)] =
422
+ scannedTables.createHashTable[key];
435
423
  }
436
424
  for (const key of Object.keys(createImportMap)) {
437
425
  mergedCreateTable[key] = createImportMap[key];
438
426
  }
439
- const mergedCreateThemeHashTable = {};
440
- for (const key of Object.keys(scannedTables.createThemeHashTable)) {
441
- mergedCreateThemeHashTable[key] = scannedTables.createThemeHashTable[key];
442
- if (key.startsWith(`${resourcePath}-`)) {
443
- const varName = key.slice(resourcePath.length + 1);
444
- mergedCreateThemeHashTable[varName] =
445
- scannedTables.createThemeHashTable[key];
446
- }
427
+ const mergedCreateThemeHashTable = Object.create(scannedTables.createThemeHashTable);
428
+ for (const key of (0, parser_1.fileTableKeys)(resourcePath, 'createThemeHashTable') ?? []) {
429
+ mergedCreateThemeHashTable[key.slice(resourcePath.length + 1)] =
430
+ scannedTables.createThemeHashTable[key];
447
431
  }
448
432
  for (const key of Object.keys(createThemeImportMap)) {
449
433
  mergedCreateThemeHashTable[key] = createThemeImportMap[key];
450
434
  }
451
- const mergedCreateStaticHashTable = {};
452
- for (const key of Object.keys(scannedTables.createStaticHashTable)) {
453
- mergedCreateStaticHashTable[key] = scannedTables.createStaticHashTable[key];
454
- if (key.startsWith(`${resourcePath}-`)) {
455
- const varName = key.slice(resourcePath.length + 1);
456
- mergedCreateStaticHashTable[varName] =
457
- scannedTables.createStaticHashTable[key];
458
- }
435
+ const mergedCreateStaticHashTable = Object.create(scannedTables.createStaticHashTable);
436
+ for (const key of (0, parser_1.fileTableKeys)(resourcePath, 'createStaticHashTable') ??
437
+ []) {
438
+ mergedCreateStaticHashTable[key.slice(resourcePath.length + 1)] =
439
+ scannedTables.createStaticHashTable[key];
459
440
  }
460
441
  for (const key of Object.keys(createStaticImportMap)) {
461
442
  mergedCreateStaticHashTable[key] = createStaticImportMap[key];
@@ -856,7 +837,25 @@ const transformSource = async (env) => {
856
837
  }
857
838
  },
858
839
  });
859
- const jsxOpeningElementMap = new Map();
840
+ const jsxAttributeOwnerMap = new Map();
841
+ const propEntryIndexes = new Map();
842
+ const localPropEntries = (list, spanStart) => {
843
+ let index = propEntryIndexes.get(list);
844
+ if (!index) {
845
+ index = new Map();
846
+ for (const entry of list) {
847
+ if (entry.filePath !== resourcePath)
848
+ continue;
849
+ const bucket = index.get(entry.spanStart);
850
+ if (bucket)
851
+ bucket.push(entry);
852
+ else
853
+ index.set(entry.spanStart, [entry]);
854
+ }
855
+ propEntryIndexes.set(list, index);
856
+ }
857
+ return index.get(spanStart);
858
+ };
860
859
  const componentParamNames = new Set();
861
860
  const addFirstParamName = (fn) => {
862
861
  const first = fn.params[0];
@@ -1839,10 +1838,13 @@ const transformSource = async (env) => {
1839
1838
  };
1840
1839
  (0, parser_1.traverse)(ast, {
1841
1840
  JSXOpeningElement({ node }) {
1842
- jsxOpeningElementMap.set(node.span.start, {
1841
+ const owner = {
1843
1842
  compKey: (0, parser_1.resolveComponentKey)(node.name, resourcePath, localImports),
1844
1843
  attributes: node.attributes,
1845
- });
1844
+ };
1845
+ for (const attribute of node.attributes)
1846
+ if (attribute.type === 'JSXAttribute')
1847
+ jsxAttributeOwnerMap.set(attribute.span.start, owner);
1846
1848
  },
1847
1849
  MemberExpression({ node }) {
1848
1850
  if (!isVisibleReference(node))
@@ -2021,16 +2023,7 @@ const transformSource = async (env) => {
2021
2023
  if (node.name.type !== 'Identifier')
2022
2024
  return;
2023
2025
  const attrName = node.name.value;
2024
- let compKey = null;
2025
- for (const [, val] of jsxOpeningElementMap) {
2026
- const found = val.attributes
2027
- .filter((a) => a.type === 'JSXAttribute')
2028
- .find((a) => a.span.start === node.span.start);
2029
- if (found) {
2030
- compKey = val.compKey;
2031
- break;
2032
- }
2033
- }
2026
+ const compKey = jsxAttributeOwnerMap.get(node.span.start)?.compKey ?? null;
2034
2027
  const receivesStyleProp = Boolean(compKey &&
2035
2028
  scannedTables.styleReceiverTable?.[compKey]?.includes(attrName));
2036
2029
  let relayed = false;
@@ -2064,9 +2057,8 @@ const transformSource = async (env) => {
2064
2057
  return `{ ${foldDynamicVars(vars).join(', ')} }`;
2065
2058
  };
2066
2059
  const replaceWithKey = (subNode) => {
2067
- const entries = list.filter((entry) => entry.spanStart === subNode.span.start &&
2068
- entry.filePath === resourcePath);
2069
- if (!entries.length)
2060
+ const entries = localPropEntries(list, subNode.span.start);
2061
+ if (!entries)
2070
2062
  return false;
2071
2063
  let content = '""';
2072
2064
  for (const entry of [...entries].reverse()) {
@@ -2131,16 +2123,7 @@ const transformSource = async (env) => {
2131
2123
  : [{ expression: expr }];
2132
2124
  const dynamicClassParts = [];
2133
2125
  const existingStyleParts = [];
2134
- let attributes = [];
2135
- for (const [, val] of jsxOpeningElementMap) {
2136
- const found = val.attributes
2137
- .filter((a) => a.type === 'JSXAttribute')
2138
- .find((a) => a.span.start === node.span.start);
2139
- if (found) {
2140
- attributes = val.attributes;
2141
- break;
2142
- }
2143
- }
2126
+ const attributes = jsxAttributeOwnerMap.get(node.span.start)?.attributes ?? [];
2144
2127
  const classNameAttr = attributes.find((attr) => attr.type === 'JSXAttribute' &&
2145
2128
  attr.name.type === 'Identifier' &&
2146
2129
  attr.name.value === 'className');
@@ -2323,10 +2306,11 @@ const transformSource = async (env) => {
2323
2306
  `so it cannot be passed through another prop or read as a value.`, call);
2324
2307
  }
2325
2308
  });
2309
+ replacements.sort((a, b) => a.start - b.start || b.end - a.end);
2326
2310
  for (const deferred of deferredSources) {
2327
2311
  let cursor = deferred.start;
2328
2312
  const pieces = [];
2329
- for (const replacement of [...replacements].sort((a, b) => a.start - b.start || b.end - a.end)) {
2313
+ for (const replacement of replacements) {
2330
2314
  if (replacement.start < cursor || replacement.end > deferred.end)
2331
2315
  continue;
2332
2316
  pieces.push(sourceBuffer.subarray(cursor, replacement.start).toString('utf-8'), replacement.content);
@@ -2340,9 +2324,7 @@ const transformSource = async (env) => {
2340
2324
  const buffer = Buffer.from(source);
2341
2325
  let offset = 0;
2342
2326
  const parts = [];
2343
- replacements
2344
- .sort((a, b) => a.start - b.start || b.end - a.end)
2345
- .forEach((r) => {
2327
+ replacements.forEach((r) => {
2346
2328
  if (r.start < offset)
2347
2329
  return;
2348
2330
  parts.push(buffer.subarray(offset, r.start));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plumeria/utils",
3
- "version": "19.2.10",
3
+ "version": "19.2.12",
4
4
  "description": "Plumeria Utils",
5
5
  "author": "Refirst 11",
6
6
  "license": "MIT",