@ng-prism/core 21.9.1 → 21.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/app/canvas/prism-canvas-bg-pill.component.d.ts +10 -0
  2. package/dist/app/canvas/prism-canvas-bg-pill.component.d.ts.map +1 -0
  3. package/dist/app/canvas/prism-canvas-bg-pill.component.js +51 -0
  4. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +5 -0
  5. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
  6. package/dist/app/canvas/prism-canvas-toolbar.component.js +82 -17
  7. package/dist/app/canvas/prism-code-drawer.component.d.ts +2 -0
  8. package/dist/app/canvas/prism-code-drawer.component.d.ts.map +1 -1
  9. package/dist/app/canvas/prism-code-drawer.component.js +6 -4
  10. package/dist/app/canvas/prism-template-popover.component.d.ts +16 -0
  11. package/dist/app/canvas/prism-template-popover.component.d.ts.map +1 -0
  12. package/dist/app/canvas/prism-template-popover.component.js +162 -0
  13. package/dist/app/icons/prism-icon.component.d.ts.map +1 -1
  14. package/dist/app/icons/prism-icon.component.js +3 -1
  15. package/dist/app/renderer/prism-renderer.component.d.ts +2 -0
  16. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  17. package/dist/app/renderer/prism-renderer.component.js +25 -15
  18. package/dist/app/services/prism-canvas.service.d.ts +2 -1
  19. package/dist/app/services/prism-canvas.service.d.ts.map +1 -1
  20. package/dist/app/services/prism-canvas.service.js +2 -1
  21. package/dist/app/services/prism-layout.service.d.ts +3 -0
  22. package/dist/app/services/prism-layout.service.d.ts.map +1 -1
  23. package/dist/app/services/prism-layout.service.js +13 -5
  24. package/dist/app/services/prism-theme.service.d.ts +1 -1
  25. package/dist/app/services/prism-variant-bg.service.d.ts +19 -0
  26. package/dist/app/services/prism-variant-bg.service.d.ts.map +1 -0
  27. package/dist/app/services/prism-variant-bg.service.js +45 -0
  28. package/dist/app/shell/prism-shell.component.js +13 -14
  29. package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
  30. package/dist/builder/scanner/component.scanner.js +25 -5
  31. package/dist/decorator/showcase.types.d.ts +10 -0
  32. package/dist/decorator/showcase.types.d.ts.map +1 -1
  33. package/dist/shared/canvas-bg.type.d.ts +3 -0
  34. package/dist/shared/canvas-bg.type.d.ts.map +1 -0
  35. package/dist/shared/canvas-bg.type.js +7 -0
  36. package/dist/transformer/showcase-strip.transformer.d.ts.map +1 -1
  37. package/dist/transformer/showcase-strip.transformer.js +49 -12
  38. package/package.json +1 -1
@@ -4,9 +4,9 @@ function isShowcaseModule(specifier) {
4
4
  return SHOWCASE_MODULE_PREFIXES.some((prefix) => specifier === prefix || specifier.startsWith(prefix + '/'));
5
5
  }
6
6
  function isShowcaseCall(expr, names) {
7
- return ts.isCallExpression(expr)
8
- && ts.isIdentifier(expr.expression)
9
- && names.has(expr.expression.text);
7
+ return (ts.isCallExpression(expr) &&
8
+ ts.isIdentifier(expr.expression) &&
9
+ names.has(expr.expression.text));
10
10
  }
11
11
  function isLoweredShowcaseCall(expr, names) {
12
12
  if (!ts.isCallExpression(expr))
@@ -15,11 +15,21 @@ function isLoweredShowcaseCall(expr, names) {
15
15
  }
16
16
  function tryHandleDecorateStatement(stmt, names, factory) {
17
17
  const expr = stmt.expression;
18
- if (!ts.isBinaryExpression(expr) || expr.operatorToken.kind !== ts.SyntaxKind.EqualsToken) {
18
+ if (!ts.isBinaryExpression(expr) ||
19
+ expr.operatorToken.kind !== ts.SyntaxKind.EqualsToken) {
19
20
  return undefined;
20
21
  }
21
- const rhs = expr.right;
22
- if (!ts.isCallExpression(rhs) || !ts.isIdentifier(rhs.expression) || rhs.expression.text !== '__decorate') {
22
+ const chain = [];
23
+ let current = expr;
24
+ while (ts.isBinaryExpression(current) &&
25
+ current.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
26
+ chain.push(current);
27
+ current = current.right;
28
+ }
29
+ const rhs = current;
30
+ if (!ts.isCallExpression(rhs) ||
31
+ !ts.isIdentifier(rhs.expression) ||
32
+ rhs.expression.text !== '__decorate') {
23
33
  return undefined;
24
34
  }
25
35
  const args = rhs.arguments;
@@ -36,14 +46,18 @@ function tryHandleDecorateStatement(stmt, names, factory) {
36
46
  }
37
47
  const newArray = factory.updateArrayLiteralExpression(decoratorArray, remaining);
38
48
  const newCall = factory.updateCallExpression(rhs, rhs.expression, rhs.typeArguments, [newArray, ...args.slice(1)]);
39
- const newBinary = factory.updateBinaryExpression(expr, expr.left, expr.operatorToken, newCall);
40
- const newStmt = factory.updateExpressionStatement(stmt, newBinary);
49
+ let newRhs = newCall;
50
+ for (let i = chain.length - 1; i >= 0; i--) {
51
+ const link = chain[i];
52
+ newRhs = factory.updateBinaryExpression(link, link.left, link.operatorToken, newRhs);
53
+ }
54
+ const newStmt = factory.updateExpressionStatement(stmt, newRhs);
41
55
  return { action: 'replace', statement: newStmt };
42
56
  }
43
57
  function isShowcaseDecorator(d, names) {
44
- return ts.isCallExpression(d.expression)
45
- && ts.isIdentifier(d.expression.expression)
46
- && names.has(d.expression.expression.text);
58
+ return (ts.isCallExpression(d.expression) &&
59
+ ts.isIdentifier(d.expression.expression) &&
60
+ names.has(d.expression.expression.text));
47
61
  }
48
62
  function stripNativeDecorators(node, names, factory) {
49
63
  const decorators = ts.getDecorators(node);
@@ -114,7 +128,8 @@ export function createShowcaseStripTransformer() {
114
128
  continue;
115
129
  const decorateResult = tryHandleDecorateStatement(stmt, names, factory);
116
130
  if (decorateResult) {
117
- if (decorateResult.action === 'replace' && decorateResult.statement) {
131
+ if (decorateResult.action === 'replace' &&
132
+ decorateResult.statement) {
118
133
  filtered.push(decorateResult.statement);
119
134
  }
120
135
  continue;
@@ -134,6 +149,21 @@ export function createShowcaseStripTransformer() {
134
149
  };
135
150
  };
136
151
  }
152
+ function findShowcaseLeak(sourceFile, names) {
153
+ let leak;
154
+ function visit(node) {
155
+ if (leak)
156
+ return;
157
+ if (ts.isIdentifier(node) && names.has(node.text)) {
158
+ const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
159
+ leak = { name: node.text, line: line + 1 };
160
+ return;
161
+ }
162
+ ts.forEachChild(node, visit);
163
+ }
164
+ visit(sourceFile);
165
+ return leak;
166
+ }
137
167
  export function stripShowcaseDecorators(source, fileName = 'file.ts') {
138
168
  const sourceFile = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true);
139
169
  const importInfo = findShowcaseImports(sourceFile);
@@ -143,5 +173,12 @@ export function stripShowcaseDecorators(source, fileName = 'file.ts') {
143
173
  const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
144
174
  const output = printer.printFile(result.transformed[0]);
145
175
  result.dispose();
176
+ const audited = ts.createSourceFile(fileName, output, ts.ScriptTarget.Latest, true);
177
+ const leak = findShowcaseLeak(audited, importInfo.localNames);
178
+ if (leak) {
179
+ throw new Error(`[ng-prism] Showcase reference '${leak.name}' left in output after stripping at ${fileName}:${leak.line}. ` +
180
+ `The Showcase import was removed but a reference remains — this would cause a ReferenceError at runtime. ` +
181
+ `This is a transformer bug; please report the input source.`);
182
+ }
146
183
  return output;
147
184
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-prism/core",
3
- "version": "21.9.1",
3
+ "version": "21.10.1",
4
4
  "description": "ng-prism — the Angular-native Storybook alternative. Lightweight component showcase with @Showcase decorator, no story files needed.",
5
5
  "keywords": [
6
6
  "ng-prism",